Страницы

Поиск по вопросам

среда, 13 февраля 2019 г.

Как повернуть группу точек в 2D относительно произвольной точки?

Попробовал сделать по формулам :
И так как поворачивать нужно относительно произвольной точки, то от x и y предварительно отнимается расстояние этой точки от начала координат, а затем добавляется. Вот код(С++) :
void rotate(int &x, int &y, const double &cosVal, const double &sinVal, const int &cx = 0, const int &cy = 0) { const double _x = x - cx; const double _y = y - cy; x = round( _x * cosVal - _y * sinVal); y = round( _x * sinVal + _y * cosVal); x += cx; y += cy; }
Но получается вот это (точка относительно которой крутится - центр треугольника) :
(гифка записана с момента когда треугольник уже начал деформироваться и "уезжать" от своего центра).


Ответ

Вы работаете с математикой с плавающей точкой, при этом используя переменные типа int! Естественно, [накапливающиеся] ошибки округления дают совершенно нелепые результаты!
Используйте для координат переменные типа double, а в int их переводите только для вывода графики (и то можно неявно...)
void rotate(int &x, int &y, const double &cosVal, const double &sinVal, const int &cx = 0, const int &cy = 0)
должна превратиться в
void rotate(double &x, double &y, double cosVal, double sinVal, double cx = 0.0, double cy = 0.0)

Комментариев нет:

Отправить комментарий