Трехмерный просмотр
который рассматривался в разделе «Отсечение линий» главы 3 для отсекателя Кохена-Сазерленда. Если точки А и С располагаются вне одной и той же стороны С W (соответствующие ВС отрицательны), то ребро должно целиком располагаться вне CW. Таким образом, имеет место следующий критерий.
Тривиальный прием. Обе концевые точки лежат внутри CW. (Все 12 ВС положительны).
Тривиальное отклонение. Обе концевые точки лежат вне одной и той же плоскости CW.
Если ни одно из этих условий не выполняется, то нам придется отсекать отрезок АС относительно каждой плоскости отдельно. Как и в случае отсекателя Сайруса-Бека, мы должны отслеживать возможный интервал (candidate interval - CI) (см. рис. 4.43) - отрезок времени, в течение которого ребро может все еще находиться внутри CW. По существу, нам известно и обратное условие: если г находится вне пределов CI, то ребро не находится внутри CW. Отметим, что CI простирается от t - tm до г - fout.
Мы проверяем это ребро поочередно относительно каждой стенки. Если соответствующие граничные коды имеют разные знаки, то ребро пересекается с плоскостью в некоторый момент времени tm, который мы в этом случае вычисляем. Если ребро «входит» в плоскость (то есть движется «внутрь» нее извне) по мере увеличения г, то мы обновляем значение fin - max(old fjn, fhit), поскольку ребро не могло войти в более раннее время, чем thjl. Аналогично, если ребро выходит изнутри плоскости, то мы обновляем rout» min(old fout, thit). Если в какой-то момент времени CI уменьшится до пустого интервала (то есть toM станет больше, чем tin), то ребро будет отсечено целиком и мы будем иметь так называемый «досрочный выход», избавляющий нас от ненужных вычислений.
Нетрудно вычислить момент пересечения ребра с плоскостью. Запишем ребро в параметрической форме в однородных координатах:
edge(0 - (ах + (сх - ax)t, ау + (су - ay)t, аг + (сг - az)t, аа + (си - aw)t).
Например, ребро пересекается с плоскостью х - 1, когда координата л: выражения А + (С- A)t равна 1, то есть: