如何从中心点获得点角?

时间:2014-04-06 01:00:34

标签: python trigonometry

如果我有2个点(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

4 个答案:

答案 0 :(得分:3)

你非常接近: - )

改变这个:

 angle = atan(float(dy)/float(dx))

对此:

 angle = degrees(atan2(float(dy), float(dx)))

atan2()功能介于 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 计算。

答案 1 :(得分:3)

除了从弧度转换外,请考虑使用atan2代替atan。虽然atan会对圆圈另一侧的点给出相同的答案,atan2会给出正确的角度,同时考虑dx和{{1}的符号}。它需要两个参数:

dy

请注意,angle = math.degrees(math.atan2(y0 - y, x0 - x)) % 360 会返回atan2-pi之间,或-180度和180度之间的内容,因此pi会将结果转移到您想要的范围

答案 2 :(得分:0)

啊,很容易犯错误。 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

答案 3 :(得分:0)

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;
}