Дополнительные инструменты для рисования
Разделение отрезка в случаях, отличных от тривиального приема и тривиального отклонения На рис. 3.18 приведена еще одна реализация эффективного отсекания той части отрезка прямой, которая расположена вне окна. Пусть известно, что точка Р с кодовым словом code расположена вне окна. Тогда отдельные биты слова code можно проверить для выяснения того, с какой стороны окна расположена точка Р, и тогда произвести разделение согласно уравнению (3.5). В листинге 3.17 приведена подпрограмма разделения, которая находит новую точку (такую, как точка А на рис. 3.18) и замещает ею точку Р. В этой подпрограмме используется побитовая операция логического умножения AND над словом code с маской, определяющей, где относительно окна расположена точка Р.
Листинг 3.17. Разделение отрезка, расположенного вне окна
ChopLine(Point2 &Р. unsigned char code) {
if(code & 8){ // to the Left // слева
P.у +- (window.1 - P.x) * dely / delx: P.x - window.1:
}
else if(code & 2){ // to the Right // справа
P.у +- (window.r - P.x) * dely / delx: P.x - window.r:
}
else if(code & 1){ // below // ниже
P.x +- (window.b - P.y) * delx / dely: P.у - window.b:
}
else if(code & 4){ // above // выше
P.x +- (window.t - P.y) * delx / dely: P.y - window.t:
}
}
Напишите полную реализацию алгоритма Кохена-Сазерленда, собрав вместе части, описанные здесь, с частями, которые приведены в разделе «Алгоритм отсечения Кохена- Сазерленда». Если вы делаете это в контексте реализации класса Canvas, как рассматривается в следующем тематическом задании, то обдумайте, как наилучшим образом предоставить данной подпрограмме доступ к частным элементам данных, связанных с окном и участвующими в процессе точками, и разрабатывайте свой код в соответствии с этим.
Проверьте данный алгоритм, нарисовав окно с большим разнообразием случайно расположенных линий: Пусть программа окрасит в красный цвет те их части, которые расположены внутри окна, и в черный цвет - те, которые расположены вне его.