3.3. Отсечение линий Листинг 3.5. Отсекатель линий Кохена-Сазерленда (псевдокод)

int clipSegment(Point2& pi. Point2& p2 . RealRect W) {

do{

if (.trivial accept) return 1; // some portion survives // некоторая часть выдерживает тест

if (.trivial reject) return 0: //no portion survives // ни одна часть не выдерживает тест

if (pi is outside) II ест pi снаружи {

if {pi is to the left) chop against the left edge II если pi слева, разделяем через левую границу

else if (pi is to the right) chop against the right edge // иначе если pi справа, разделяем через правую границу

else if {pi is below) chop against the bottom edge II иначе если pi снизу, разделяем через нижнюю границу

else if (pi is above) chop against the top edge II иначе если pi сверху, разделяем через верхнюю границу }

else

// р2 is outside // р2 вне окна

{

if (р2 is to the left) chop against the left edge II если p2 слева, разделяем через левую границу

else if (р2 is to the right) chop against the right edge // иначе если p2 справа, разделяем через правую границу

else if (р2 is below) chop against the bottom edge // иначе если p2 снизу, разделяем через нижнюю границу

else if (р2 is above) chop against the top edge // иначе если pi сверху, разделяем через верхнюю границу }

}while(l):

}

Каждый раз, когда выполняется цикл do, код для каждой концевой точки вычисляется заново и тестируется. Когда возникает случай тривиального приема и тривиального отклонения, алгоритм проверяет, находится ли точка pi вне окна, и если находится, то этот конец отрезка отсекается границей окна. Если же pi находится внутри окна, тогда р2 должна быть снаружи (почему?), следовательно, точка р2 отсекается границей окна.

Данный вариант алгоритма отсекает по порядку сначала слева, затем справа, затем снизу и затем сверху. Выбор порядка несущественен, если отрезки с одинаковой вероятностью размещаются в экранном окне. На рис. 3.19 показан случай, когда требуются все четыре отсечения. Первое отсечение превращает pi в А; второе меняет р2 на В, третье обнаруживает, что pi все еще вне окна и под ним, поэтому изменяет А на С; последнее отсечение изменяет р2 на D. При любом выборе порядка тестов на разделение всегда встречается ситуация, когда необходимы все четыре отсечения.


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