如果我有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
答案 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;
}