Клуб API Карт

Прилипание точек

Пост в архиве.
lightfantom
26 октября 2011, 10:26

Суть задачи:

На карте пользователем размещается и/или редактируется произвольное количество полигонов. Нужно чтобы при редактировании его вершин редактируемая точка "прилипала" к краям и вершинам соседних полигонов, если находится на расстоянии меньше заданного.

Вопрос:

Есть ли какие-то встроенные средства  или простые решения для такой задачи, или придётся делать через "универсальный интерфейс", вроде опроса в цикле всех полигонов, нахождение в каждом ближайшей точки и т.д, ибо это слишком требовательно к ресурсам?

2 комментария

все именно так как вы сказали.

Вам прийдется слушать изменения координат точки и при необходимости производить их изменения, чтобы прилипала.

В тоже время не обязательно работать по такой жесткой схеме :)

Так как я не знаю как точно должно работать - опишу общий смысл.

1. Вам надо найти все полигоны которые теоритически могут учавствовать в работе. Наверное они не дальше чем два экрана от границ редактируемого полигона.

2. Пройти по лининим эти полигоны формируюшие и найти все грани которые смотрят в сторону вашего полигона( через скалярное произведение )

3. Таким образом вы получите из списка полигонов с которыми теоритически может производиться работа только те грани к которым теоритически можно прилипнуть.

4. Любые другие фильтры, уменьшающие выборку. Например получить минимальный полигон состояший из точек проверяемых граней(algo.ru поможет), уменьшить его на пару пикселей, и таким образом получить зону где проверки не нужны. Стоит помнить что проверка на попадание точки в область в разы быстрее чем проверка на ниминимальное растояние от точки до линии.

И самый простой вариант.

Выполните пункт 1, после чего создайте друмерный массив NxM, который какбы сеткой покрывает рабочую область. После чего пройдите по всем граням полигонов и уставновите в ячейки этого массива некие флаги присуствия граней этих полигонов.

Итого при проведении проверки достачно будет взять 1-4 ячейки из этого массива(из области точка+область) чтобы узнать с какими гранями надо производить проверку).

Оба варианта подразумевают одноразовый запуск, в начале редактирования полигона(не точки). Второй, не смотря на свою простоту, и отсусвие каких либо хитрых вычислений(кроме как алгоритм построения линии) дает в общем случае константную сложность, и при работе особо не зависит от колличества тестируемых обьектов(только от плотности сетки)

Спасибо за ответ, в таком случае у меня рац.предложение к разработчиком в следующей версии эту фичу сделать :)