Алгоритм для определения точек пересечения луча со сферой

Алгоритм для определения точек пересечения луча с произвольным параллелепипедом.

Пересечение луча с прямоугольным параллелепипедом.

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

Например, вершинами (x_, y_, z_), (x+, y+, z+).

Рассмотрим луч, исходящий из точки (x0, y0, z0) в направлении вектора

(l, m, n), где l2 + m2 + n2 =1, и опишем алгоритм, посредством которого можно определить, пересекает ли этот луч заданный прямоугольный параллелепипед или нет.

Возьмем пару плоскостей, параллельных плоскости yz: x = x_ и x = x+

При l =0 заданный луч параллелен этим плоскостям и, если x0 < x+ или x0 > x+, то он не пересекает рассматриваемый прямоугольный параллелепипед. Если же l не равно 0, то вычисляем отношения

t1x = (x_ - x0)/l, t2x = (x+ - x0)/l.

Можно считать, что найденные величины связаны неравенством t1x < t2x.

Пусть tn = t1x, tf = t2x

Считая, что m¹0, и рассматривая вторую пару плоскостей, несущих грани заданного параллелепипеда, y = y_ и y = y+, находим величины

t1y = (y_ - y0)/m, t2y = (y+ - y0)/m.

Если t1y > tn, тогда пусть tn = t1y.

Если t2y < tf, тогда пусть tf = t2y.

При tn > tf или при tf < 0 заданный луч проходит мимо прямоугольного параллелепипеда.

Считая n¹0, рассматриваем последнюю пару плоскостей z = z_ и z = z+, находим величины t1z = (z_ - z0)/n, t2z = (z+ - z0)/n и повторяем предыдущие сравнения.

Если в итоге всех проведенных операций мы получим, что 0 < tn < tf или

0 < tf, то заданный луч непременно пересечет исходный параллелепипед со сторонами, параллельными координатным осям.

Если луч протыкает прямоугольный параллелепипед (т.е. начальная точка лежит вне параллелепипеда), то расстояние от начала луча до точки его входа в параллелепипед равно tn, а до точки выхода луча из параллелепипеда tf.


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



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