![]() |
|
||||||||||
|
|||||
|
Вообщем у тебя два выхода:
1 простой и не понятный см. пост №5. Я плохо пояснил. Суть в том что луч соединяющий точку и вершину не может пересекать ни одну из сторон треугольника. Исключая вершины. Для этого тебе нуно написать функцию для определения пересечения двух отрезков по координатам их ограничивающих точек (кстати не тривиальная задача) 2. Понятный, но сложный: Точка принадлежит выпуклой фигуре в том случае если каждая проекция точки на каждую сторону фигуры, лежит между вершинами принадлижащими этой стороне. Для этого нужно строить перпендикуляры. Кстати у INils'а без перпендикуляров то же не обойтись. Последний раз редактировалось miramax; 21.09.2006 в 15:03. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
|
|
|||||
|
а чем вас не устраивает метод scourge ' kangaroo?
__________________
С моих слов записано верно. Мною прочитано.
|
|
|||||
|
Цитата:
эта формула не сработает если представить себе маленький треугольничек от которого оттащили мышку на километр |
|
|||||
|
[1.3 07.09.2006]
[3 28.09.2006] [+1 04.10.2006] |
наверное было бы логично предположить, что я переделал код...
aX = 120; aY = 100;
bX = 100; bY = 130;
cX = 140; cY = 130;
function onEnterFrame(){
_root.clear()
getlocation(aX, aY, bX, bY, cX, cY, _xmouse, _ymouse)
}
// Проверяем, принадлежит ли точка треугольнику
function getlocation(aX, aY, bX, bY, cX, cY, fX, fY){
// Находим площадь главного треугольника
s0 = getsquare(aX, aY, bX, bY, cX, cY)
// Соединяем вершины треугольника с точкой и находим площади маленьких треугольников
s1 = getsquare(fX, fY, aX, aY, bX, bY)
s2 = getsquare(fX, fY, aX, aY, cX, cY)
s3 = getsquare(fX, fY, bX, bY, cX, cY)
// Принадлежит?
if(Math.round(s0) == Math.round((s1+s2+s3))){
_root.beginFill(0x6794A7);
}else{
_root.beginFill(0x000000);
}
_root.lineStyle(0, 0xFFFFFF);
_root.moveTo(aX,aY);
_root.lineTo(bX,bY);
_root.lineTo(cX,cY);
_root.lineTo(aX,aY);
}
// Узнаём площадь треугольника
function getsquare(aX, aY, bX, bY, cX, cY){
// 1. Находим длины сторон
aD = getlength(aX, aY, bX, bY)
bD = getlength(bX, bY, cX, cY)
cD = getlength(cX, cY, aX, aY)
// 2. Находим полупериметр
p = (aD + bD + cD)/2
// 3. Находим площадь
S = Math.sqrt(p * (p - aD) * (p - bD) * (p - cD))
return(S)
}
function getlength(aX, aY, bX, bY){
xd = aX - bX
yd = aY - bY
return(Math.sqrt(xd*xd+yd*yd));
}
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Вроде все верно...
Только надо добавить проверку на порядок обхода, то есть точка в треугольник если у каждой линии false либо у всех true. Последний раз редактировалось iNils; 21.09.2006 в 16:13. |
|
|||||
|
Регистрация: Sep 2006
Сообщений: 32
|
//px,py- координаты точки
//ax,ay,bx,by,cx,cy -треугольник abc
_hitTest = function (px, py, ax, ay, bx, by, cx, cy) {
var ab=(px-bx)*(ay-by)+(py-by)*(bx-ax)
var bc=(px-cx)*(by-cy)+(py-cy)*(cx-bx)
var ca=(px-ax)*(cy-ay)+(py-ay)*(ax-cx)
if ((ab<0 && bc<0 && ca<0)||(ab>0 && bc>0 && ca>0)) {
return true;
} else {
return false;
}
};
|
|
|||||
|
вроде работает
__________________
С моих слов записано верно. Мною прочитано.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 06:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|