最近我一直在使用下面的函数,在我的各种程序中围绕一个中心点旋转一系列点。
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);
}
在旋转一个形状多次以微小角度时,这种方法一直行之有效。例如,在由4个点组成的矩形多边形上调用45°,我得到了以下结果:
foreach (var point in points)
Rotate(point, center, Math.PI / 180f * 45);
但是如果我调用旋转45次1°,得到的就是这个结果:
for (var i = 0; i < 45; ++i)
foreach (var point in points)
Rotate(point, center, Math.PI / 180f * 1)
只要我只调用它一次就可以,而且似乎随着旋转角度的降低而逐渐恶化。这个函数有什么缺陷,还是我对这个函数的基本作用有误解?如何通过小幅度重复旋转?我可以保存基准点,并在旋转改变时使用它们来更新当前点,但这是唯一的方法吗?