Поковырял инструмет резки полигона по линии. Нашел знакоые ржавые грабли.
Глюкодром в польском в придачу.
верхний ряд:
1 - имеем полигон парка с subtract больничкой.
2 - по красным точкам проводим Резку полигона линией.
3 - Отодвигаем больничку и видим несуразную картину. Полигон рассечен надвое, как и задумано. Дырка, попавшая в разрез (бывшая составной частью полигона и прописанная в польском второй строкой Data0=)цела, принадлежит одной из полученных частей, несмотря на то, что торчит наружу наполовину и уже точно вложенным объектом не является. Вторая часть восстановлена до полного четырехугольника. Образовавшаяся грыжа имеет тип материнского полигона и цвет фона карты (Белый парк). После пересохранения и открытия в гюкодроме у вас он станет Зелёным парком. Свежую нарезку проводите сами. Там в нижнем ряду готовые жертвы...
Второй строкой на скрине показана та же операция с использованием вычитания из парка старообрядного "секущего полигона"(красный). Все чинно и корректно, значит вполне осуществимо. Один недостаток - многоходовость манипуляции и необходимость стягивать узлы по краям образовавшегося коридора. Даже больничку сдвигать не нужно.
В обоих случаях выделенный полигон делится надвое и одна из частей вычленяется. Однако в случае с линией "дырка" остается самостоятельным объектом, связанным с второй половиной (2 строки data0), а в случае с секущим полигоном корректно исчезает, а её контур становится частями внешнего контура новых половинок. Именно так и должен работать инструмент резки.
Все другие полигоны, лежащие поверх выбранного, (больничка)остаются целыми. И это правильно.
Свое мнение (и не я один) изложил 2 года назад.
http://forum.navitel.ru/index.php?showt ... ntry142227
http://forum.navitel.ru/index.php?showt ... ntry211240
Был "спасибозаписан" и плюнул. Ну всё... "Пожизненный цинк с гвоздями" за прямую ссылку на нецензурный сайт...
Во искупление готов десять раз ночью написать на стене вен.диспасера:
-Дырка не может существовать без полигона в котором находится.
-Извлечение её - это удаление.
-Выход границы дырки за границу материнского полигона - это её исчезновение (удаление), с преобразованием части её контура во внешнюю границу основного полигона.
Все несуразности истекают из ошибочной концепции отношения к дыркам, как к самостоятельным полигонам. Отсюда и извлечение их в самостоятельные объекты при операциях Extract, весьма своеобразный вид (двойная внешняя граница) рассеченных дырок после нарезки полигона на более мелкие квадраты. Попробуйте сейчас рассечь линией сильно дырявый полигон леса и отодвинте его в сторону... Под ним увидите суть проблемы.
Понимаю, алгоритм не простой. Но если вместо линии для резки полигонов использовать предельно тонкий секущий полигон с последующим сведением щели в парных узлах - может получиться незатратно...
Провел мелкие практические изыскания. Два примера справа на скрине и в полише. В первом случае пытался вычесть из парка полигон с длинным классическим джиттером. Резка джиттером не удалась. Развел парные точки джиттера на единицу в шестом разряде координат ручками. Провел вычитание - получил два фрагмента с правильно обработанной дыркой. Вычленил. Осталось свести образовавшуюся щель. Сделать это можно без особых математических изысканий. Профильтровать все вновь полученные однотипные полигоны на предельно близко расположенные узлы и спарить их координаты (и не важно в какую сторону). Главное, чтоб они стали единообразны. Щель стянута. Вуаля.
То, что я сделал из джиттера,
не что иное, как интрумент "Полоса". Только вторая точка задается программой по алгоритму Ш 0,00..+1;Д 0,00..+1 Третья-парная и последующие пары работают как и в "полосе", только очень тонкой. По нажатию ввода построение секущей "полосы" заканчивается, происходит её вычитание из целевого полигона и самоудаление. Далее автоматически следует разгруппировка половинок и сведение близких узлов.
Обратите внимание, в примере полигон разрезан уже по ломаной траектории. Остается проблема с кривой разгруппировкой сильнодырявых полигонов. Их ведь тоже будут разрезать. Но это уже другая тема, так же , как и нарезка на квадраты.