Рассчитать заголовок компаса из DeviceOrientation Event API
Для веб-приложения дополненной реальности для смартфонов я пытаюсь вычислить направление по компасу, когда пользователь держит устройство в руке, с экраном в вертикальной плоскости и верхней частью экрана, направленной вверх.
Я взял предложенную формулу изhttp://dev.w3.org/geo/api/spec-source-orientation (см. Работающий пример) и реализовали следующую функцию:
function compassHeading(alpha, beta, gamma) {
var a1, a2, b1, b2;
if ( beta !== 0 || gamma !== 0 ) {
a1 = -Math.cos(alpha) * Math.sin(gamma);
a2 = Math.sin(alpha) * Math.sin(beta) * Math.cos(gamma);
b1 = -Math.sin(alpha) * Math.sin(gamma);
b2 = Math.cos(alpha) * Math.sin(beta) * Math.cos(gamma);
return Math.atan((a1 - a2) / (b1 + b2)).toDeg();
}
else {
return 0;
}
}
в то время как .toDeg () является любезным расширением объекта Numberhttp://www.movable-type.co.uk/scripts/latlong.html
/** Converts radians to numeric (signed) degrees */
if (typeof Number.prototype.toDeg == 'undefined') {
Number.prototype.toDeg = function() {
return this * 180 / Math.PI;
};
}
Однако проблема заключается в том, что вычисленное значение курса компаса изменяется от -75 до 80, даже если устройство (Google Galaxy Nexus) установлено в статическом положении. Похоже, что это происходит как в Google Chrome BETA, так и в FF BETA 23.
Кто-то видит ошибку в моем подходе или знает более надежный способ расчета курса компаса?