В данном случае задача разбивается на две

1) нахождение пересечения луча с плоскостью, в которой лежит многоугольник.

2) Проверка принадлежности точки пересечения многоугольнику.

1)Пусть плоскость задана общим уравнением

Ax+By+Cz+D=0

Где N=(A, B,C) -нормальный вектор плоскости.

Заменяя в уравнении плоскости величины x,y и z их выражениями (*),

Получаем линейное уравнение относительно t:

Разрешая которое, находим, что

Если a=Al+Bm+Cn обращается в нуль, a=Al+Bm+Cn=0, то луч параллелен плоскости, и, следовательно, не пересекает ее.

В случае t*<0 луч не пересекает плоскости.

Если t*>0 то координаты точки пересечения вычисляются по формулам

2) Решение основано на нахождении пересечения с треугольником. Если у многоугольника n вершин (n>3), то он будет представляться как набор из n-2 треугольников. N — вектор нормали к плоскости, в которой лежит рассматриваемый многоугольник. Точка Р задается как

(4)

Точка Р будет внутри треугольника

если а>=0, b>=0, и a + b<= 1

В равенство (4) состоит из 3 равенств:

(5)

Решение существует и единственно. Чтобы упростить данную систему, можно спроектировать многоугольник на одну из координатных плоскостей.

В качестве направления проектирования рекомендуется брать ту ось, которой соответствует наибольшая координата у нормали.

Пусть

Пусть (u,v) координаты вектора в плоскости, на которую был спроектирован многоугольник. Тогда векторы будут иметь следующие координаты:

Система (5) упроститься до системы:

Решением являются:

2*) Выпуклый n-угольник однозначно задается набором своих вершин

Будем считать, что вершины многоугольника занумерованы так, что соседние по номеру вершины примыкают к одной стороне. Обозначим через (x*,y*,z*) точку пересечения заданного луча с плоскостью Ax+By+Cz+D=0, в которой лежит рассматриваемый многоугольник.

Вследствие того, что нормальный вектор N=(A, B,C) плоскости, несущей заданный многоугольник, отличен от нуля, этот n-угольник можно взаимно однозначно спроектировать на n-угольник, лежащий в одной из координатных плоскостей. В качестве направления проектирования рекомендуется брать ту ось, которой соответствует наибольшая координата у нормали.

Предположим для определенности, что C =Max(A, B,C).

Тогда в качестве такой плоскости можно взять координатную плоскость xy, а в качестве направления проектирования – ось аппликат (ось Z).

Легко видеть, что координаты вершин n-угольника, получающегося в результате такого проектирования, будут иметь вид

Координаты точки, получающейся в результате проектирования на плоскость xy точки (x*,y*,z*) будут соответственно (x*, y*).

Ясно, что если точка (x*, y*) лежит вне (внутри) n-угольника, получившегося на плоскости xy,то исходная точка (x*,y*,z*) будет внешней (внутренней) по отношению к исходному n-угольнику.

Для определения положения точки (x*, y*) относительно выпуклого n-угольника, лежащего на плоскости xy, можно поступить, например, следующим образом.

Передвинем n-угольник

в плоскости xy так, чтобы точка (x*, y*) попала в начало координат.

В новой координатной системе абсциссы и ординаты вершин n-угольника будут соответственно

Теперь остается выяснить, будет (или не будет) точка (0,0), в которую преобразуется точка (x*, y*), внутренней точкой n-угольника с вершинами

Возможны два случая.

I Абсциссы всех вершин n-угольника – одного знака.

Это означает, что рассматриваемая точка лежит вне n-угольника.

II Есть два ребра n-угольника с вершинами

соответственно (i < j), такие, что

Если

то интересующая нас точка лежит внутри n-угольника.

Это означает, что точка (x*, y*,z*) лежит внутри исходного n-угольника.

Если же последнее произведение положительно, то точка (x*, y*,z*) лежит вне исходного n-угольника.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: