Надеемся, что и центр карты, и вопросы о почтовом индексе были рассмотрены на форуме разработчиков MapQuest , пост .
https://developer.mapquest.com/forum/how-set-zoom-level-particular-zip-code
Вычислите единичные векторы из углов и возьмите угол их среднего числа.
Необходимо определить среднее число более точно. Для конкретного случая двух углов я могу думать о двух различных сценариях:
я не вижу, как вторая альтернатива может быть обобщена для случая больше чем двух углов, все же.
Я вижу проблему - например, если бы у Вас есть 45' углов и 315' углов, "естественное" среднее число было бы 180', но значение, которое Вы хотите, на самом деле 0'.
я думаю, что Starblue на что-то. Просто вычислите (x, y) декартовы координаты для каждого угла, и добавьте те итоговые векторы вместе. Угловое смещение заключительного вектора должно быть Вашим необходимым результатом.
x = y = 0
foreach angle {
x += cos(angle)
y += sin(angle)
}
average_angle = atan2(y, x)
я игнорирую на данный момент, что заголовок компаса запускается на севере и идет по часовой стрелке, тогда как "нормальные" декартовы координаты запускаются с нуля вдоль оси X и затем идут против часовой стрелки. Математика должна разработать тот же путь независимо.
Этот вопрос исследован подробно в книге: "Статистика По Сферам", Geoffrey S. Watson, Примечания Лекции Арканзасского университета в Математических Науках, 1983 John Wiley & Sons, Inc., как упомянуто в http://catless.ncl.ac.uk/Risks/7.44.html#subj4 Bruce Karsh.
А хороший способ оценить средний угол, A, от ряда угловых измерений [я] 0< =i
sum_i_from_1_to_N sin(a[i])
a = arctangent ---------------------------
sum_i_from_1_to_N cos(a[i])
метод, данный starblue, в вычислительном отношении эквивалентен, но его причины более ясны и вероятно программно более эффективны, и также работают хорошо в нулевом случае, таким образом, благодарность ему.
предмет теперь исследуется более подробно на Википедию , и с другим использованием, как дробные части.
ДЛЯ ОСОБОГО СЛУЧАЯ ДВУХ УГЛОВ:
Ответ ((a + b) mod 360) / 2 является НЕПРАВИЛЬНЫМ . Для углов 350 и 2 ближайшая точка - 356, а не 176.
Единичный вектор и триггерные решения могут быть слишком дорогими.
Я получил следующее:
diff = ( ( a - b + 180 + 360 ) mod 360 ) - 180
angle = (360 + b + ( diff / 2 ) ) mod 360
Alnitak имеет правильное решение. Решением Nick Fortescue является функционально то же.
Для особого случая где
(сумма (x_component) = 0,0 & & сумма (y_component) = 0.0)//, например, 2 угла 10. и 190. градусы, каждые
использование 0,0 градуса как сумма
В вычислительном отношении, необходимо протестировать на этот случай с тех пор atan2 (0., 0.) не определено и генерирует ошибку.
Средний угол phi_avg должен иметь свойство, что sum_i|phi_avg-phi_i |^2 становится минимальным, где различие должно быть в [-Пи, Pi) (потому что это могло бы быть короче для движения наоборот!). Это легко достигается путем нормализации всех входных значений к [0, 2Pi), хранения рабочего среднего числа phi_run и выбора нормализующий |phi_i-phi_run | к [-Пи, Pi) (путем добавления или вычитания 2Pi). Большинство предложений выше делает что-то еще, что делает не , имеют то минимальное свойство, т.е. они составляют в среднем что-то , но не углы.
Давайте представим эти углы с точками на окружности круга.
мы можем предположить, что все эти точки падают на ту же половину круга? (Иначе нет никакого очевидного способа определить "средний угол". Думайте о двух точках на диаметре, например, 0 градусов и 180 градусов---составляют средние 90 градусов или 270 градусов? Что происходит, когда у нас есть 3 или больше равномерно распространенных точки?)
С этим предположением, мы выбираем произвольную точку на том полукруге как "источник" и имеем размеры, данный набор углов относительно этого источника (назовите это "относительным углом"). Обратите внимание, что относительный угол имеет абсолютное значение строго меньше чем 180 градусов Наконец, возьмите средние из этих относительных углов для получения желаемого среднего угла (относительно нашего источника, конечно).
Вот идея: создайте среднее число многократно, всегда вычисляя среднее число углов, которые являются самыми близкими вместе, сохраняя вес.
Другая идея: найдите самый большой разрыв между данными углами. Найдите точку, которая делит пополам его, и затем выберите противоположную точку на круге как ссылочный нуль для вычисления среднего числа от.
Я бы пошел векторным путем с помощью комплексных чисел. Мой пример в Python, который имеет встроенные комплексные числа:
import cmath # complex math
def average_angle(list_of_angles):
# make a new list of vectors
vectors= [cmath.rect(1, angle) # length 1 for each vector
for angle in list_of_angles]
vector_sum= sum(vectors)
# no need to average, we don't care for the modulus
return cmath.phase(vector_sum)
Обратите внимание, что Python не необходим для создания временного нового списка векторов, все вышеперечисленное можно сделать за один шаг; Я просто выбрал этот способ, чтобы аппроксимировать псевдокод, применимый и к другим языкам.