如何做正确的多边形旋转? (在C#中,虽然它适用于任何东西)

时间:2010-08-10 16:13:32

标签: c# geometry rotation polygon

您好我正在使用这个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;
    }

5 个答案:

答案 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)

只是猜测 - 您确定桌面分辨率的宽高比与物理屏幕的宽高比相同吗?也就是说,像素是正方形?如果没有,那么以任意角度旋转矩形会使它们看起来偏斜。