Найти в Дзене

Отслеживание координат МКАД в таксометре

Как можно отследить положение автомобиля относительно МКАД?

Добрый!

источник: Яндекс.картинки
источник: Яндекс.картинки

Как-то давно я подрабатывал в такси. Живу я в Москве, соответственно и катался по Москве. А тарифы на такси были такие: поездка по времени, но еще дополнительно учитывается километраж по Московской кольцевой автомобильной дорогой (далее – МКАД) и за МКАД. Конкретные цифры не принципиальны – речь не об этом.

И решил я завести себе личный #таксометр, который бы учитывал поездки по и за МКАД. Перебрал несколько приложений для смартфона – нужного мне не нашел. Выход один – писать самостоятельно. Любительский опыт программирования у меня есть.

При написании таксометра столкнулся с задачей отслеживания МКАД. Я не буду привязываться к конкретному языку программирования, просто расскажу, как я решил эту задачу.

Так вот, есть у нас #массив географическими координатами МКАД. И есть положение авто. А вот как определить в каком месте находится машина: Москва, МКАД, или область? Естественно нужно как-то сопоставить #координаты. Понятно, но как – неясно!

Из школы еще знаю, что есть декартовы координаты – это те оси X и Y, что мы изучаем на математике. А есть еще и полярные координаты: они характеризуются длиной луча и углом его наклона. У нас есть координаты центра Москвы, и есть координаты (упростим) окружности. Надо как-то декартовы координаты перевести в полярные. Вот тут нам Пифагор и тригонометрия в помощь!

Сначала надо привести абсолютные географические координаты МКАД к относительным к центру Москвы. Тут просто: принимаем, что центр – это нулевая точка; вычитаем из МКАД центр – вот и относительные координаты!

чертеж автора
чертеж автора

Из чертежа и теоремы Пифагора понятно, что длина луча (L) – это квадратный корень из суммы квадратов катетов (X и Y). С углом наклона (α) тоже все ясно: в любом языке программирования есть функция арктангенса, а #тангенс – отношение прилежащего катета (X) к противолежащему (Y). Тут есть засада в виде нулевого угла и угла в +/- Пи градусов, противолежащий катет равен нулю, а на ноль делить нельзя! Но тут очень маловероятно, что координата прям так точно попадет! К тому же если так получится, то можно взять координату чуть выше на 1 метр, большой погрешности это не внесет. Думаю тут все понятно?

И получившиеся результаты мы заносим в упорядоченный по углу луча массив (или просто массив, а потом его любым способом упорядочиваем). Почему именно упорядоченный? Чтоб можно было потом найти интересующий нас угол.

Теперь нам нужно вычислить наши текущие координаты относительно центра Москвы. Здесь все тоже самое: относительно центра, перевод координат.

И вот теперь мы имеем более удобные данные: массив с #полярными координатами МКАД, полярные координаты автомобиля. Приступим к анализу. Для начала найдем угол луча МКАД на котором находится авто. Тут все просто. Угол луча у нас лежит в диапазоне от минус Пи до плюс Пи. Лучи МКАД лежат не точно от –Пи до Пи, там есть некоторая погрешность. Так вот, если у нас луч авто меньше первого элемента массива МКАД – берем первый элемент, если больше последнего – последний. А вот если где-то посередине – тут надо подумать. Начнем поиск #серединным делением. То есть, делим массив пополам и смотрим в какой половине лежит наш угол, далее делим уже эту новую половину. И так до тех пор, пока в половине не останется один элемент (удача!) или два – здесь мы смотрим к какому лучу наш авто ближе. Таким образом мы узнали опорный луч в массиве.

Сравним длину #лучей. Договоримся, что ширину МКАД мы примем +/- 20 метров. Значит, если длина луча авто меньше длины массива -20 метров – это Москва, если длиннее – область. Третий вариант – это МКАД.

Думаю, я тут все подробно расписал. Если что-то непонятно – пишите вопросы в комментариях!

Программа была написана на языке #JAVA для смартфона на #Android и успешно прошла полевые испытания! Исходный код приведу, если Вам это будет интересно – пишите в комментариях!

Всего хорошего! С Вами был Городской Полусумасшедший. Глядишь, еще увидимся!