如何从中心点获取到某个点的角度?

8
如果我有两个点(x0,y0)是圆的中心,并且另一个点(x,y)在圆边界上(这是图像中的红点)。如何获得该点的角度?注意,它应该返回一个角度,范围为[0,360)。图像中的红点角度约为70度。我该如何在Python中实现这个功能?谢谢。此方法似乎不起作用。
        (dx, dy) = (x0-x, y-y0)
        angle = atan(float(dy)/float(dx))
        if angle < 0:
            angle += 180

enter image description here


2
我认为你的dx翻转了。我认为你的dx应该是x-x0。 - RichS
1
我的建议是:重新定义你的x和y参考点,使其位于x轴或y轴上,从而始终使角度为0、90、-90或180。 - Jeff Langemeier
看起来我们都在正确的轨道上... :) - RichS
4个回答

8
你非常接近 :-)
更改为:
 angle = atan(float(dy)/float(dx))

转化为:

 angle = degrees(atan2(float(dy), float(dx)))
< p > < em > atan2() 函数比 < em > atan() 更强大,因为它考虑输入的符号并绕着整个圆形计算:

atan2(...)
    atan2(y, x)

    Return the arc tangent (measured in radians) of y/x.
    Unlike atan(y/x), the signs of both x and y are considered

degrees()函数将弧度转换为角度:

degrees(...)
    degrees(x)

    Convert angle x from radians to degrees.

此外,正如Rich和Cody所指出的,您需要修复dy的计算。

绝对比我的答案好。只需修复atan2的参数,并指出OP的dy计算有问题。 - Cody Piersall
小修改,我认为atan2需要两个参数。如果我错了,请纠正我...我认为在"To this:"部分,dy应该是第一个参数,dx应该是第二个参数,如果使用math.atan2。 - RichS
这篇文章的未来读者可能会发现这个链接很有用:(9.2.3三角函数部分)https://docs.python.org/2/library/math.html - RichS

4

除了弧度转换外,考虑使用atan2替代atan。而atan将为圆上相对的点给出相同的答案,atan2将给出正确的角度,并考虑dxdy的符号。它需要两个参数:

angle = math.degrees(math.atan2(y0 - y, x0 - x)) % 360

请注意,atan2返回的值在-pipi之间,或者-180度到180度之间,因此% 360的作用是将结果转换为所需的范围。

旁注:我喜欢Python如何明智地定义负数的百分号“%”。 - Casey Chu

1
float AnglePointToPoint(const CCPoint & pFrom, const CCPoint & pTo)
{
    float distanceX     = pTo.x - pFrom.x;
    float distanceY     = pTo.y - pFrom.y;
    float beta          = acos( fabs(distanceX) / sqrt( pow(distanceX,2) + pow(distanceY,2) ) ) * 180 / M_PI;
    float angleResult   = 0.0f;

    if( distanceX > 0 )
    {
        if( distanceY < 0 )
        {
            angleResult = beta + 90;//right_bot
        }
        else
        {
            angleResult = fabs(beta - 90);//right_top
        }
    }
    else
    {
        if( distanceY < 0 )
        {
            angleResult = fabs(beta - 90) + 180;//left_bot
        }
        else
        {
            angleResult = beta + 270;//left_top
        }
    }
    return angleResult;
}

如果您需要在笛卡尔坐标系中找出一个点的角度,其中正Y轴为0度并顺时针增加(例如,负X轴为270度),那么这是正确的公式。如果您从搜索中到达此处,请给我一个+1。 - Colmike

1
啊,这是容易犯的错误。atan返回的值是弧度而不是角度。所以你需要将角度乘以180/pi来将其转换为角度制。你还需要将dy更改为y0 - y以与dx保持一致。下面是纠正后的代码。
dx, dy = x0-x, y0-y
angle_in_radians = atan2(dy,dx) # you don't need to cast to float
angle_in_degrees = angle_in_radians * 180 / pi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接