代码之家  ›  专栏  ›  技术社区  ›  Agnel Kurian

改变坐标系

  •  0
  • Agnel Kurian  · 技术社区  · 14 年前

    alt text
    (来源: roughnotebook at sites.google.com )

    我需要使用system::Drawing::Drawing2D(即GDI+),从上面显示的XY坐标系切换到X'Y'坐标系。这就是我的想法:

    float rotation =                    // +90 below is because AB is the new vertical...
        Math::Atan2(pB.Y - pA.Y, pB.X - pA.X) * 180.0 / Math::PI + 90.0f;
    
    Matrix m;
    m.Translate(pA.X, pA.Y);
    m.Rotate(rotation);
    m.Invert();
    
    array<PointF> points = gcnew array<PointF>{ pC };
    m.TransformPoints(points);
    

    有没有一种方法可以在最小化舍入误差的同时做到这一点?我能避开 Atan2 (或其他反三角函数)在这里调用?

    1 回复  |  直到 3 年前
        1
  •  3
  •   Beta    14 年前

    我不熟悉gdi+,但原则上,您可以不使用反三角或运算符反转来实现这一点(我说“算符求逆”而不是“矩阵求逆”,因为 Matrix

    Matrix m;
    m.Rotate(-rotation);
    m.Translate(-pA.X, -pA.Y);
    

    对于旋转本身,通常的方法是使用如下矩阵:

    cos(theta)  -sin(theta)
    sin(theta)   cos(theta)
    

    你在用atan(y/x)计算θ。但是如果你想要的是正弦波和余弦波,你可以将x和y归一化,直接使用它们:

    x  -y
    y   x
    

    不需要atan。 事实上,根本没有三角!