Java:以度为单位计算两点之间的角度

新手上路,请多包涵

我需要为我自己的 Point 类计算两点之间的角度,点 a 应为中心点。

方法:

 public float getAngle(Point target) {
    return (float) Math.toDegrees(Math.atan2(target.x - x, target.y - y));
}

测试 1: // 返回 45

 Point a = new Point(0, 0);
    System.out.println(a.getAngle(new Point(1, 1)));

测试 2:// 返回 -90,预期:270

 Point a = new Point(0, 0);
    System.out.println(a.getAngle(new Point(-1, 0)));

如何将返回的结果转换为 0 到 359 之间的数字?

原文由 Aich 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以添加以下内容:

 public float getAngle(Point target) {
    float angle = (float) Math.toDegrees(Math.atan2(target.y - y, target.x - x));

    if(angle < 0){
        angle += 360;
    }

    return angle;
}

顺便说一句,你为什么不想在这里使用双精度?

原文由 John Ericksen 发布,翻译遵循 CC BY-SA 3.0 许可协议

我从 johncarls 解决方案开始,但需要对其进行调整以获得我所需要的。主要是,我需要它在角度增加时顺时针旋转。我还需要 0 度才能指向北方。他的解决方案让我接近了,但我决定也发布我的解决方案,以防它对其他人有帮助。

我已经添加了一些额外的评论来帮助解释我对函数的理解,以防您需要进行简单的修改。

 /**
 * Calculates the angle from centerPt to targetPt in degrees.
 * The return should range from [0,360), rotating CLOCKWISE,
 * 0 and 360 degrees represents NORTH,
 * 90 degrees represents EAST, etc...
 *
 * Assumes all points are in the same coordinate space.  If they are not,
 * you will need to call SwingUtilities.convertPointToScreen or equivalent
 * on all arguments before passing them  to this function.
 *
 * @param centerPt   Point we are rotating around.
 * @param targetPt   Point we want to calcuate the angle to.
 * @return angle in degrees.  This is the angle from centerPt to targetPt.
 */
public static double calcRotationAngleInDegrees(Point centerPt, Point targetPt)
{
    // calculate the angle theta from the deltaY and deltaX values
    // (atan2 returns radians values from [-PI,PI])
    // 0 currently points EAST.
    // NOTE: By preserving Y and X param order to atan2,  we are expecting
    // a CLOCKWISE angle direction.
    double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);

    // rotate the theta angle clockwise by 90 degrees
    // (this makes 0 point NORTH)
    // NOTE: adding to an angle rotates it clockwise.
    // subtracting would rotate it counter-clockwise
    theta += Math.PI/2.0;

    // convert from radians to degrees
    // this will give you an angle from [0->270],[-180,0]
    double angle = Math.toDegrees(theta);

    // convert to positive range [0-360)
    // since we want to prevent negative angles, adjust them now.
    // we can assume that atan2 will not return a negative value
    // greater than one partial rotation
    if (angle < 0) {
        angle += 360;
    }

    return angle;
}

原文由 Joseph Snow 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题