C.z = A.z + tOut * (C.z - A.z):
C.w = A.w + tOut * (C.w - A.w):

продолжение &

Трехмерный просмотр

Листинг 7.4 (продолжение)

A =tmp:

// now update А

// теперь обновляем А

return 1;
// some of the edge lies inside the CVV

// часть ребра лежит внутри CVV

}

Подпрограмма c1ipEdge(Point4& A, Point4& С) принимает две точки в однородных координатах (с полями х, у, z, w) и возвращает 0, если ни одна часть отрезка АС не располагается в CVV, и 1 в противном случае. Она также изменяет значения А и С так, что по окончании работы подпрограммы они становятся концевыми точками отсеченного ребра.

Эта подпрограмма находит шесть граничных координат для каждой концевой точки и записывает их в массивы аВС[] и сВС[]. Для большей эсрфективности она также создает для каждой точки выходной код (outcode), в котором хранятся знаки всех шести граничных кодов этой точки. В i-м бите выходного кода точки А находится 0, если aBC[i] > 0 (то есть А - внутри i-й стенки), и 1 в противном случае. Ситуация тривиального приема возникает, когда оба выходных кода - aOutcode и cOutcode - равны нулю. Тривиальное отклонение возникает тогда, когда побитовое произведение AND обоих выходных кодов не равно нулю.

В цикле проверки ребра относительно каждой плоскости может быть не более одной отрицательной граничной координаты ВС. (Почему?) Если точка А имеет отрицательную ВС, то ребро в точке соударения должно входить в плоскость; если отрицательная ВС имеется у точки С, то ребро в точке соударения должно выходить. (Почему?) (Блинн использует несколько более быстрый метод проверки с помощью введения маски, тестирующей один бит выходного кода.) Каждый раз значения tin или tOut обновляются, а в случае, когда tin становится больше, чем tOut, происходит досрочный выход.

После проверки всех плоскостей одно или оба значения tin и tOut оказываются измененными. (Почему?) Точка А обновляется на А + (i - A) tin, если было изменено значение tin, а точка С обновляется на А + (С - A) tOut, если было изменено значение tOut.


⇐ Предыдущая| |Следующая ⇒