Javascript 用JS计算智能手机的基本方向
在JavaScript中,我们可以得到设备的alpha、beta和gamma角度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
- 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;
返回罗盘标题;
};
上述代码源于以下链接:
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)]