В этом разделе мы разрабатываем алгоритм, отсекающий выступающие части каждого переданного ему отрезка прямой. Этот алгоритм можно включить в подпрограмму рисования прямых, если мы не можем воспользоваться отсечением, производимым OpenGL. В практическом упражнении 3.3 разрабатывается реализация класса алгоритмов, рисующих отсеченные прямые.

3.3.1. Отсечение прямой В этом разделе описывается классический алгоритм отсечения прямых - отсекатель Кохена-Сазерленда (Cohen-Sutherland clipper), который вычисляет, какая часть отрезка прямой с концевыми точками pi и р2 лежит (и лежит ли вообще) внутри мирового окна, и возвращает концевые точки такой части отрезка.

Мы разработаем подпрограмму clipSegmentCpl, р2. window), которая принимает в качестве параметров две 20-точки (на плоскости) и выровненный прямоугольник, после чего отсекает границами окна window отрезок прямой, определяемый конечными точками pi и р2. Если хоть какая-то часть данной прямой остается в границах окна, то в переменные pi и р2 помещаются новые значения концевых точек и функция возвращает единицу (информируя тем самым, что некоторая часть отрезка видима). Если же прямая отсечена полностью, то функция возвращает величину 0 (никакая часть отрезка не видима).

На рис. 3.14 показана типичная ситуация, включающая в себя многие из возможных действий отсекателя. Функция clipSegmentO совершает с каждым отрезком прямой одно из четырех действий.

О Если прямая целиком лежит внутри окна (как, например, отрезок CD), то функция возвращает величину 1.

О Если прямая целиком лежит вне окна (как, например, отрезок AB), то функция возвращает величину 0.

Дополнительные инструменты для рисования

О Если одна концевая точка находится внутри окна, а вторая - вне его (как, например, отрезок ЕЙ), то функция отсекает часть отрезка, лежащую вне окна, и возвращает величину 1.

О Если обе концевые точки расположены вне окна, но тем не менее часть отрезка проходит сквозь него (как, например, отрезок АЕ), то функция отсекает оба конца и возвращает величину 1.


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