Страницы

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

понедельник, 6 января 2020 г.

Как повернуть группу точек в 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;
}


Но получается вот это (точка относительно которой крутится - центр треугольника) : 

(гифка записана с момента когда треугольник уже начал деформироваться и "уезжать"
от своего центра).
    


Ответы

Ответ 1



Вы работаете с математикой с плавающей точкой, при этом используя переменные типа 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)

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

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