Предлагаю добавить в Яндекс. Народную карту функцию «сила скругления углов», т.к иногда существующего скругления не достаточно или наоборот слишком много
Вероятнее всего, именно радиус скругления. Очень часто при скруглении углов у узкого участка растительности происходит самоналожение ребер именно из-за чересчур большого радиуса. Хотя от количества точек это тоже зависит, ведь большой радиус порождает лишние точки, которые и провоцируют самоналожение. При работе с большими контурами приходится иногда выбирать - либо скруглять весь контур и потом полчаса удалять лишние точки в местах самоналожения, или же оставлять все как есть с острыми углами.
проблема понятно, но вот на основании каких параметров регулировать радиус скругления - непонятно. Делать это вручную для каждого узла - так работать не будет. Задавать один радиус для всего контура - тоже будет работать некорректно.
Пересечение рёбер при скруглении образуется из-за ошибки программистов, и при выборе радиуса она не исчезнет. Если Вы обратили внимание, некоторые углы не скругляются. Но вот условие, можно ли скруглить конкретный угол, а ещё точнее - пару соседних углов, не всегда работает корректно.
Вот как раз с близлежащими углами можно рассчитать радиус скругления, который будет таким, чтобы каждый из них можно было скруглить без наложения. А вот если углы на большом расстоянии, то невозможно понять, какой должен быть радиус. Это может знать только пользователь, который видит, что на снимке и понимают какую форму имеет объект на снимке. Решить эту задачу без машинного зрения невозможно.
В идеале, если два угла находятся рядом друг с другом, то они скругляются в один полукруг, если в отдалении - каждый скругляется на три-четыре точки по отдельности. По сути, это так и работает сейчас, за исключением того, на узких участках при большом сближении углов они скругляются не в единый полукруг, а каждый угол превращается в полудугу с большим радиусом, из-за чего и происходит самоналожение. Если исправить эту деталь - никакого машинного зрения не требуется :)
про машинное зрение я писал в контексте как раз обратного случая - когда углы сильно разнесены. В том случае, когда скругление получается слишком локальным, когда радиус скругления требуется сильно больше. Тут, на самом деле, уже всё зависит от пользователя, насколько качественно он рисует. Соглашусь с тем, что основной упор нужно сделать на том, чтобы при близких углах функция работала корректно, выбирая меньший радиус скругления. Как вариант - оставлять тот же радиус, но удалять те точки, что накладываются (думаю, это сделать не так уж сложно) или вызывают самоналожение ребра. Грубо говоря, чтобы автоматически решались такие "конфликты". Возможно, так будет проще реализовать.
Нужно доработать алгоритм в целом. Чтобы никакой индивидуальной обработки каждого угла не было. Учитывать расстояние до ближней точки и угол между лучами. Чтобы можно было заострённый конец лесополосы, водоёма или газона отрисовать вручную, поставив точку в вершину, а алгоритм скругления в острой вершине сделал закругление с очень маленьким радиусом. Задача представляется лёгкой для формулирования, а значит она не должна вызвать проблем и при реализации.
Поддерживаю! Именно расстояние от ближайшей точки к вершине и величины угла может определять начало или конец дуги, которая будет формироваться. Это на случай прецизионных закруглений. Т.е. нужно закругление острее - зафиксировали, естественно в разумных пределах. Сейчас такое игнорируется. Алгоритм: стандартный радиус как сейчас, определяются 2 точки начала дуги, если есть точка находящаяся ближе определённых, пересчитать по ней начало дуги - удаление вершины - расстановка новых точек. Но! Перед этим проверить применяемость на следующей вершине, Если средняя линия, для которой вычислена 2-я точка первой дуги подпадает под скругление и длина точки начала этой дуги до вершины этого угла будет больше, чем от вершины первого угла до - значит будет пересечение (как сейчас: или одна на одной или перехлёст), если нет - дуга готова . Решение: Берётся середина средней линии и ставится 2-я точка первой дуги, 1-я точка ставится на такое же расстояние от вершины = 1-я дуга готова можно ставить. Далее есть виртуальная 2-я дуга, обрабатывается следующий отрезок. Если 1-я точка новой дуги будет не будет "заходить" за 2-ю предыдущей (которую держим в уме) т.к. будет ограничена ею или следующей вершиной, т.е. изначально радиус определён, если он уже минимален, т.е. упирается в вершину, 2-я и эта дуга готова - вершина оставляется и всё начинается заново. Ещё вариант: пересчитать 2-ю дугу, она уменьшится в радиусе и 1-ю её точку соединить линией с последней точкой первой дуги (помните? :) По второму варианту закругления будут как бы средневзвешенные. Естественно самая первая точка, начало полигона также подлежит корректировке, если она не вяжется, по первому варианту именно она определяет радиус последней дуги. Все минимальные радиуса естественно игнорируются, если есть 2 точки с минимальным расстоянием - образуют 1-у вершину в продолжении. Должно работать без глюков! :)