Некоторое время назад я использовал следующую функцию для вращения ряда точек вокруг точки поворота в различных моих программах.
private Point RotatePoint(Point point, Point pivot, double radians)
{
var cosTheta = Math.Cos(radians);
var sinTheta = Math.Sin(radians);
var x = (cosTheta * (point.X - pivot.X) - sinTheta * (point.Y - pivot.Y) + pivot.X);
var y = (sinTheta * (point.X - pivot.X) + cosTheta * (point.Y - pivot.Y) + pivot.Y);
return new Point((int)x, (int)y);
}
Это всегда прекрасно работало, пока я не попыталсявращать форму несколько раз на небольшие суммы.Например, это то, что я получаю, называя его на 45 ° для прямоугольного многоугольника, состоящего из 4 точек:
foreach (var point in points)
Rotate(point, center, Math.PI / 180f * 45);
![enter image description here](https://i.stack.imgur.com/HKEiS.png)
Но этоэто то, что я получаю, звоня повернуть 45 раз для 1 °:
for (var i = 0; i < 45; ++i)
foreach (var point in points)
Rotate(point, center, Math.PI / 180f * 1)
![enter image description here](https://i.stack.imgur.com/timGC.png)
Пока я называю это только один раз, когда все в порядке, и этотакже кажется, что постепенно становится хуже, чем ниже степень вращения.Есть ли какой-то недостаток в функции, или я неправильно понимаю, что делает эта функция?
Как я мог несколько раз вращаться в небольших количествах?Я мог бы сохранить базовые точки и использовать их для обновления текущих точек при каждом изменении поворота, но разве это единственный способ?