Попробовал сделать по формулам :
И так как поворачивать нужно относительно произвольной точки, то от 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)
Комментариев нет:
Отправить комментарий