Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   принадлежит ли точка треугольнику (http://www.flasher.ru/forum/showthread.php?t=85390)

scourge ' kangaroo 21.09.2006 12:40

принадлежит ли точка треугольнику
 
нужно узнать, принадлежит ли точка треугольнику.
написал код, он он работает не точно. т.е. функция не возвращает истину, когда точка рядом со стороной треугольника.
Подскажите пожалуйста, в чём ошибка...

Код:

aX = 120; aY = 100;
bX = 100; bY = 130;
cX = 140; cY = 130;

_root.lineStyle(0, 0xFFFFFF);
_root.moveTo(aX,aY);
_root.lineTo(bX,bY);
_root.lineTo(cX,cY);
_root.lineTo(aX,aY);

function onEnterFrame(){
hitTest(aX, aY, bX, bY, cX, cY, _xmouse, _ymouse)
}

// Проверяем, принадлежит ли точка треугольнику
function hitTest(aX, aY, bX, bY, cX, cY, fX, fY){
// Находим площадь главного треугольника
s0 = square(aX, aY, bX, bY, cX, cY)
// Соединяем вершины треугольника с точкой и находим площади маленьких треугольников
s1 = square(fX, fY, aX, aY, bX, bY)
s2 = square(fX, fY, aX, aY, cX, cY)
s3 = square(fX, fY, bX, bY, cX, cY)
// Принадлежит?
if(s0 >= (s1+s2+s3))trace("курсор в треугольнике!")
}

// Узнаём площадь треугольника
function square(aX, aY, bX, bY, cX, cY){
// 1. Находим длины сторон
aD = Math.abs(aX - bX) + Math.abs(aY - bY)
bD = Math.abs(bX - cX) + Math.abs(bY - cY)
cD = Math.abs(cX - aX) + Math.abs(cY - aY)
// 2. Находим полупериметр
p = (aD + bD + cD)/2
// 3. Находим площадь
S = Math.sqrt(p * (p - aD) * (p - bD) * (p - cD))
return(S)
}


etc 21.09.2006 13:10

А зачем ты переопределяешь hitTest?

scourge ' kangaroo 21.09.2006 13:12

т.е.?

whiteRed 21.09.2006 13:33

интересно ты длины сторон вычисляешь

miramax 21.09.2006 13:39

Цитата:

Сообщение от scourge ' kangaroo
нужно узнать, принадлежит ли точка треугольнику.
написал код, он он работает не точно. т.е. функция не возвращает истину, когда точка рядом со стороной треугольника.
Подскажите пожалуйста, в чём ошибка...

Алгоритм у тебя оригинальный, но не верный.
Могу подсказать, код писать долго придётся скажу сразу Сейчас вот, нарисовал треугольник и теоремку придумал :)
"Если точка принадлежит треугольнику, то все лучи соединяющие точку и проходящие через вершины треугольника, пересекают только две прямые , которым принадлежат стороны треугольника, из трёх. Причём точка пересечения лежит в точке пересечения этих дву прямых. Короче вершина там и две прямые с лучом из точки пересекаются. Если луч ,кроме одной вершины треугольника, пересекает ещё хотя бы одну прямую, которой принадлежит любая сторона треугольника или другую вершину. Тогда точка лежит вне треугольника."
Помоему через углы можно решить ещё. А ещё через стороны. Ведь с данными сторонами существует лишь один 1 треугольник :)
З.Ы. - это применимо ТОЛЬКО к треугольнику

etc 21.09.2006 14:18

Цитата:

Сообщение от scourge ' kangaroo
т.е.?

hitTest — метод MovieClip. Ты его переопределяешь. Назови функцию по-другому.

iNils 21.09.2006 14:19

Точка пренадлежит треугольнику, если она лежит слева от всех векторов составляющих этот треугольник (при соответствующем обходе его)

scourge ' kangaroo 21.09.2006 14:49

всем спасибо за помомощь! (:

Цитата:

Сообщение от whiteRed
интересно ты длины сторон вычисляешь

проверил, ошибка именно в этом...
подскажите, как узнать длину отрезка зная его точки?

etc 21.09.2006 14:52

Цитата:

Сообщение от scourge ' kangaroo
подскажите, как узнать длину отрезка зная его точки?

Код:

xd = x1-x2;
yd = y1-y2;
l = Math.sqrt(xd*xd+yd*yd);

5-ый класс.

scourge ' kangaroo 21.09.2006 14:56

спасибо! Теперь всё как часы работает...
в школе я двоечником был...


Часовой пояс GMT +4, время: 10:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.