| Казахстан |
Отсечение отрезков и многоугольников
5.3. Отсечение многоугольников
Рассмотрим теперь задачу отсечения многоугольника относительно прямоугольника и алгоритм Сазерлэнда-Ходжмана [48], позволяющий проводить такое отсечение.
Ключевым моментом в этом алгоритме является сведение задачи отсечения прямоугольником к задаче отсечения полуплоскостями. Действительно, прямоугольник представляется в виде пересечения четырех полуплоскостей (по сути, этим же представлением мы пользовались и в алгоритме Сазерлэнда-Коэна). Поэтому достаточно поочередно отсечь части многоугольника, лежащие вне каждой полуплоскости.
Пусть многоугольник задан своими вершинами: P1P2 . . . PN.
- направленные ребра этого многоугольника.
Относительно произвольной полуплоскости
каждое направленное ребро
может находиться в следующих положениях:
- целиком внутри полуплоскости:
,
; - целиком вне полуплоскости:
,
; - выходить из полуплоскости:
,
; - входить в полуплоскость:
,
.
Следующий алгоритм выводит в качестве результата вершины отсеченного многоугольника, обходя исходные вершины.
Отсечь P[1]...P[N] относительно полуплоскости
{
//L - граница полуплоскости
for( i = 1; i <= N; i++ )
{
j = i+1;
if( j == N+1 )
j = 1;
if( P[i]P[j] пересекает L )
{
I = пересечение( P[i]P[j], L );
вывести(I);
}
if( P[j]видима )
вывести(P[j]);
}
}
Листинг
5.5.
Алгоритм Сазерлэнда-Ходжмана
Данный алгоритм выводит вершины отсеченного многоугольника в порядке обхода. Пример работы алгоритма Сазерлэнда-Ходжмана приведен на рис. 5.5.
После проведения отсечения четырьмя полуплоскостями получается многоугольник, отсеченный относительно прямоугольника. Заметим, что данный алгоритм очевидным образом применим для отсечения любого выпуклого многоугольного окна - достаточно представить это окно в виде пересечений полуплоскостей.
Практически единственным недостатком алгоритма Сазерлэнда-Ходжмана является не совсем корректная обработка случаев, когда результатом отсечения являются несколько изолированных многоугольников. Результат алгоритма Сазерлэнда-Ходжмана в этом случае содержит многоугольники и связывающие их отрезки (рис. 5.6).

