February 1st, 2013

Неожиданные упражнения на открытом воздухе

Умудрился наехать на гвоздь (где я его нашёл посреди дороги, ёлы-палы?). Хорошо, что задним колесом, а то так можно и "по дрова" с шоссе поехать.

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

После работы поеду куплю заплатку, поставлю на шину -- это достаточно просто.

Немного математики

Рисую ради развлечения небольшое GPS приложение для Ведроида. В частности, надо рассчитать расстояние от одной точки карты до другой.

Расстояние между параллелями остаётся достаточно постоянным -- около 69 миль (111 км) между градусами широты. Одна минута широты, соответственно, чуть больше мили. Но это между параллелями. А между меридианами расстояние плавно меняется от 69 миль между градусами долготы на экваторе до нуля на севером и южном полюсах! Поэтому разницу в градусах нельзя просто помножить на 69 -- дурь получится.

Тригонометрия на помощь!

Можно рассчитать длину полухорды между точками с координатами, вот так:

Длина полухорды = sin²(Δφ/2) + cos(φ1) * cos(φ2) * sin²(Δλ/2), где Δφ -- разница между координатами широты φ1 и φ2, Δλ -- разница между координатами долготы.
Затем, имея длину полухорды, получим половину угла между координатами через арктангенс:
Угол/2 = arctan(√a, √(1−a))

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

Затем, имея угол, через радиус вычислить длину дуги проще простого:
Длина дуги = a * R, где R -- радиус, a -- угол.

Хотим получить расстояние между точками в километрах -- используем радиус Земли в километрах (6 371 km), хотим в милях -- используем радиус в милях, 3 959 mi. Хоть в локтях, пядях али саженях -- знай правильный радиус подставляй.

Проблем у данного способа две:

1. Координаты из градусов надо перевести в радианы (большое дело, помножил на π/180 и делу конец)
2. Земля имеет не идеальную форму шара, она слегка сплюснута из-за вращения. Поэтому эта формула даёт небольшую погрешность в расчётах. Но эта погрешность не превышает 0.3% (3 метра на 1 километр) -- невелико дело.