Рассчитать заголовок компаса из 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.

Кто-то видит ошибку в моем подходе или знает более надежный способ расчета курса компаса?

Ответы на вопрос(3)

Ваш ответ на вопрос