在圆上查找点的角度

2022-09-04 08:13:26

想象一下,我在屏幕上画了一个中心坐标(cx,cy)的圆,并在圆上选择了一个随机点(A)。

trigonometric circle

通过获得点A的坐标,我需要找到(a)的角度。

更新:

我尝试使用以下公式:

Math.toDegrees(Math.asin(((x - cx) / radius).toDouble()))

这实际上是相反的(圆圈是通过向这个角度进给这个角度创建的):

x = radius * Math.sin(Math.toRadians(angle.toDouble())) + cx
y = radius * Math.cos(Math.toRadians(angle.toDouble())) + cy

但是由于公式中不存在y坐标,因此答案可能是错误的。


答案 1

如果您知道点 A(x,y) 的笛卡尔坐标,则可以通过将角度θ转换为极坐标来找到该角度θ,如下所示:

double theta = Math.toDegrees(Math.atan2(y - cy, x - cx));

如果您的 X 轴为 0 度,则此公式有效,否则您需要考虑偏移量。


答案 2

我认为你正在寻找的方法 i Math.atan2 计算到 x 和 y 的角度。我现在已经修改了代码以调整为向下放置0度。我还翻转了 y 轴,将 0, 0 cordinate 放在左上角(屏幕坐标),并将 180 以上的调整度数报告为负度:

public double theta(int cx, int cy, int x, int y)
{
    double angle = Math.toDegrees(Math.atan2(cy - y, x - cx)) + 90;
    return angle <= 180? angle: angle - 360;
}

一个小测试来验证一些角度...

@Test
public void test()
{
    assertThat(theta(50, 50, 60, 50), is(90.0));
    assertThat(theta(50, 50, 50, 60), is(0.0));
    assertThat(theta(50, 50, 40, 50), is(-90.0));
    assertThat(theta(50, 50, 50, 40), is(180.0));
}