跟踪指南针箭头的角度

时间:2016-08-09 05:51:33

标签: javascript

我目前正在编写一个跟踪应用程序,该应用程序能够将您当前面对的角度和目标角度调整到目标并指向您需要行进的方向的箭头。 (当乌鸦飞过)

我无法抓住这两个角度并让它们协同工作,以便箭头指向正确的方向。

我对数学的了解非常有限,所以任何帮助都会受到赞赏。

function deviceOrientationListener(event) {
        facing = Math.round(event.alpha);
        deg = bearing(lat, lng, getUrlVars()["lat"], getUrlVars()["long"]);
        finaldeg = facing - deg;
        c.innerHTML = '<img style="-ms-transform: rotate(' + finaldeg + 'deg);-webkit-transform: rotate(' + finaldeg + 'deg);transform: rotate(' + finaldeg + 'deg);" src="images/arrow.png" />';
}

最终决定是我在锻炼方面遇到的麻烦。

1 个答案:

答案 0 :(得分:0)

我确实喜欢Ionic和插件cordova-plugin-device-orientation

  • to_turn 是用于记录计算角度的变量
  • degreeStyle 是应用于最终用户的箭头上的样式 屏幕
  • last_lat / last_lng 是用户的当前位置
  • target_lat / target_lng 是目的地

`

this.destinationBearing = this.bearing(  
                                        this.last_lat,
                                        this.last_lng,
                                        this.target_lat, 
                                        this.target_lng);

this.compass = this.deviceOrientation.watchHeading().subscribe(
    (data: DeviceOrientationCompassHeading) => {
        this.currentHeading = data.trueHeading;
        if (this.destinationBearing > this.currentHeading) {
            this.to_turn = this.destinationBearing - this.currentHeading;
        } else {
            this.to_turn =  360 - (this.currentHeading - this.destinationBearing);
        }
        this.degreeStyle = 'rotate(' + this.to_turn + 'deg)';
    }
);


bearing(startLat, startLng, destLat, destLng){
    startLat = this.toRadians(startLat);
    startLng = this.toRadians(startLng);
    destLat = this.toRadians(destLat);
    destLng = this.toRadians(destLng);
    let y = Math.sin(destLng - startLng) * Math.cos(destLat);
    let x = Math.cos(startLat) * Math.sin(destLat) -
    Math.sin(startLat) * Math.cos(destLat) * Math.cos(destLng - startLng);
    let brng = Math.atan2(y, x);
    brng = this.toDegrees(brng);
    return (brng + 360) % 360;
}

toRadians(degrees) {
    return degrees * Math.PI / 180;
};

toDegrees(radians) {
    return radians * 180 / Math.PI;
}