}
if ( col2 > 320 ) col2 = 320;
for (int col = coM; col < co!2; col++ ) {
top = fixed2lnt (t1 ); bottom = fixed2lnt ( b1 ); t1 += dt; b1 += db;
if (topLine [col] > bottomLine [col]) continue;
13. Элементы виртуальной реальност
Компьютерная графика. Полигональные модели
if (top > bottomLine [col] ) top = bottomLine [col];
if (top >= topLine [col]) // draw ceiling
drawVertLine ( col, topLine [col]++, top, CEILING_COLOR );
else // otherwise correct to
top = topLine [col]; // draw only visible part
if ( bottom > bottomLine [col]) bottom = bottomLine [col];
if (top < bottom ) // now draw visible part
{ // of wall
drawVertLine ( col, top, bottom, UPPER_WALL_COLOR );
if ( bottom > topLine [col]) topLine [col] = bottom + 1;
}
else
if (top > topLine [col]) topLine [col] = top + 1;
}
}
Рассмотрим некоторые приемы, позволяющие повысить быстродействие данной программы без переписывания ее на ассемблер. Основная идея заключается в как можно более раннем отбрасывании тех фрагментов сцены (SubSector и Seg), которые заведомо не могут быть видны.
В первую очередь можно воспользоваться тем, что для любого узла дерева в WAD-файле хранится минимальный прямоугольник (ограничивающее тело), полностью содержащий соответствующее поддерево внутри себя (фактически заданы минимальные и максимальные значения х и у) и в процедуре drawNode перед рекурсивным вызовом себя для обработки поддерева, и проверить, находится ли это поддерево (его ограничивающий прямоугольник) внутри области видимости (угла с вершиной в положении наблюдателя и биссектрисой, совпадающей с направлением взгляда наблюдателя). Если поддерево с областью видимости общих точек не имеет, то его можно сразу же отбросить.
Существуют разные методы проверки того, попадает ли прямоугольник в заданный угол. Мы воспользуемся самым простым из них - проведем через позицию наблюдателя прямые, параллельные координатным осям. Они разобьют всю плоскость на 4 части.
Дальше проверим, в какие части попадает область видимости и попадает ли в эти части заданный прямоугольник. Так прямоугольники А и D на рис. 13.22 сразу же отбрасываются, прямоугольник В действительно попадает в рассматриваемую область, а прямоугольник С остается, хотя в область видимости и не попадает.