Если же нам встретилась такая грань Q, которую грань Р может заслонить, то мы продолжаем работать с гранью Q. Во-первых, мы смотрим, не «маркирована» ли она как «ранее перемещенная». (Как мы

Удаление невидимых поверхностей

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

Если грань Q маркирована таким образом, то мы ее дальше не тестируем: мы просто разбиваем грань Q плоскостью грани Р и заносим образовавшиеся куски в правую часть списка (в соответствии с extent .far).

Если грань не маркирована, то мы проверяем, может ли грань Q заслонять грань Р. Если не может, то грань Q вероятно, находится позади грани Р и поэтому является кандидатом на рисование в следующий раз. Поэтому мы помещаем ее в конец списка и, конечно, маркируем ее как перемещенную; и именно с этой грани мы начнем следующую проверку. Если же этот тест не дает гарантии, что грань Q не может заслонить грань Р, то это свидетельствует о том, что грани Р и Q безнадежно «переплетены» друг с другом геометрически; поэтому мы разбиваем грань Q плоскостью грани Р и снова заносим образовавшиеся куски в список.

Листинг 13.3. Подпрограмма сортировки по глубине (псевдокод)

void depthSortCFace faces[]) {

for(P - last face in list: 11st not empty: P - next face in list) // P - последняя грань в списке: список не пуст: // Р - следующая грань в списке

{

hopeful - 1: // have definite action to take // действуем в определенном направлении

for((each Q overlapping P in z) && hopeful - 1) // каждая грань Q. близкая с P no z {

if( (x-extents of P and Q are disjoint)
||(y-extents of P and Q are disjoint)
||(P 1s on opposite side of Q's plane)
||(Q is on the same side of P's plane)

11(the projected faces P and Q don't overlap)) // х-экстенты P и Q не пересекаются // у-экстенты P и Q не пересекаются // Р на противоположной стороне плоскости Q // Q на той же стороне плоскости Р // проекции граней Р и Q не перекрываются


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