Возможное упорядочение границ отсекающих окон, соответствующих двоичным разрядам кода области Коэна-Сазерленда

Рис. 6.12. Возможное упорядочение границ отсекающих окон, соответствующих двоичным разрядам кода области Коэна-Сазерленда

Девять двоичных кодов области, идентифицирующих положение конечной точки относительно границ отсекающего окна ющего окна, присваивается код области 0101, а код области любой конечной точки, находящейся внутри отсекающего окна, - 0000.

Рис. 6.13. Девять двоичных кодов области, идентифицирующих положение конечной точки относительно границ отсекающего окна ющего окна, присваивается код области 0101, а код области любой конечной точки, находящейся внутри отсекающего окна, - 0000.

После того как коды областей для всех конечных точек будут определены, можно быстро выявить, какие линии полностью лежат внутри окна, а какие очевидно лежат снаружи. Конечные точки всех линий, которые целиком вмещаются в окно, имеют , юд области 0000, и эти отрезки записываются. Любая линия, конечные точки которой имеют 1 в одинаковых разрядах кода области, лежит полностью за пределами окна, и этот отрезок удаляется. Например, линия, одна конечная точка которой имеет код области 1001, а другая - 0101, целиком находится слева от отсекающего окна, что видно по значению 1 в первом разряде обоих кодов области.

Линии, проходящие из одной области отсекающего окна в другую, могут пересекать окно или пересекать одну или несколько границ отсечения, не входя в окно

Рис. 6.14. Линии, проходящие из одной области отсекающего окна в другую, могут пересекать окно или пересекать одну или несколько границ отсечения, не входя в окно Проверки “внутри-снаружи” можно выполнять с использованием логических операторов. Если значение операции ИЛИ, примененной к двум кодам конечных точек, - false (0000), отрезок находится внутри отсекающего окна. Следовательно, данная линия записывается для отображения, и проверяется следующая линия в описании сцены. Если результат операции И, примененной к двум кодам конечных точек, - true (не 0000), линия полностью лежит вне отсекающего окна, и ее можно исключить из описания сцены.

Линии, которые с помощью проверок кодов области нельзя однозначно отнести к полностью внешним или полностью внутренним, далее проверяются на предмет пересечения с границами окон. Как показано на рис. 6.14, отрезки могут пересекать границы отсечения, не попадая внутрь окна. Следовательно, для отсечения отрезка может потребоваться вычислить несколько точек пересечения в зависимости от порядка, в котором обрабатываются границы отсечения. При обработке каждой стороны отсекающего окна отсекается кусок линии, а оставшаяся часть линии проверяется на пересечение с другими границами окон. Удаление участков продолжается, пока линия не будет полностью обрезана, или пока оставшаяся часть линии не будет полностью располагаться внутри отсекающего окна. Далее будем предполагать, что стороны окна обрабатываются в таком порядке: левая, правая, нижняя, верхняя. Чтобы определить, пересекает ли линия выбранную границу отсечения, можно проверить соответствующие разряды кодов областей конечных точек. Если одно из этих значений равно 1, а второе - 0, отрезок пересекает данную границу.

При отсечении отрезка с использованием данного подхода, возможно, придется вычислить точки пересечения со всеми четырьмя границами отсечения в зависимости от того, как обрабатываются конечные точки линии и как упорядочены границы. На рис. 6.15 показаны четыре точки пересечения, которые можно вычислить для отрезка, который обрабатывается на предмет пересечения со сторонами отсекающего окна, идущими в следующем порядке: левая, правая, нижняя, верхняя. Поэтому были разработаны модификации данного алгоритма, направленные на сокращение расчетов точек пересечения.


⇐ вернуться назад | | далее ⇒