Добрый день.
Имеется 2D граф из 4-ех вершин и 4-ех ребер в форме прямоугольника.
Потом этот граф режется произвольной плоскостью.
Добавляются новые вершины и ребра вдоль линии разреза.
Повторяем процедуру нарезки 50 раз
Полученый граф будет соответствовать раскройке некоторой оригами-фигуры. Т.е. сложили 50 раз лист бумаги по произвольной линии, развернули и получился наш граф.
Инстинктивно кажется, что состоять такой граф будет из выпуклых N-угольников(полигонов), склееных вдоль границ.
Задача найти все эти N-угольники.
На первый взгляд несложно.
- Берем любое непройденное ребро
- Заносим его в result
- из всех следующих за ним ребер выбираем то, по которому повернем на максимальный угол
- заносим такое ребро в result
- идем по ребрам дальше, пока не вернемся в стартовое.
- как вернулись - выпуклый цикл найден
- у найденного цикла помечаем все ребра как пройденные(при этом неграничные ребра надо пройти по 2 раза т.к. они соединяют 2 полигона)
- повторяем цикл поиска пока есть непройденные ребра
Короче это flood fill, только для полигонов.
Для простых кейсов, алгоритм работает без ошибок(нашлись все 9 полигонов)
https://imgur.com/RseBUZrА вот в сложных случаях бывает пропускает полигоны
https://imgur.com/BHLBE2LДебаг показал, что это из-за того, что существуют ребра, из которых есть путь по непройденным ребрам,который НЕ ведет в стартовое ребро. На самом деле, этот путь ведет в одно из следующих после старта ребер.
От этого алгоритм зацикливается, т.к. пройденными я помечаю ребра уже после нахождения цикла. В результате остаются ребра, которые нельзя протрассировать и вернуться в начало.
От чего в графе появляются дырки(см. скрин 2)
Мне казалось, что алгоритм выше должен исключать такие случаи, но очевидно это не так.
Может кто-нибудь подкинет идею, как бы так хитро обойти граф, разбив его на множество выпуклых N-угольных полигонов?
PS: Замечал, на древних компах, что инструменту flood fill не всегда с первого раза удавалось закрасить область(алгоритм сам себе блокирует доступ в некоторые области). Надо было оставшиеся дырки дозакрашивать вручную.
Подозреваю, что нечто похожее происходит и в моем случае.