Это должно найти все пересекающиеся сегменты для любого произвольного многоугольника.
Рассмотрим многоугольник как упорядоченную совокупность ребер AB, BC, CD и т. Д., Где «направление» от первой точки каждого ребра кего вторая точка - «по часовой стрелке».То есть, если мы смотрим на точку A, точка B является следующей точкой при движении по часовой стрелке.
Метод состоит в том, чтобы найти ребро многоугольника, который пересекает плоскость, а затем найти следующий отрезок, двигаясьпо часовой стрелке, которая пересекает исходную сторону плоскости.Две точки, где эти сегменты пересекают плоскость, образуют конечные точки для пересекающегося сегмента.Это повторяется до тех пор, пока не будут проверены все ребра многоугольника.
Имейте в виду, что не все сегменты обязательно находятся внутри многоугольника, если он вогнутый.
let P be any point on the polygon.
TOP:
while (P has not been checked)
mark P as having been checked.
let f be the point following P, clockwise.
if (P and f are on opposite sides of the plane) then
Continuing from f clockwise, find the next point Y that is on
the same side of the plane as P.
Let z be the point counter-clockwise from Y.
(note - Sometimes z and f are the same point.)
let S1 be the point where P,f intersects the plane
let S2 be the point where Y,z intersects the plane
if (segment (S1,S2) is inside the polygon)
add (S1,S2) to a 'valid' list.
let P = Y
else
let P = f
endif
else
let P = f
endif
endwhile
Этот алгоритмстоит того, что вы заплатили за это.: -)