Javascript 用JS计算智能手机的基本方向

Javascript 用JS计算智能手机的基本方向,javascript,Javascript,在JavaScript中,我们可以得到设备的alpha、beta和gamma角度 alpha:绕z轴旋转[0,360] β:绕x轴旋转[90,-90] gamma:绕y轴旋转[180,-180] 但是,我希望使用这些角度来确定设备的基本方向(北、西、东和南) 我的问题: 是否可以仅使用alpha角来确定设备的基本方向,或者我是否也应该使用beta和gamma?如果需要beta和gamma;为了计算基数方向,我应该如何在计算中使用它们,有什么公式我应该知道吗?var heading; var

在JavaScript中,我们可以得到设备的alpha、beta和gamma角度

  • alpha:绕z轴旋转[0,360]
  • β:绕x轴旋转[90,-90]
  • gamma:绕y轴旋转[180,-180]

但是,我希望使用这些角度来确定设备的基本方向(北、西、东和南)

我的问题:
是否可以仅使用alpha角来确定设备的基本方向,或者我是否也应该使用beta和gamma?
如果需要beta和gamma;为了计算基数方向,我应该如何在计算中使用它们,有什么公式我应该知道吗?

var heading;
var heading;

window.addEventListener('deviceorientation', handleOrientation, false);

const handleOrientation = (event) => {
    if(event.webkitCompassHeading) {
        // some devices don't understand "alpha" (especially IOS devices)
        heading = event.webkitCompassHeading;
    }
    else{
        heading = compassHeading(event.alpha, event.beta, event.gamma);
    }
};

const compassHeading = (alpha, beta, gamma) => {

    // Convert degrees to radians
    const alphaRad = alpha * (Math.PI / 180);
    const betaRad = beta * (Math.PI / 180);
    const gammaRad = gamma * (Math.PI / 180);

    // Calculate equation components
    const cA = Math.cos(alphaRad);
    const sA = Math.sin(alphaRad);
    const cB = Math.cos(betaRad);
    const sB = Math.sin(betaRad);
    const cG = Math.cos(gammaRad);
    const sG = Math.sin(gammaRad);

    // Calculate A, B, C rotation components
    const rA = - cA * sG - sA * sB * cG;
    const rB = - sA * sG + cA * sB * cG;
    const rC = - cB * cG;

    // Calculate compass heading
    let compassHeading = Math.atan(rA / rB);

    // Convert from half unit circle to whole unit circle
    if(rB < 0) {
        compassHeading += Math.PI;
    }else if(rA < 0) {
        compassHeading += 2 * Math.PI;
    }

    // Convert radians to degrees
    compassHeading *= 180 / Math.PI;

    return compassHeading;
};

window.addEventListener('deviceorientation',handleOrientation,false); 常量handleOrientation=(事件)=>{ if(event.webkitCompassHeading){ //有些设备不理解“alpha”(尤其是IOS设备) heading=event.webkitCompassHeading; } 否则{ 航向=罗盘航向(event.alpha、event.beta、event.gamma); } }; 常数compassHeading=(alpha、beta、gamma)=>{ //将度转换为弧度 常数alphaRad=alpha*(Math.PI/180); 常数betaRad=beta*(Math.PI/180); 常数伽马拉德=伽马*(数学PI/180); //计算方程分量 const cA=数学cos(alphaRad); const sA=数学sin(alphaRad); 常数cB=数学cos(betaRad); const sB=数学罪恶(贝塔拉德); 常数cG=数学cos(伽马拉德); 常数sG=数学sin(gammaRad); //计算A、B、C旋转分量 常数rA=-cA*sG-sA*sB*cG; 常数rB=-sA*sG+cA*sB*cG; 常数rC=-cB*cG; //计算罗盘航向 让compassHeading=Math.atan(rA/rB); //从半个单位圆转换为整个单位圆 if(rB<0){ compassHeading+=Math.PI; }否则如果(rA<0){ compassHeading+=2*Math.PI; } //将弧度转换为度 compassHeading*=180/Math.PI; 返回罗盘标题; };
上述代码源于以下链接:


除了@AugustJelemson在他的代码中提到的所有事情之外,如果你想从指南针方向得到实际的基本方向,你可以简单地

const direction = ['north','north east', 'east','south east', 'south','south west', 'west','north west'][Math.floor(((angle+22.5)%360)/45)]
在角度
0~22.5
338.5~360
时,
方向将设置为
,在22.5~68.5时,将设置为
东北
,依此类推


此外,您测试程序的浏览器将极大地改变您的结果。使用IOS设备很可能会破坏您的程序(即使使用
webkitCompassHeading
也非常不准确)

我个人认为,你可以简单地使用
event.alpha
event.webkitCompassHeading
作为你的角度,没有任何问题,尽管August所做的是更安全的方法

干杯:)

const direction = ['north','north east', 'east','south east', 'south','south west', 'west','north west'][Math.floor(((angle+22.5)%360)/45)]