Здравствуйте, вроде задача простая, но не могу разобраться в чем проблема, почему получаю соответствующий результат.
Грубо говоря надо повернуть точку вокруг определенного центра (точка) на заданный угол.
А еще проще нужно проделать путь точки на конце часовой стрелки (точка та что обычно лежит на циферблате и метках).
Нашел следующие формулы для данной задачи.
Цитата:
X = x0 + (x - x0) * cos(a) - (y - y0) * sin(a);
Y = y0 + (y - y0) * cos(a) + (x - x0) * sin(a);
где, (x0, y0) — точка в центре
Попробовал реализовать программно, но получается не совсем то что надо. Такое чувство, что поворот происходит на угол гораздо больше.
Вот код
Код:
Log("ROTATION ANGLE " + currentRotationAngle);
float tempCx = handPoint.x;
float tempCy = handPoint.y;
Log("CX BEFORE " + handPoint.x);
Log("CY BEFORE " + handPoint.y);
double angleSin = Math.sin(currentRotationAngle);
double angleCos = Math.cos(currentRotationAngle);
handPoint.x = (float) (centerPoint.x + (tempCx - centerPoint.x) * angleCos - (tempCy - centerPoint.y) * angleSin);
handPoint.y = (float) (centerPoint.y + (tempCy - centerPoint.y) * angleCos + (tempCx - centerPoint.x) * angleSin);;
Log("CX AFTER " + handPoint.x);
Log("CY AFTER " + handPoint.y);
Вот пример вывода в консоль. Точка изначально находится на 12 часах
Код:
ROTATION ANGLE 0.0
CX BEFORE 384.0
CY BEFORE 51.0
CX AFTER 384.0
CY AFTER 51.0
А вот что происходит при повороте
Код:
ROTATION ANGLE 0.0
CX BEFORE 384.0
CY BEFORE 51.0
CX AFTER 384.0
CY AFTER 51.0
ROTATION ANGLE 0.32859762620496313
CX BEFORE 384.0
CY BEFORE 51.0
CX AFTER 443.37973
CY AFTER 60.844765
ROTATION ANGLE 0.32859762620496313
CX BEFORE 443.37973
CY BEFORE 60.844765
CX AFTER 496.40536
CY AFTER 89.32558
ROTATION ANGLE 0.9958063628249512
CX BEFORE 496.40536
CY BEFORE 89.32558
CX AFTER 567.37866
CY AFTER 250.10873
ROTATION ANGLE 1.3788126356280013
CX BEFORE 567.37866
CY BEFORE 250.10873
CX AFTER 404.1587
CY AFTER 417.89243
ROTATION ANGLE 2.7921414187832503
CX BEFORE 404.1587
CY BEFORE 417.89243
CX AFTER 302.44055
CY AFTER 70.06344
ROTATION ANGLE 5.414320837146726
CX BEFORE 302.44055
CY BEFORE 70.06344
CX AFTER 205.39262
CY AFTER 190.77994
ROTATION ANGLE 7.581533884376249
CX BEFORE 205.39262
CY BEFORE 190.77994
CX AFTER 378.52762
CY AFTER 51.08137
ROTATION ANGLE 10.609041700967435
CX BEFORE 378.52762
CY BEFORE 51.08137
CX AFTER 215.71355
CY AFTER 309.40213
ROTATION ANGLE 11.335296569188536
CX BEFORE 215.71355
CY BEFORE 309.40213
CX AFTER 398.07254
CY AFTER 418.4611
ROTATION ANGLE 14.066101822008015
CX BEFORE 398.07254
CY BEFORE 418.4611
CX AFTER 202.0012
CY AFTER 262.06372
ROTATION ANGLE 14.0817753986059
CX BEFORE 202.0012
CY BEFORE 262.06372
CX AFTER 346.90173
CY AFTER 54.778675
ROTATION ANGLE 15.692644778502144
CX BEFORE 346.90173
CY BEFORE 54.778675
CX AFTER 423.85452
CY AFTER 414.63193
ROTATION ANGLE 16.098796854855074
CX BEFORE 423.85452
CY BEFORE 414.63193
CX AFTER 415.58328
CY AFTER 53.73084
ROTATION ANGLE 17.169259960072615
CX BEFORE 415.58328
CY BEFORE 53.73084
CX AFTER 200.36502
CY AFTER 223.41515
ROTATION ANGLE 18.61231500715623
CX BEFORE 200.36502
CY BEFORE 223.41515
CX AFTER 202.78592
CY AFTER 266.89786
ROTATION ANGLE 20.625571321625433
CX BEFORE 202.78592
CY BEFORE 266.89786
CX AFTER 389.6996
CY AFTER 51.088253
ROTATION ANGLE 21.641993970129832
CX BEFORE 389.6996
CY BEFORE 51.088253
CX AFTER 441.5612
CY AFTER 409.76477
ROTATION ANGLE 24.032088896581566
CX BEFORE 441.5612
CY BEFORE 409.76477
CX AFTER 565.8794
CY AFTER 262.85504
ROTATION ANGLE 24.34629808896966
CX BEFORE 565.8794
CY BEFORE 262.85504
CX AFTER 532.19073
CY AFTER 125.93342
ROTATION ANGLE 26.548899200062664
CX BEFORE 532.19073
CY BEFORE 125.93342
CX AFTER 514.58984
CY AFTER 364.6237
ROTATION ANGLE 28.2944735707699
CX BEFORE 514.58984
CY BEFORE 364.6237
CX AFTER 256.04706
CY AFTER 102.772736
ROTATION ANGLE 31.25091583036804
CX BEFORE 256.04706
CY BEFORE 102.772736
CX AFTER 236.06506
CY AFTER 125.586754
ROTATION ANGLE 33.20849927291247
CX BEFORE 236.06506
CY BEFORE 125.586754
CX AFTER 523.27374
CY AFTER 114.755104
Видно, что при малом изменении градуса, очень большой поворот получается.
Подскажите где допустил ошибку ?
И еще очень большая просьба, объясните пожалуйста или дайте почитать материал о том как выводятся приведенные формулы для поворота, так как не люблю что-то использовать не зная изначально откуда ноги растут.
Спасибо