bool edgeTest(EdgeS Е. Face& F): которая проверяет ребро £ относительно грани Fh возвращает true тогда и только тогда, когда есть «выжившие» ребра. Эта подпрограмма устанавливает Е равным первому выжившему ребру, а остальные выжившие ребра помещает в список ребер.
Эти соображения приводят нас к алгоритму, скелет которого приведен в листинге 13.7.
Листинг 13.7. Скелет HLR-алгоритма void drawVisiЫeEdges(FaceL1st faces) {
EdgeList edges: // the edge list // список ребер
build the edge list of all potentially visible edges II создаем список ребер из всех потенциально видимых ребер
whileiedges is not empty) II edges не пустой список {
Edge E - getNext(edges); // remove the next edge // удаляем следующее ребро
bool isVis - true; // suppose it's visible // предполагаем его видимым
for(F - E.nextFace: isVis && F !- NULL: F is next face) II следующая грань F
{
if(f belongs to F) continue:
// E принадлежит F // no need to test this face // эту грань тестировать не нужно
isVis - edgeTest(E.F); // put survivors on edge list // заносим выжившие ребра в список ребер }
if (isVis) E.drawO; // Е is visible: draw it III- видимое ребро: рисуем его }
}
Удаление невидимых поверхностей
Практические упражнения
13.6.1. Ручная имитация НЬЯ
Для объектов, изображенных на рис. 13.17, пометьте каждую лицевую грань и каждое ребро, которое принадлежит хотя бы одной лицевой грани. Составьте список лицевых граней, которые закрывают каждую нелицевую грань. Покажите, что произойдет с каждым ребром при его отсечении всеми лицевыми гранями.
13.6.2. Ситуация сортировки списка граней Для какого типа сцен особенно полезно предварительно отсортировать список граней? Состоит ли такая сцена из многих граней или из немногих? Что можно сказать о гранях, имеющих много сторон? Нарисуйте несколько примеров, для которых предварительная сортировка оправдывает себя, и несколько таких, для которых - нет.
13.6.3. Ручная имитация Для объектов с рис. 13.17 проделайте вручную алгоритм из листинга 13.7. Нарисуйте соответствующие списки граней и ребер и покажите состояние этих списков в момент, когда ребро е3 только что отсечено ближайшей к глазу гранью.