您好我正在使用这个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;
}
答案 0 :(得分:7)
看起来您的轮换转换不正确。你应该使用:
x' = x*Cos(angle) - y*Sin(angle)
y' = x*Sin(angle) + y*Cos(angle)
有关详情,请查看互联网上的various sources。 :)
答案 1 :(得分:6)
我没有任何答案,为什么它还在倾斜,但我做有一个建议让代码更清晰:
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;
}
(假设Vector
已定义了适当的+/-运算符。)
你可能仍然需要对float
进行一些演员表,但你仍然会用更少的括号来混淆事物。哦,你肯定不需要将angle
强制转换为float
,因为它已经被声明为float
。
编辑:关于所涉及的旋转矩阵的注释 - 它取决于您是将角度设置为顺时针还是逆时针。我不会惊讶地发现矩阵确实出了问题(我确实尝试检查它,但显然搞砸了)......但“不同”并不是必然意思是“错误”。希望矩阵 错误,诚然::)
答案 2 :(得分:3)
我认为您的旋转矩阵不正确。在第二个等式中应该有+
而不是-
:
+cos -sin
+sin +cos
答案 3 :(得分:1)
假设原点是0,0。从你的公式我会得到: X'=(X +((X-0)* Cos(角度)) - ((Y-0)* Sin(角度))); X'= X +(X * Cos(角度)) - (Y * Sin(角度));
与初始公式不同 x'= x * cos角度 - y * cos角度
所以我认为Jon Skeet的回答是正确和清晰的。
答案 4 :(得分:0)
只是猜测 - 您确定桌面分辨率的宽高比与物理屏幕的宽高比相同吗?也就是说,像素是正方形?如果没有,那么以任意角度旋转矩形会使它们看起来偏斜。