Угол между двумя линиями неправильный - PullRequest
6 голосов
/ 14 сентября 2011

Я хочу получить углы между двумя линиями.Поэтому я использовал этот код.


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 ]

5 голосов
/ 14 сентября 2011

Если вы просто используете

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

вы получите угол с горизонтальной линией y=posY (синий угол).

enter image description here

Вам нужно будет добавить M_PI_2 к вашему значению в радианах, чтобы получить правильный результат.

4 голосов
/ 14 сентября 2011

Вот функция, которую я использую. Это прекрасно работает для меня ...

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 (у, х) . Большинство библиотек компиляторов имеют эту функцию. Вы можете игнорировать мою функцию выше.

1 голос
/ 21 февраля 2014

Если у вас есть 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;
} 

Это будет работать для вас, если вы укажете точку на одной из линий, точку пересечения и точку на другой линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...