Вы можете сделать это итеративно и создать набор связанных компонентов (вместо всегда только одного подключенного компонента):
- Поместить все полигоны в «открытый» список.Инициализируйте пустой список компонентов .
- Пока open не пусто:
- Удалите многоугольник p из открыть и установить флаг изменено на истинное значение.
- Повторить, пока изменено верно:
- установить изменено в false
- для каждого многоугольника q in open :
- , если q пересекается p ,удалите q из open , установите , изменив в true, и установите p в объединение p и q .
- добавление p к компонентам .
В конце компоненты будут состоять из всех непересекающихся, связанных компонентов, которые могут быть сформированы путем объединения входных многоугольников.В вашем опубликованном образце он должен создать один полигон.
Это не самый эффективный подход (см. Алгоритмы в ссылке, размещенной Рики Бобби), но он имеет преимущество простоты.При условии, что вы не имеете дело с сотнями полигонов, он должен работать очень хорошо.
PS Как указывает @japreiss, объединение может иметь отверстия, даже если ни один из входных полигонов не имеет отверстия, даже если входные данныевсе выпуклые многоугольники.Если входы могут быть вогнутыми, то даже объединение 2-х полигонов может иметь отверстие.Ваш алгоритм с двумя полигонами уже справился с этим?