Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3275 / 437 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 5:

Отсечение отрезков и многоугольников

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

5.3. Отсечение многоугольников

Рассмотрим теперь задачу отсечения многоугольника относительно прямоугольника и алгоритм Сазерлэнда-Ходжмана [48], позволяющий проводить такое отсечение.

Ключевым моментом в этом алгоритме является сведение задачи отсечения прямоугольником к задаче отсечения полуплоскостями. Действительно, прямоугольник представляется в виде пересечения четырех полуплоскостей (по сути, этим же представлением мы пользовались и в алгоритме Сазерлэнда-Коэна). Поэтому достаточно поочередно отсечь части многоугольника, лежащие вне каждой полуплоскости.

Пусть многоугольник задан своими вершинами: P1P2 . . . PN. \overrightarrow{P_1P_2}, . . . \overrightarrow{P_kP_{k+1}}, . . . \overrightarrow{P_{N-1}P_N}, \overrightarrow{P_NP_1} - направленные ребра этого многоугольника.

Относительно произвольной полуплоскости \Pi каждое направленное ребро \overrightarrow{P_kP_{k+1}} может находиться в следующих положениях:

  1. целиком внутри полуплоскости: P_k \in \Pi, P_{k+1} \in \Pi ;
  2. целиком вне полуплоскости: P_k \notin \Pi, P_{k+1} \notin \Pi ;
  3. выходить из полуплоскости: P_k \in \Pi, P_{k+1} \notin \Pi ;
  4. входить в полуплоскость: P_k \notin \Pi, P_{k+1} \in \Pi.

Следующий алгоритм выводит в качестве результата вершины отсеченного многоугольника, обходя исходные вершины.

Отсечь 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.5. Работа алгоритма Сазерлэнда-Ходжмана.

Рис. 5.6.

Практически единственным недостатком алгоритма Сазерлэнда-Ходжмана является не совсем корректная обработка случаев, когда результатом отсечения являются несколько изолированных многоугольников. Результат алгоритма Сазерлэнда-Ходжмана в этом случае содержит многоугольники и связывающие их отрезки (рис. 5.6).

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >