continue:
//try next Q
// проверяем следующую грань Q
// Р might obscure this Q: see if Q is marked or behind P // грань P может заслонять эту Q: смотрим, маркирована ли Q. // или находится ли она позади Р
1f (Q 1s marked) // Q маркирована {
split Q by plane of P: II разбиваем грань Q плоскостью грани P
mark and insert pieces of Q; II маркируем куски грани Q и заносим их в список
hopeful - 0:
}
else if(Q on opposite side of P's plane ||
P on same side as Q's plane) // грань Q на противоположной стороне плоскости грани Р
13.3. HSR-методы со списками приоритетов
// грань Р на той же стороне, что и плоскость грани Q {
mark Q. pur Q at end of list: II маркируем грань Q. помещаем ее в конец списка hopeful - 0:
}
else
// can't tell: They overlap too much // невозможно ничего сказать: грани перекрываются // слишком сильно {
sp7;'£ Q by plane of P: II разбиваем грань Q плоскостью грани Р
mark and insert pieces of Q; II маркируем куски грани Q и заносим их в список
hopeful - 0:
}
}
// end.. for each Q.. // конец цикла для каждой грани Q if(hopeful)
drawAndRemove(P);
}
// end of for each P
// конец цикла для каждой грани Р
}
Псевдокод этого алгоритма приведен в листинге 13.3, что помогает прояснить поток используемых тестов. Флаг hopeful остается равным 1 до тех пор, пока мы можем надеяться, что текущая грань Р не будет заслонять какую-либо из тех граней Q, с которыми она почти совпадает по г. Эта ситуация для нас желательна, поскольку в этом случае грань Р можно нарисовать и более ее не рассматривать. Если же эта надежда рухнула, что может случиться в силу множества причин, то другие грани Q уже не тестируются, а данная грань или разбивается, или помещается в конец списка.
Рассмотрим группу тестов, используемых для проверки того, может ли грань Р заслонять грань Q. Эти тесты выполняются в порядке возрастания их сложности (времени обработки); и когда любой из них выполнен успешно, то становится точно известным, что грань Р не заслоняет грань Q. Вот эти тесты.
1. Пересекаются ли х-экстенты граней Р и Q (быстрый тест)?