2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Поворот точки вокруг другой точки
Сообщение17.08.2017, 21:38 


10/02/15
6
Здравствуйте, вроде задача простая, но не могу разобраться в чем проблема, почему получаю соответствующий результат.

Грубо говоря надо повернуть точку вокруг определенного центра (точка) на заданный угол.
А еще проще нужно проделать путь точки на конце часовой стрелки (точка та что обычно лежит на циферблате и метках).

Нашел следующие формулы для данной задачи.

Цитата:
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



Видно, что при малом изменении градуса, очень большой поворот получается.

Подскажите где допустил ошибку ?

И еще очень большая просьба, объясните пожалуйста или дайте почитать материал о том как выводятся приведенные формулы для поворота, так как не люблю что-то использовать не зная изначально откуда ноги растут.
Спасибо

 Профиль  
                  
 
 Re: Поворот точки вокруг другой точки
Сообщение17.08.2017, 21:45 
Заслуженный участник
Аватара пользователя


23/07/08
10653
Crna Gora
Путаница градусы-радианы?

Цитата:
Из анализа данных было предположено, что аппарат прошел над поверхностью Марса на высоте 57 км вместо расчетных 110 км и распался в атмосфере. Столь большое отклонение было вызвано ошибкой в программном обеспечении миссии: команды по тяге двигателя в программном обеспечении Mars Climate Orbiter использовали единицу измерения силы ньютон (международная система единиц (СИ)), в то время как программное обеспечение на Земле, которое создавало эти команды, использовало британскую единицу измерения (фунт-сила).
(Вики, статья Mars Climate Orbiter)

 Профиль  
                  
 
 Re: Поворот точки вокруг другой точки
Сообщение17.08.2017, 21:52 


10/02/15
6
Спасибо за ответ. Корабли пока что не запускаю в космос)) Так что нечего бояться.
Только вот забыл добавить вот этот участок кода

Код:
double currentRotationAngle = Math.toDegrees(currentRadianAngle);


Вращение то идет по кругу, но очень большими шагами.

 Профиль  
                  
 
 Re: Поворот точки вокруг другой точки
Сообщение17.08.2017, 22:13 
Заслуженный участник
Аватара пользователя


23/07/08
10653
Crna Gora
Я не уверен, что Вы меня правильно поняли. Мне кажется, у Вас исходные константы задаются в градусах. А вот угол currentRotationAngle должен быть в радианах (потому что функции Math.sin и Math.cos требуют, чтобы входной параметр был в радианах). Вероятно, Вы вычисляете currentRotationAngle, а также шаг изменения этого угла, в градусах, а функции Math.sin и Math.cos трактуют это как радианы, что приводит к вращению, в $180/\pi\approx 57.3$ раз более быстрому, чем нужно.

Если это так, Вам, наоборот, не хватает перевода градусов в радианы на каком-то этапе.

 Профиль  
                  
 
 Re: Поворот точки вокруг другой точки
Сообщение18.08.2017, 15:16 


03/06/12
2763
Hellorandom в сообщении #1241401 писал(а):
как выводятся приведенные формулы для поворота

Да ничего такого в этом выводе нет, в принципе, мало-мальски приличный девятиклассник справится с этим выводом. Для упрощения центр поворота принимаем за начало,
Hellorandom в сообщении #1241401 писал(а):
где, (x0, y0) — точка в центре

если не ошибаюсь, у Шипачева в "Высшей математике" есть вывод этой формулы.

 Профиль  
                  
 
 Re: Поворот точки вокруг другой точки
Сообщение19.08.2017, 14:00 


10/02/15
6
svv в сообщении #1241414 писал(а):
Я не уверен, что Вы меня правильно поняли. Мне кажется, у Вас исходные константы задаются в градусах. А вот угол currentRotationAngle должен быть в радианах (потому что функции Math.sin и Math.cos требуют, чтобы входной параметр был в радианах). Вероятно, Вы вычисляете currentRotationAngle, а также шаг изменения этого угла, в градусах, а функции Math.sin и Math.cos трактуют это как радианы, что приводит к вращению, в $180/\pi\approx 57.3$ раз более быстрому, чем нужно.

Если это так, Вам, наоборот, не хватает перевода градусов в радианы на каком-то этапе.


Спасибо большое, да изначально использовал градусы, но практически сразу исправил, сам почитал документацию.
Ваше замечание по поводу исходных констант натолкнуло на правильную мысль.
Была проблема в том что при отрисовке поворачивал точку, то есть, сколько раз прорисовал столько раз и повернул, к тому же брал точку текущую, а не начальную, в данном случае она находится на 12 часах.
Поправил, все заработало.

Спасибо большое

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Mikhail_K


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group