![Smiley :-)](./images/smilies/jsmiley.gif)
Хочется, чтобы mapedit поддерживал полный набор операций булевой алгебры множеств на площадных объектах. Одно из естественных решений - реализовать теоретико-множественную разность полигонов, т.е. уметь по полигонам A и B строить полигон "A\B", содержащий точки из A, не лежащие в B. Результат можно записывать в A. Пока что в mapedit эта операция реализована только для специального случая, когда B строго содержится в A ("Join objects").
Набросок возможного алгоритма:
Примем за основу, что закрашенные области определяются так: точки, находящиеся "далеко", не закрашены, а при пересечении границы полигона состояние закрашенности меняется на противоположное (ведь в Гарминах все так и делается?). Тогда, зная вершины каждого из полигонов A и B и точки их самопересечения, можно считать каждый полигон объединением нескольких обычных многоугольников. Далее из каждого многоугольника, входящего в A, вычитаем все многоугольники, входящие в B (что, наверно, несложно).
Кстати, сама по себе возможность разбиения самопересекающегося полигона на многоугольники может быть полезной. Дополнительно можно предусмотреть операцию "чистки границ" по принципу: если удаление границы не изменяет множество внутренних точек полигона, то выполнить это удаление. Например, когда граница заходит внутрь и возвращается обратно своим следом. Или два многоугольника, соединенные длинной перемычкой: делаем разбиение и чистку границ - получаем просто два отдельных многоугольника.
Ну и не составит труда автоматизировать эти операции для однотипных объектов ("вычесть все болота из всех лесов").
Вот такие у меня мечты. А все из-за несовершенства гарминовского векторного формата, не поддерживающего слои ("одно над другим").