bha*_*ing 8 c# geometry polygon rotation
嗨,我正在使用这个C#代码在我的应用程序中旋转多边形 - 它们会旋转,但也会沿着我想要发生的方式偏斜.所有多边形都是矩形,四个角定义为2D矢量,
public Polygon GetRotated(float radians)
{
Vector origin = this.Center;
Polygon ret = new Polygon();
for (int i = 0; i < points.Count; i++)
{
ret.Points.Add(RotatePoint(points[i], origin, radians));
}
return ret;
}
public Vector RotatePoint(Vector point, Vector origin, float angle)
{
Vector ret = new Vector();
ret.X = (float)(origin.X + ((point.X - origin.X) * Math.Cos((float)angle)) - ((point.Y - origin.Y) * Math.Sin((float)angle)));
ret.Y = (float)(origin.Y + ((point.X - origin.X) * Math.Sin((float)angle)) - ((point.Y - origin.Y) * Math.Cos((float)angle)));
return ret;
}
Run Code Online (Sandbox Code Playgroud)
看起来你的旋转变换是不正确的.你应该使用:
x' = x*Cos(angle) - y*Sin(angle)
y' = x*Sin(angle) + y*Cos(angle)
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看Internet上的各种来源.:)
我没有任何答案,为什么它还在倾斜,但我确实有一个建议,以使代码更清晰:
public Vector RotatePoint(Vector point, Vector origin, float angle)
{
Vector translated = point - origin;
Vector rotated = new Vector
{
X = translated.X * Math.Cos(angle) - translated.Y * Math.Sin(angle),
Y = translated.X * Math.Sin(angle) + translated.Y * Math.Cos(angle)
};
return rotated + origin;
}
Run Code Online (Sandbox Code Playgroud)
(假设Vector
已经定义了适当的+/-运算符.)
你可能仍然需要一些演员float
阵容,但你仍然会用更少的括号来混淆事物.哦,你绝对不会需要转换angle
到float
,因为它已经被声明为float
.
编辑:关于所涉及的旋转矩阵的注释 - 它取决于您是将角度设置为顺时针还是逆时针.我不会惊讶地发现矩阵确实出了问题(我确实尝试检查它,但显然搞砸了)......但"不同"并不一定意味着"错误".希望矩阵是错的,诚然:)