代码之家  ›  专栏  ›  技术社区  ›  bharling

如何纠正多边形旋转尽管它适用于任何事物)

  •  8
  • bharling  · 技术社区  · 15 年前

    嗨,我正在用这个C代码在我的应用程序中旋转多边形-它们确实会旋转,但也会沿着我不想发生的方向倾斜。所有多边形都是矩形,四个角被定义为二维向量,

        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 回复  |  直到 15 年前
        1
  •  7
  •   vhallac    15 年前

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

    x' = x*Cos(angle) - y*Sin(angle)
    y' = x*Sin(angle) + y*Cos(angle)
    

    有关详细信息,请检查 various sources 在互联网上。:)

        2
  •  6
  •   Jon Skeet    10 年前

    有一个让代码更清晰的建议:

    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 浮动 ,因为它已经声明为 .

    必要地

        3
  •  3
  •   ysap    15 年前

    我认为你的旋转矩阵是不正确的。应该有一个 + 而不是 - 在第二个等式中:

    +cos  -sin
    +sin  +cos
    
        4
  •  1
  •   Txugo    15 年前

    假设原点是0,0。从你的公式中我可以得到: X'=(X+((X-0)*Cos(角))-((Y-0)*Sin(角));

    与最初的公式不同 x'=x*cos角-y*cos角

    所以我认为乔恩·斯凯特的回答是正确的,更清楚。

        5
  •  0
  •   ysap    15 年前

    你确定桌面分辨率的纵横比与物理屏幕的纵横比相同吗?也就是说,像素 广场