Очень неудачный формат хранения данных.
Ну ладно, опишу общий принцип:
Для отрезко (не важно, что это, импост или профиль рамы) вводим такое понятие как порядок. Т.е. у нас будут отрезки (импорсты) первого, второго, N-ного порядков.
Отрезки, из которых состоит рама (самые внешние отрезки) считаем по опеределению отрезками
нулевого порядка.
Для всех остальных отрезков (все остальные отрезки будут являться импостами) порядок расчитывается следующим образом:
"Порядок данного импоста на 1 (единицу) больше, чем максимальный из порядков смежных импостов". Под смежными импостами следует понимать импосты, в которые упирается данные (их всего два, при том, отрезки рамы тоже сюда входят).
Формула, по которой расчитывается
порядок отрезка:
- Код: Выделить всё
Edge.Order = Max(Edge.Imp1.Order, Edge.Imp2.Order) + 1
здесь функция Max(a, b) -- возвращает максимальное из двух переданных значений. Imp1 и Imp2 -- отрезки, в которые упирается данные (а любой отрезок, не принадлежащей раме, всегда во что-либо упирается).
Следующая иллюстрация показывает, как расставляются порядки отрезков:
Далее, вводим такое понятие как регион. Регион -- замкнутый многоугольник, состоящий из отрезков. Регион также имеет порядок. Порядок региона равен максимальному из порядков отрезков, которыми образован регион.
Рама -- тоже регион, и её порядок, согласно правилу определения порядка региона -- 0.
Импост I является девайдерным по отношению к региону R тогда и только тогда, когда порядок импоста на 1 больше порядка региона.
Если говорить о иллюстрации, то все импосты первого порядка (красные) являются девайдерными для рамы. Никакие другие импосты (зелёные и фиолетовые) девайдерными по отношению к раме назвать нельзя.
Теперь вводим такое понятие как подрегион. Подрегион является таким же регионом, и таким же образом имеет свой порядок.
Регион R1 является подрегионом для региона R0, если одной из его сторон является импост, являющийся девайдерным для региона R0.
Следующая иллюстрация показывает деление на подрегионы:
Далее: если регион не содержит внутри себя девайдерных импостов, то такой регион считается конечным. На иллюстрации конечными явлются все (крмое одного) регионы третьего порядка, и один регион второго порядка. Получаем координаты вершит таких регионов, суммируем все их и делим на количество вершнин.
Получившиеся точки для каждого региона будут находиться в его центре. Получится примерно следующее:
А теперь, внимание, примеры конфигураций, на которых мой алгоритм обломается. В этих случаев все импосты имеют одинаковый порядок, однако этот порядок не имеет смысла и нет ни одного импоста первого порядка:
Но я почти полностью уверен, что инструмент, с помощью которого в программе размечается окно, не позволит нарисовать такие окна, хотя технически их легко можно сделать.