Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Точка в треугольнике (2 стр)

Точка в треугольнике (2 стр)

Страницы: 1 2 3 Следующая »
AutПостоялецwww4 мая 200615:21#15
doc.
Чей метод: твой или Lion007?
Lion007Постоялецwww4 мая 200615:37#16
Aut
doc.а, мой только для треугольников...
WebErrAtorНовичокwww4 мая 200617:12#17
doc.
Вообще-то для подсчёта векторного произведения в 3D нужно считать определители алгебраических дополнений.
То есть 2х2 для каждой координаты! 8Р
doc.Постоялецwww4 мая 200618:03#18
Aut
>Чей метод: твой или Lion007?
Который я предложил.

WebErrAtor
>Вообще-то для подсчёта векторного произведения в 3D нужно считать определители алгебраических дополнений.
Что, в совокупности, является определитемем 3x3, да и определение векторного произведения обычно записывается в форме:

     | i   j   k |
AxB =|Ax  Ay  Az |
     |Bx  By  Bz |
z0mbieНовичокwww4 мая 200618:31#19
Этот метод зависит от обхода вершин выпуклого многоугольника?
doc.Постоялецwww4 мая 200619:26#20
z0mbie
>Этот метод зависит от обхода вершин выпуклого многоугольника?
Нет, т.к. проверяются оба варианта направлености(оператор OR), разве, что разные стороны будут направлены в разные стороны но это уже изврат и в таком случае, разумеется, работать небудет.
Если потребовать, чтоб числа N1, N2... и т.д. были определенного знака то да, будет зависеть от направления обхода.
8Observer8Постоялецwww8 мар. 201811:14#21
doc.
> A,B,C - точки треугольника, P - точка
>
> N1 = (By-Ay)*(Px-Ax) - (Bx-Ax)*(Py-Ay);
> N2 = (Cy-By)*(Px-Bx) - (Cx-Bx)*(Py-By);
> N3 = (Ay-Cy)*(Px-Cx) - (Ax-Cx)*(Py-Cy);
>
> Result = ((N1>0) and (N2>0)  and (N3>0)) or ((N1<0) and (N2<0) and (N3<0));
doc.
> метод годится нетолько для треугольника но и для любого выпуклого
> многоугольника, только добавятся соответствующие N4, N5 и т.д.
Хотел найти математическое объяснение данного метода попадания точки в N-угольник, но не знаю, как правильно он называется
AslanПостоялецwww8 мар. 201812:56#22
8Observer8
S(AOB)>0, S(BOC), S(AOB)+S(BOC)<S(ABC)
для выпуклого N-угольника пройтись по N-2 треугольникам
8Observer8Постоялецwww8 мар. 201813:29#23
Я так понимаю, что вывод этих формул связан с определителями, векторным или скалярным произведением. В универе у нас был курс по линейной алгебре, но я не помню ничего подобного. В общем, помогите сформировать запрос для гугла, либо у вас есть хорошие ссылки в закладках. Хотело бы понять откуда у этих формул ноги растут и откуда начать танцевать.

Правка: 8 мар. 2018 13:32

AslanПостоялецwww8 мар. 201814:47#24
8Observer8
a.x*b.y-a.y*b.x
знаковая площадь треугольника на векторах a,b
если O внутри ABC то S(AOB)>0, S(BOC), S(AOB)+S(BOC)<S(ABC)
(может быть косяк со знаком изз-за порядка векторов, для гарантии проверять одинаковость знака и срав abs)
Линейная алгебра - 1й курс, в gamedev необходимо знать основы
snake32Постоялецwww14 мар. 201819:24#25
Aslan
> a.x*b.y-a.y*b.x
> знаковая площадь [b]треугольника[/b] на векторах a,b
Параллелограмма!
Aslan
>в gamedev необходимо знать основы
]:->
AslanПостоялецwww14 мар. 201820:12#26
snake32
> Параллелограмма!
2х треугольников, 2 сокращается в выражении
> ]:->
неужели думаешь я этого незнаю?
ты как училка, придирающаяся к расстановке запятых

Правка: 14 мар. 2018 20:38

8Observer8Постоялецwww14 мар. 201820:44#27
doc.
> A,B,C - точки треугольника, P - точка
>
> N1 = (By-Ay)*(Px-Ax) - (Bx-Ax)*(Py-Ay);
> N2 = (Cy-By)*(Px-Bx) - (Cx-Bx)*(Py-By);
> N3 = (Ay-Cy)*(Px-Cx) - (Ax-Cx)*(Py-Cy);
>
> Result = ((N1>0) and (N2>0) and (N3>0)) or ((N1<0) and (N2<0) and (N3<0));
doc.
> метод годится нетолько для треугольника но и для любого выпуклого
> многоугольника, только добавятся соответствующие N4, N5 и т.д.
Этот алгоритм попадания точки в треугольник работает. Я написал его реализацию на JavaScript + CanvasAPI. Кликом левой кнопкой мыши добавляется объект, кликом правой кнопки мыши объекты удаляются. Демка + исходники: https://plnkr.co/edit/w13ENpnYGsDAdtVBw8aI?p=preview

Правка: 15 мар. 2018 8:28

SalamandrПостоялецwww15 мар. 20180:56#28
Ещё есть один способ, сумма углов в треугольнике ВСЕГДА равна 180 градусам.
SuslikМодераторwww15 мар. 20183:25#29
для 3д можно так:
bool is_inside
for(int i = 0; i < 3; i++)
{
  is_inside = is_inside && (dot(cross(p[(i + 1) % 3] - p[i], n), point - p[i]) > 0.0f);
}
здесь на самом деле проверяется попадание точки point в бесконечную призму, на рёбрах которой лежат точки p[ i ] с образующей n. в случае n = cross(p[2] - p[0], p[1] - p[0]) и гарантии, что point лежит в той же плоскости, что и точки, формула возвращает принадлежность точки треугольнику. с точностью до знака — лень думать, должно быть > 0.0f или < 0.0f.

Правка: 15 мар. 2018 3:25

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр