Логические операции с прямоугольными многоугольниками

Аваст там товарищи программисты!

У меня такая проблема:

У меня есть два перекрывающихся прямоугольника, как показано на рисунке ниже.

Логические операции с прямоугольными многоугольниками

Я хочу вычислить многоугольник, состоящий из точки ABCDEF.

Альтернативное рождественское описание: красная формочка для печенья отрезает часть черного печенья. Я хочу вычислить черную печеньку.

Каждый прямоугольник представляет собой структуру данных с 4-мя 2-мерными вершинами.

Каков наилучший алгоритм для этого?

Всегда ли многоугольники выровнены по оси, как показано?

Judge Maygarden 22.12.2008 18:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
2 837
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это частный случай общего отсечения 2D-полигонов. Хорошее место для начала - алгоритм Вейлера-Атертона. В Википедии есть резюме и ссылки на исходную статью. Алгоритм, похоже, хорошо соответствует описанной вами структуре данных.

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

Красный прямоугольник может быть где угодно на черном. Однако, если он перекрывается, я просто игнорирую черный прямоугольник, так как он имеет более низкий приоритет.

Nailer 22.12.2008 18:20

Похоже, именно то, что мне действительно нужно.

Nailer 22.12.2008 18:23
en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithm кажется даже лучше объясненным.
Nailer 22.12.2008 18:49

Я нашел здесь кое-что, что могу использовать:

http://www.cgal.org/Manual/3.3/doc_html/cgal_manual/Boolean_set_operations_2/Chapter_main.html

На самом деле я загрузил исходный код CGAL еще до того, как опубликовал этот вопрос, но я думаю, что посмотрю на него поближе.

Использование CGAL для этого похоже на охоту на воробьев с пушками.

Nils Pipenbrinck 22.12.2008 20:07

Насколько точны координаты? Если прямоугольники довольно маленькие, проще всего нарисовать их на холсте, сначала черный прямоугольник, а затем красный. Оставшиеся черные пиксели на холсте - это оставшийся многоугольник.

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

+1 за подход разбивки на 9 частей. Это самый простой и быстрый ..

Nils Pipenbrinck 22.12.2008 20:08

Просто поясняющее примечание: «Нарисовать их на холсте» можно двумя способами: либо на холсте из графического API, либо на простом двухмерном массиве.

Yuliy 22.12.2008 20:11

Другие вопросы по теме