Как соединить два пересекающихся полигона в svg? Проблема следующего вида.
- Пользователь имеет возможность выделить полигон вручную точка за точкой.
- Он также имеет возможность выделить сколько угодно полигонов.
- Полигоны могут перекрывать друг друга.
- У полигона полупрозрачный фон, что при перекрытии затемняется прямопропорционально кол-ву наложений.
- Полигон сам себя не перекрывает, с этим проблем нет, это берёт на себя svg.
- один путь (path) может содержать в себе множество полигонов. При этом действуют правила перекрытия описанные в w3 ( www.w3.org/TR/SVG/painting.html#FillRuleProperty ) - может кто сможет объяснить как использовать это на практике. Вкратце, если указать evenodd - мы гарантированно получим "бублик", т.е. все перекрытия будут инвертировать, грубо говоря, наличие цвета в получающихся новых полигонах. Если не указывать - работает правило по умолчанию nonzero, поведение которого зависит от направления линий, которые пересекает некий луч, пущенный из некой точки в бесконечность. Грубо говоря, если взять два выпуклых полигона, оба нарисовать в одном направлении (по/против часовой стрелки), то они сольются нормально. Если в разных направлениях, то с "вырезанием дырок". Казалось бы, достаточно определить направление пересекаемых сегментов, и, в случае разницы направлений просто инвертировать оное, но что-то не так это просто (сложные полигоны, сложные пересечения).
- Для отрисовки я использую Raphaeljs. Он умеет определять, пересекаются ли полигоны и возвращает при этом точки пересечения, номера сегментов (порядковый номер по порядку отрисовки фигуры), где происходит пересечение, координаты начала и конца этих сегментов.
- на фоне картинка, если что.
Любые мысли приветствуются.
Даже нестандартные ;) Например, может самое просто решение, это склеить два непрозрачных полигона, перевести в растр и обратно в вектор как единый полигон.
UPD: похоже, что полигон таки может сам себя перекрывать с вырезанием дырок, при достаточно сложных путях. В таком случае нужен выпуклый многоугольник (с использованием всех точек, которые "касаются" внешнего пространства) без дырок
Попробовать можно тут: jsfiddle.net/extempl/wkyyhkht

21 Авг 2019 в 06:17
232 +1
0
Ответы
1

Для соединения двух пересекающихся полигонов в SVG с полупрозрачным фоном можно использовать следующий подход:

Создайте два полигона с заданными точками для каждого из них.Объедините точки каждого полигона в один общий массив точек.Используйте алгоритм построения выпуклой оболочки (convex hull) для получения выпуклого многоугольника, описывающего все точки.Создайте новый полигон с точками выпуклой оболочки и установите ему необходимые стили (полупрозрачный фон).Добавьте новый полигон на SVG холст, оставив только один полигон, который представляет собой объединение двух начальных полигонов.

Этот подход позволит вам объединить два пересекающихся полигона в единый многоугольник с учетом полупрозрачного фона. Вы можете использовать библиотеку Raphaeljs для реализации данного подхода.

Если это не подходит, то можно рассмотреть и другие алгоритмы обработки пересекающихся полигонов, например, алгоритм объединения (union) или вычитания (subtraction) полигонов.

Надеюсь, эти рекомендации помогут вам найти решение для данной проблемы. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.

20 Апр в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 835 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир