我想获得两条线之间的角度。 所以我使用了这段代码。
int posX = (ScreenWidth) >> 1;
int posY = (ScreenHeight) >> 1;
double radians, degrees;
radians = atan2f( y - posY , x - posX);
degrees = -CC_RADIANS_TO_DEGREES(radians);
NSLog(@"%f %f",degrees,radians);
但它不起作用。 日志是:146.309935 -2.553590
什么事? 我不知道原因。 请帮帮我。
答案 0 :(得分:5)
如果您只是使用
radians = atan2f( y - posY , x - posX);
你将获得与水平线y=posY
(蓝色角度)的角度。
您需要将M_PI_2
添加到弧度值才能获得正确的结果。
答案 1 :(得分:4)
这是我使用的功能。它对我很有用......
float cartesianAngle(float x, float y) {
float a = atanf(y / (x ? x : 0.0000001));
if (x > 0 && y > 0) a += 0;
else if (x < 0 && y > 0) a += M_PI;
else if (x < 0 && y < 0) a += M_PI;
else if (x > 0 && y < 0) a += M_PI * 2;
return a;
}
编辑:经过一些研究后我发现你可以使用 atan2(y,x) 。大多数编译器库都具有此功能。你可以忽略我上面的功能。
答案 2 :(得分:1)
如果您有3个点并且想要计算它们之间的角度,这是计算直角值的快速且正确的方法:
double AngleBetweenThreePoints(CGPoint pointA, CGPoint pointB, CGPoint pointC)
{
CGFloat a = pointB.x - pointA.x;
CGFloat b = pointB.y - pointA.y;
CGFloat c = pointB.x - pointC.x;
CGFloat d = pointB.y - pointC.y;
CGFloat atanA = atan2(a, b);
CGFloat atanB = atan2(c, d);
return atanB - atanA;
}
如果您指定其中一条线上的点,交叉点和另一条线上的点,这将适用于您。