Pull to refresh

Кривые линии на Google Maps

Reading time 2 min
Views 4.6K
Думается мне, что скоро Google даст нам возможность нарисовать не только ломаную на своих картах, но и кривую. А с необходимостью нарисовать кривую линию я столкнулся уже сейчас, в процессе работы с одним проектом. И пришлось вертеться.

Я обычно очень люблю почитать на Хабре посты вида «Смотрите, что я сделал» (особенно, когда это не стартап). Поэтому — смотрите, что я сделал — я реализовал грязный хак, который поможет нарисовать кривые.

Сначала — картинка (не кликабельно):

Пример графика на карте



Прежде чем читать много букв, хочу попробовать!

Я бы тоже захотел. Пройдите вот по этому адресу. Там будет карта. Щелкните по ней один раз, потом щелкните в другом месте, на некотором удалении от первого щелчка. Посмотрите на результат. Можете щелкать дальше.

Зачем?

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

Как задавать кривые?

Кажется, заставлять людей учить теорию по кривым Безье, это не очень здорово. Поэтому я решил, что достаточно задавать кривые функциями одного переменного. Я лично больше всего люблю синус и косинус. Они достаточно красочно изображают путь пьяного пешехода.

Как они будут отображаться?

Графики функций будут аппроксимироваться графиками многочленов. По-русски: будут выбираться несколько точек на графике и соединяться отрезками. От количества точек зависит качество получаемого графика и скорость работы.

Как это выглядит в коде?


my_poly = ApproxPolyline(gmap, lls, f, range, points);
map_instance.addOverlay(my_poly.get_polyline());


gmap — объект класса GMap2 (он нужен, потому что в нем есть метод преобразования географических координат в декартовы),
lls — массив из двух точек, которые надо соединить графиком (объектов класса GLatLng),
f — функция одного переменного, которую хочется изобразить,
range — массив из двух чисел (отображаемый промежуток),
points — количество точек, которые будут соединены отрезками.

Где скачать?

Ссылки
Я разместил это на GitHub: страница репозитория и ссылки на архивы со скриптом последней ревизии: zip и tar.
Размер
Исходник скрипта на момент публикации весит 3400 байт, после сжатия YUICompressor — 2026 байт.
Лицензия
Код распространяется по лицензии MIT.

Как помочь?

Есть два способа:
1) Сказать мне, что не так. В комментариях, в почте или любым другим удобным способом.
2) Клонировать ветку на github, сделать изменения и сообщить мне, если вы хотите, чтобы они влились в мою ветку.

А он умеет «грабить корованы»?

Нет, а еще он не умеет заменять вам gnuplot и другие программы, которые рисуют графики. Поэтому всем, кто хочет нарисовать, например, тангенс на промежутке [-10; 10], сразу хочу сказать — получится плохо, ведь опорные точки распределяются равномерно. Потому что я ума не приложу, зачем рисовать графики неограниченных функций на картах :-)

Хотя тангенс на отрезке [-1; 1] выглядит очень даже ничего — потому что ограничен и непрерывен.

[:||||:]

Ах да, возможно это уже кто-то сделал, а я не знаю. Мне захотелось тряхнуть стариной и вспомнить немножко математики. Если это действительно не актуально, дайте мне знать и я скрою топик (только сначала научите — как).

Tags:
Hubs:
+44
Comments 27
Comments Comments 27

Articles