Начнем с конечных полигонов.
Чтобы пересечь многоугольник, линия должна пересекать один из его ребер. Пересечение между линией и ребром возможно только в том случае, если две точки лежат по разные стороны от линии.
Это может быть легко проверено с помощью sign(cross_product(Ep-Lp,Ld))
для двух точек края. Ep
- краевая точка, Lp
- некоторая точка на линии, Ld
- вектор направления линии, cross_product(A,B)=Ax*By-Ay*Bx
.
Для решения бесконечных многоугольников мы можем ввести «бесконечные точки». Если у нас есть половина бесконечного края с точкой E1
и направлением Ed
, ее «вторая точка» - это что-то вроде E1+infinity*Ed
, где infinity
«достаточно большое число».
Для «бесконечных точек» проверка будет немного отличаться: cross_product(Ep-Lp,Ld)= =cross_product(E1+infinity*Ed-Lp,Ld)= =cross_product(E1-Lp+infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+cross_product(infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+infinity*cross_product(Ed,Ld)
Если cross_product(Ed,Ld)
равен нулю (линия параллельно краю), знак будет определяться первым компонентом. В противном случае второй компонент будет доминировать и определять знак.
Ну не совсем верно? Диаграмма слева имеет тот же знак для точечного произведения всех вершин с нормалью, но он пересекает многогранник. – elexhobby
@elexhobby. Спасибо - совершенно верно; Я имел это в виду, а затем забыл включить его. См. Править. – Keith