
РАСТРОВЫЕ АЛГОРИТМЫ
97
(для луча с начальной точкой, лежащей вне сферы),
220*
drtt −+=
(для луча с начальной точкой, лежащей внутри сферы) (рис. 6).
Различие в последних двух формулах объясняется просто: в каждом из этих случаев
требуется вычислить разные точки.
Луч, начальная точка которого лежит вне сферы и который протыкает сферу (протыкает,
а не касается ее), имеет с этой сферой две различные точки пересечения. Поэтому в этом
случае требуется найти ту точку пересечения, которая находится от начальной точки луча на
меньшем расстоянии и отвечает меньшему значению параметра t.
Если же начальная точка луча лежит внутри сферы, то искомая точка пересечения
отвечает большему значению параметра t.
Перечислим последовательные шаги описанного алгоритма:
шаг 1й найти квадрат расстояния между начальной точкой луча и центром сферы,
шаг 2й вычислить квадрат кратчайшего расстояния между лучом и центром сферы,
шаг 3й выяснить, лежит ли луч вне сферы,
шаг 4й найти разность между квадратом радиуса сферы и квадратом кратчайшего
расстояния,
шаг 5й выяснить, не является ли это число отрицательным,
шаг 6й вычислить расстояние до ближайшей точки пересечения луча со сферой,
шаг 7й найти точку пересечения луча со сферой,
шаг 8й вычислить единичный вектор нормали сферы в этой точке
и укажем характер и количество операций на каждом шаге (в предположении, что
некоторые из величин вычислены предварительно):
шаг 1й 5 сложений или вычитаний и 3 умножения,
шаг 2й 2 сложения и 3 умножения,
шаг 3й 2 сравнения (1, если начальная точка находится внутри сферы),
шаг 4й 2 сложения или вычитания и 1 умножение,
шаг 5й 1 сравнение (ни одного, если начальная точка находится внутри сферы),
шаг 6й 1 сложение и 1 извлечение квадратного корня,
шаг 7й 3 сложения и 3 умножения, шаг
8й 3 вычитания и 3 умножения.
Таким образом, предложенный алгоритм отыскания точки пересечения заданного луча
и заданной сферы и вычисления единичного
вектора нормали сферы в этой точке требует самое большее 16 сложений или
вычитаний, 13 умножений, 1 извлечения квадратного корня и 3 сравнений.
Замечание
Пользователь вправе выбирать тот из описанных выше способов, который кажется ему более
простым и естественным, или придумать новый.
2. Пересечение луча с плоскостью
Пусть плоскость задана общим уравнением
ax + by + cz + d=0,
где N = (a, b, c) нормальный вектор плоскости. В случае, когда вектор N единичный, a
2
+ b
2
+c
2
= 1, d с точностью до знака равно расстоянию от начала координат (0, 0, 0) до
рассматриваемой плоскости. Заменяя в уравнении плоскости величины x, y и z их
выражениями (*), получаем линейное уравнение относительно t:
()( )( )
,0
000
++++++ dntzcmtybltxa
разрешая которое, находим, что