// true if ray is inside combined object: // true, если луч внутри составного обьекта Существуют и состояния луча между соударениями - то есть до рассмотрения следующего соударения. Начальное значение переменной lftlnside задается в соответствии с тем, входит ли луч в левый объект или выходит из него, то есть в соответствии со значением L[0]. i sEnteri ng. Говоря более конкретно, величина lftlnside равна false, если при первом соударении имеет место вхождение луча (поскольку до этого соударения луч должен быть снаружи), и равна true, если первое соударение - выход. Поэтому можно инициализировать величину 1 ftlnside как !L[0]. isEntering. Аналогично осуществляется инициализация rtlnside. Затем величина comblnside находится как логическая комбинация 1 ftlnside и rtlnside: если оператор - union, то comblnside равна true в том случае, если равны true 1 ftlnside, rtlnside или оба вместе. Это может быть описано при помощи логических операторов
comblnside « lftlnside II rtlnside
Зо Ф. Хилл
Введение в трассировку лучей
Если оператором является intersection, то используется формула
comblnside = lftlnside && rtlnside.
Для оператора difference формула имеет вид
comblnside - lftlnside && Irtlnside.
Далее алгоритм движется по обоим спискам L[] и R[], на каждом шаге фиксируется наименьшее из времен соударения, используемое для обновления значений 1 ftlnside, rtlnside, comblnside. Если в какой-либо точке значение comblnside изменяется, то более позднее событие соударения добавляется в список С[].
Когда список L[] или R[] окажется исчерпанным (то есть когда в нем просмотрено последнее время соударения), то с оставшимся неисчерпанным списком можно проделать следующее: О В случае пересечения неисчерпанный список игнорируется.
О В случае объединения неисчерпанный список просматривается и его события соударения добавляются как обычно.
О В случае разности: если неисчерпанным оказался левый список, то он просматривается, и его события соударения добавляются как обычно. Если же неисчерпанным является правый список, то он игнорируется.