两条线之间的角度是错误的

时间:2011-09-14 14:50:19

标签: objective-c cocos2d-iphone

我想获得两条线之间的角度。 所以我使用了这段代码。


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

什么事? 我不知道原因。 请帮帮我。

enter image description here

3 个答案:

答案 0 :(得分:5)

如果您只是使用

radians = atan2f( y - posY , x - posX);

你将获得与水平线y=posY(蓝色角度)的角度。

enter image description here

您需要将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;
} 

如果您指定其中一条线上的点,交叉点和另一条线上的点,这将适用于您。