рассчитать угол с тремя CGpoint

У меня есть три CGpoint, и я хотел бы рассчитать угол.

Нарисовал небольшую схему:

введите здесь описание изображения

Я пробовал с этим кодом:

CGPoint u ;
        u.x = 0;
        u.y = - middleRectY;

        CGPoint v ;
        v.x = x1 -  middelRectX;
        v.y = y1 - middleRectY;

        // formule = u.v / ( ||u|| * ||v||)

        double cosa = (double)((u.x * v.x + u.y * v.y)) / sqrt(u.x * u.x + u.y * u.y) * sqrt(v.x * v.x + v.y * v.y);

        // angle en degré

        double angle = (180.0 / M_PI) * acos(cosa);

        // Signe de l'angle

        int sign = (u.x * v.y - u.y * v.x) > 0 ? 1 : -1;

        rectYellow.transform = CGAffineTransformMakeRotation(angle*sign);

Но моя функция возвращает "нан":/

Спасибо :)


person VivienCormier    schedule 27.10.2012    source источник
comment
Что именно возвращает NaN? Какая функция?   -  person WDUK    schedule 28.10.2012
comment
Когда я тестирую с помощью NSLog(@%f,angle) , консоль возвращает nan.   -  person VivienCormier    schedule 28.10.2012


Ответы (1)


Я нашел проблему!

Это просто проблема скобок:

double cosa = ((u.x * v.x) + (u.y * v.y)) / (sqrt((u.x * u.x) + (u.y * u.y)) * sqrt((v.x * v.x) + (v.y * v.y)));

Я не понимаю, почему? Поскольку скобки не нужны для умножения...

person VivienCormier    schedule 27.10.2012
comment
Возможно, это было из-за чрезмерных скобок в ((u.x * v.x + u.y * v.y)), приоритет операторов не кажется проблемой. - person WDUK; 28.10.2012
comment
@VivienCormier - ваш оригинал был в форме A / B * C, ваша версия - в форме A / (B * C) - и эти два, конечно, не совпадают (если C не равно 1!) - person CRD; 28.10.2012