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

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)

vha*_*lac 7

看起来你的旋转变换是不正确的.你应该使用:

x' = x*Cos(angle) - y*Sin(angle)
y' = x*Sin(angle) + y*Cos(angle)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看Internet上的各种来源.:)


Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)

(假设Vector已经定义了适当的+/-运算符.)

你可能仍然需要一些演员float阵容,但你仍然会用更少的括号来混淆事物.哦,你绝对不会需要转换anglefloat,因为它已经被声明为float.

编辑:关于所涉及的旋转矩阵的注释 - 它取决于您是将角度设置为顺时针还是逆时针.我不会惊讶地发现矩阵确实出了问题(我确实尝试检查它,但显然搞砸了)......但"不同"并不一定意味着"错误".希望矩阵错的,诚然:)