【问题标题】:Javascript + Maths - Get a bearing angle from a point A to B properlyJavascript + Maths - 正确获取从 A 点到 B 点的方位角
【发布时间】:2016-01-02 04:09:26
【问题描述】:

在网上询问我找到了一个从A点到B点的方位角的公式,假设现在它工作了一半。

//Creates to points A and B and set their coordinates
var A = {
    x : 250,
    y : 250
};

var B = {
    x : 100,
    y : 250
};

var angle = Math.acos(
              (A.y - B.y) / 
              Math.sqrt(
                  Math.pow(A.x - B.x, 2) + 
                  Math.pow(A.y - B.y, 2)
              ) * (180 / Math.PI);

在这里提琴:https://jsfiddle.net/7js7e90k/4/

现在B点(绿点)在A点(白点)的左边,显示的角度应该是270°,但它显示的是90°。如果将 B 点设置在右侧(更改对象坐标),您会看到它也显示为 90°。

我需要它来显示相对于北方 (0°) 的正确角度,但它不会超过 180°,公式中需要更改一些内容。

【问题讨论】:

    标签: javascript math 2d


    【解决方案1】:

    由于Math.acos() 返回的值介于 0 和 π 之间而不是 0 和 2π 之间,您可以检查点 A 是在点 B 的左侧还是右侧,如果 A 在 B 的右侧,则添加额外的 180˚。

    试试这个:

    var ref_angle = Math.acos((A.y - B.y) / Math.sqrt(Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2))) * (180 / Math.PI);
    
    if (B.x >= A.x) {
        var angle = ref_angle
    }
    else {
        angle = ref_angle + 180
    }
    

    更新:

    如果您想避免使用条件,则需要使用Math.atan2()。但是Math.atan2() 测量相对于正 x 轴(东)的角度并返回 -180˚ 和 180˚ 之间的值。我修改了下面的公式,得到相对于正 y 轴(北)的角度,并返回 0˚ 到 360˚ 之间的值:

    var angle = ( ( ( -(Math.atan2((A.x-B.x),(A.y-B.y))*(180/Math.PI)) % 360) + 360) % 360); 
    

    查看这个更新的工作小提琴:https://jsfiddle.net/g7shjjxq/5/

    【讨论】:

    • 我喜欢这个,这是一个很好的 'Hack',我想知道是否有修复公式的实际方法。
    • @Juan Bonnett 你说得对,条件句的使用有点“黑客”。看看我更新的公式和小提琴。
    • 工作得很好!让我们使用它!
    • 呵呵,不好意思,发现了问题,不过应该很容易解决。 B在左边时,以南极为北极,检查this fiddle,应该不是接近180而是接近360jsfiddle.net/g7shjjxq/3
    • 好像一半的橙子倒了
    【解决方案2】:

    您可以使用 atangent 来计算它以避免模数或 IF,然后转换为 deg:

    function getAngle (x1, y1, x2, y2){
        var dx = x2 - x1,
        dy = y2 - y1;
        return Math.atan2(dy,dx)*(180/Math.PI);    
    }
    
    var A = { x : 250,  y : 250};
    var B = { x : 100,  y : 250};
    
    getAngle(A.x, A.y, B.x, B.y); // == 180
    

    【讨论】:

    • 我注意到北点是 -90,这让我觉得它从 0 变为 180,然后开始计数为负。无论如何,您可以让它从 0(北)开始工作并数到 359? jsfiddle.net/7js7e90k/6
    • 我认为您可以简单地将 180 添加到上述输出中,以将 +/- 180 转换为 0-359。
    【解决方案3】:

    对于 270° 的情况,答案会变成 90°,因为在这两种情况下,计算都会在 A.y - B.y 中返回 0。您需要做的是检查x 坐标以查看该点所在的位置,如果将 B 点留在 A 点,则将答案添加 180°

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2020-09-26
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多