if(tHit < tOut) tOut - tHit: // take smaller t // берем меньшее t }
else
// denom is 0: ray is parallel
// denom (знаменатель) равен нулю: луч параллелен
if(numer <= 0) return 0: // missed the line // прошел мимо прямой
return 1; // CI is still non-empty // возможный интервал по-прежнему не пуст
}
Подпрограмма chopCI () приведена в листинге 4.4. Для вычисления момента соударения луча с ограничивающей прямой в ней используются numer и denom из уравнения (4.65), а уравнение (4.64) используется для определения того, входит луч в полигон или выходит из него. Подпрограмма «отсекает» ту часть возможного интервала CI, про которую выяснено, что она находится вне полигона.
Если луч параллелен прямой, то он может целиком располагаться или во внутреннем полупространстве этой прямой, или целиком во внешнем полупространстве. Из этого следует, что numer = п(В - А) является именно той величиной, которая определяет, какой из этих случаев имеет место (см. упражнения ниже).
Трехмерный случай. Отсечение прямой границами выпуклого многогранника Алгоритм отсечения Сайруса-Бека работает в трех измерениях точно так же, как и в двух. В трехмерном случае ребрами окна становятся плоскости, ограничивающие выпуклый многогранник, а отрезок прямой при этом висит в пространстве. В подпрограмме ChopCI () не требуется вообще никаких изменений (поскольку она использует только значения скалярных произведений через переменные numer и denom). Типы данных в подпрограмме CyrusBeckClipO должны быть, конечно, расширены до трехмерных типов, а при задании концевых точек прямой необходимо задавать дополнительно г-компонент.
Векторные инструменты для графики
Практические упражнения
4.8.1. Типы данных для переменных в отсекателе Сайруса-Бека Дайте подходящие определения для типов данных, таких как структуры или классы, для переменных ипеЗесрепт., LineL^st и \/ест.ог2, используемых в алгоритме отсечения Сайруса-Бека.
4.8.2. Что делает питег<=0?
Нарисуйте эскизы векторов, связанных со значениями питег в подпрограмме спорСЮ, и покажите, что когда луч А + сг движется параллельно ограничивающей прямой п (Р - В) = 0, то он располагается целиком во внутреннем полупространстве этой прямой тогда и только тогда, когда питег > 0.