Листинг 14.17. Скелет метода hit() для пересечения с Булевым объектом

bool IntersectionBool : : hitCRay Sr. Intersection Sinter) {

Intersection 1ftlnter. rtlnter: if(ray misses the extents) return false: // луч проходит мимо экстентов

if((!left->hit(r.lftlnter))||(!right->hit(r.rtlnter))) return false:
// early out

// досрочный выход

make the combined list: place it in inter II создаем составной список и помещаем его в inter

return(inter.numHits > 0): // true if inter is not empty // true, если inter не пуст }

Для классов Uni onBool и DifferenceBool код аналогичен данному. В методе Uni onBool :: hitO дваспис-ка соударений формируются с использованием оператора

if (( Heft->hit(r.lftlnter))&&(!right->hit(r. rtlnter))) return false:

в котором предусмотрен досрочный выход только в случае, если пусты оба списка соударений. Для метода DifferenceBool :: hit() используется код:

if((!left->hit(r.lftlnter)) return false: // a miss

// прохождение мимо

if(!right->hit(r.rtlnter))
{
inter = lftlnter: return true;
}

В этом коде досрочный выход происходит в случае, если луч проходит мимо левого поддерева, поскольку тогда он проходит и мимо всего объекта. Если же имеются соударения с левым поддеревом, но не имеются с правым, то окончательный список будет таким же, как и для левого поддерева. (Почему?)

Компоновка t-списков Компоновка t-списков является сложной, но логичной операцией. Рассмотрим приведенные на рис. 14.62, а два примера списков соударений L и R (соответственно для левого и правого поддеревьев). Назовем для краткости левый список L[] вместо leftInter.theHit[]; аналогично для правого списка. С этой же целью не показаны поля hitObject и surface. Список L фиксирует для своего объекта восемь соударений, а список R - пять. В каждом списке содержатся положительные моменты соударения, упорядоченные по времени, причем входное поле нулевого элемента показывает, что делает луч при первом соударении: входит в объект или выходит из него (его время положительно, то есть объект находится «перед глазом»). Поскольку все объекты объемные, значения entering после нулевого элемента чередуются.


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