-
Notifications
You must be signed in to change notification settings - Fork 9
18. Отсечение многоугольников невыпуклыми областями. Алгоритм Вейлера Азертона.
Контуры многоугольников должны задаваться определенным образом: внешняя граница КАЖДОГО многоугольника обходится по часовой стрелке, а внутренние границы – против часовой стрелки, чтобы внутренняя область всегда лежала по правую сторону от направления обхода.
В результате отсечения получаются многоугольники, ребра которых являются либо ребрами исходного многоугольника, либо ребрами отсекателя – никаких новых рёбер в результате отсечения не получается.
Точки пересечения делятся на входы и выходы с помощью векторного произведения вектора стороны отсекаемого на вектор стороны отсекателя. Положительное – вход, отрицательное – выход.
Для нахождения внутренних многоугольников движение начинаем с очередной точки входа, причём просмотр начинается со списка отсекаемого многоугольника. Просматриваемые вершины заносятся в список вершин результирующего многоугольника. Чтобы находить внешние многоугольники, движение надо начинать с очередной точки выхода. Списки границ отсекателя надо просматривать В ОБРАТНОМ направлении.
- Ввод количества вершин внешней границы отсекаемого многоугольника и их координат.
- Ввод количества отверстий в отсекаемом многоугольнике, по каждому отверстию - количества вершин и их координат.
- Ввод количества вершин внешней границы отсекателя и их координат.
- Ввод количества отверстий в отсекателе, по каждому отверстию - количества вершин и их координат.
- Формирование кольцевых двунаправленных списков вершин по всем границам отсекаемого многоугольника.
- Формирование кольцевых двунаправленных списков вершин по всем границам отсекателя.
- Вычисление координат всех точек пересечения отсекаемого многоугольника и отсекателя.
- Добавление всех найденных точек пересечения на соответствующие места в списки вершин многоугольников.
- Определение типа каждой точки пересечения и формирование двух списков - точек входа и точек выхода.
- Определение границ многоугольников, не имеющих пересечений. Границы отсекаемого многоугольника, лежащие вне отсекателя, поместить в список внешней принадлежности, границы, попавшие внутрь отсекателя - в список внутренней принадлежности. Поместить границы отсекателя, попавшие внутрь отсекаемого многоугольника, в оба списка принадлежности. (Границы отсекателя, лежащие за пределами отсекаемого многоугольника, проигнорировать).
- Проведение собственно отсечения. Организация для этого цикла по всем точкам входа.
- Нахождение в списке вершин отсекаемого многоугольника очередной точки входа.
- Просмотр списка вершин отсекаемого многоугольника до нахождения точки пересечения. Копирование просмотренных вершин в список внутренней принадлежности.
- Переход к списку вершин отсекателя и поиск в нем одноименной точки пересечения.
- Просмотр списка вершин отсекателя до нахождения точки пересечения. Копирование просмотренных вкршин в список внутренней принадлежности.
- Сравнение найденной точки пересечения с первой точкой: если эти точки не совпадают, то преход к п. 13, иначе к п. 17.
- Определение необходимости формирования второй границы отсеченного многоугольника: если не все границы отсекаемого многоугольника имеют пересечение с границами отсекателя, то необходим поиск другой границы, иначе перход к п.19.
- Получение второй границы результирующего многоугольника. В этом случае можно использовать правило:
- если пересечение имела только внешняя граница отсекаемого многоугольника, то полученный результат является внешней границей. Внутренняя граница будет совпадать с внутренними границами самого многоугольника и отсекателя (если она лежит внутри отсекаемого многоугольника), если отверстия отсекаемого многоугольника не лежат внутри отверстий отсекателя. В противном случае внутренняя граница будет совпадать с границей отверстия отсекателя.
- Если пересечение имела только внутренняя граница с внешней границей отсекателя, то будет получен нужный результат. Если же пересечение имели внутренние границы многоугольников, то внешняя граница результирующего многоугольника совпадает с внешней границей исходного многоугльника (если эта граница лежит внутри отсекателя) или с внешней границей отсекателя (отсекатель лежит внутри отсекаемого многоугольника).
- Конец цикла (выбор следующей точки входа из списка, если он не пуст и переход к п. 12, иначе выход из цикла).
- Конец.