Клуб Народной карты

Сила скругления углов

Предлагаю добавить в Яндекс. Народную карту функцию «сила скругления углов», т.к иногда существующего скругления не достаточно или наоборот слишком много

16 комментариев
Что подразумевается под силой? Радиус скругления, количество точек?
Фёдор Гусев
13 ноября 2019, 16:33
Alexxegorov,
Вероятнее всего, именно радиус скругления. Очень часто при скруглении углов у узкого участка растительности происходит самоналожение ребер именно из-за чересчур большого радиуса. Хотя от количества точек это тоже зависит, ведь большой радиус порождает лишние точки, которые и провоцируют самоналожение. При работе с большими контурами приходится иногда выбирать - либо скруглять весь контур и потом полчаса удалять лишние точки в местах самоналожения, или же оставлять все как есть с острыми углами. 
Фёдор Гусев,
проблема понятно, но вот на основании каких параметров регулировать радиус скругления - непонятно. Делать это вручную для каждого узла - так работать не будет. Задавать один радиус для всего контура - тоже будет работать некорректно.
Алексей Зуев
13 ноября 2019, 17:37
Фёдор Гусев,
Пересечение рёбер при скруглении образуется из-за ошибки программистов, и при выборе радиуса она не исчезнет. Если Вы обратили внимание, некоторые углы не скругляются. Но вот условие, можно ли скруглить конкретный угол, а ещё точнее - пару соседних углов, не всегда работает корректно.
Алексей Зуев,
Вот как раз с близлежащими углами можно рассчитать радиус скругления, который будет таким, чтобы каждый из них можно было скруглить без наложения.  А вот если углы на большом расстоянии, то невозможно понять, какой должен быть радиус. Это может знать только пользователь, который видит, что на снимке и понимают какую форму имеет объект на снимке. Решить эту задачу без машинного зрения невозможно. 
Обновлено 13 ноября 2019, 17:56
Фёдор Гусев
13 ноября 2019, 18:27
Alexxegorov,
В идеале, если два угла находятся рядом друг с другом, то они скругляются в один полукруг, если в отдалении - каждый скругляется на три-четыре точки по отдельности. По сути, это так и работает сейчас, за исключением того, на узких участках при большом сближении углов они скругляются не в единый полукруг, а каждый угол превращается в полудугу с большим радиусом, из-за чего и происходит самоналожение. Если исправить эту деталь -  никакого машинного зрения не требуется :)
Фёдор Гусев,
"или же оставлять все как есть с острыми углами" и потом полчаса скруглять каждый угол по отдельности. )))
Фёдор Гусев,
про машинное зрение я писал в контексте как раз обратного случая - когда углы сильно разнесены. В том случае, когда скругление получается слишком локальным, когда радиус скругления требуется сильно больше. Тут, на самом деле, уже всё зависит от пользователя, насколько качественно он рисует.
Соглашусь с тем, что основной упор нужно сделать на том, чтобы при близких углах функция работала корректно, выбирая меньший радиус скругления. Как вариант - оставлять тот же радиус, но удалять те точки, что накладываются (думаю, это сделать не так уж сложно) или  вызывают самоналожение ребра. Грубо говоря, чтобы автоматически решались такие "конфликты". Возможно, так будет проще реализовать.
Да прибудет с нами сила!
Может просто сразу нормально рисовать и никакой силы скругления не понадобится?
Эос,
легко сказать
13,
и легко сделать. я вот скруглением не пользуюсь
Обновлено 16 ноября 2019, 21:58
Нужно доработать алгоритм в целом. Чтобы никакой индивидуальной обработки каждого угла не было. Учитывать расстояние до ближней точки и угол между лучами. Чтобы можно было заострённый конец лесополосы, водоёма или газона отрисовать вручную, поставив точку в вершину, а алгоритм скругления в острой вершине сделал закругление с очень маленьким радиусом. Задача представляется лёгкой для формулирования, а значит она не должна вызвать проблем и при реализации.
Владимир aka VOV
14 ноября 2019, 20:21
jalanajak,
Поддерживаю! Именно расстояние от ближайшей точки к вершине и величины угла может определять начало или конец дуги, которая будет формироваться. Это на случай прецизионных закруглений. Т.е. нужно закругление острее - зафиксировали, естественно в разумных пределах. Сейчас такое игнорируется.
Алгоритм: стандартный радиус как сейчас, определяются 2 точки начала дуги, если есть точка находящаяся ближе определённых, пересчитать по ней начало дуги - удаление вершины - расстановка новых точек.
Но! Перед этим проверить применяемость на следующей вершине, Если средняя линия, для которой вычислена 2-я точка первой дуги подпадает под скругление и длина точки начала этой дуги до вершины этого угла будет больше, чем от вершины первого угла до  - значит будет пересечение (как сейчас: или одна на одной или перехлёст), если нет - дуга готова . Решение: Берётся середина средней линии и ставится 2-я точка первой дуги, 1-я точка ставится на такое же расстояние от вершины = 1-я дуга готова можно ставить. Далее есть виртуальная 2-я дуга, обрабатывается следующий отрезок. Если 1-я точка новой дуги будет не будет "заходить" за 2-ю предыдущей (которую держим в уме)  т.к. будет ограничена ею или следующей вершиной, т.е. изначально радиус определён, если он уже минимален, т.е. упирается в вершину, 2-я и эта дуга готова - вершина оставляется и всё начинается заново. Ещё вариант: пересчитать 2-ю дугу, она уменьшится в радиусе и 1-ю её точку соединить линией с последней точкой первой дуги (помните? :) По второму варианту закругления будут как бы средневзвешенные. 
Естественно самая первая точка, начало полигона также подлежит корректировке, если она не вяжется, по первому варианту именно она определяет радиус последней дуги. Все минимальные радиуса естественно игнорируются, если есть 2 точки с минимальным расстоянием - образуют 1-у вершину в продолжении.
Должно работать без глюков! :)
Насчет скругления углов в растительности и контра гидрографии не знаю, но хотелось бы видеть в инструментах отмены или возврата последнего действия в этих слоях, ну и так же счетчика точек (вершин). Вот эти инструменты будут полезнее (моё мнение).
Raptor,
Полумера. Зато просто и быстро в реализации.