¿Cómo rotar, escalar y traducir una matriz de una vez en C #?

Está bien, esto es algo que debería ser una simple pregunta de matriz, pero mi comprensión de las matrices es algo limitada. Aquí está el escenario: tengo un sprite de 1 px por 1 px que quiero escalar en cierta cantidad x e y (diferentes cantidades en cada lado), y luego quiero rotar ese sprite en algún ángulo, y luego quiero poder coloque con precisión todo (desde la parte superior izquierda o el centro, no me importa).

Hasta ahora, mi código está vagamente cerca, pero tiende a estar desactivado en una cantidad aleatoria dependiendo del ángulo que paso.

Creo que esto lo haría:

        Point center = new Point( 50, 50 );
        float width = 60;
        float height = 100;
        float angle = 0.5;
        Vector3 axis = new Vector3( center.X, center.Y, 0 );
        axis.Normalize();
        Matrix m = Matrix.Scaling( width, height, 0 ) *
            Matrix.RotationAxis( axis, angle ) *
            Matrix.Translation( center.X, center.Y, 0 );

Pero tiende a reducir la escala de la línea girada hacia abajo, aunque creo que está posicionándola más o menos bien.

También probé esto:

  Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
      new Vector2( width, height ), new Vector2( center.X, center.Y ),
      angle, Vector2.Zero );

La línea se ve exactamente correcta, con el tamaño y la forma exactos, pero no puedo posicionarla correctamente. Si uso el vector de traducción al final de la llamada anterior, o si establezco una posición usando Sprite.Draw, ninguno funciona bien.

Esto es todo en SlimDX. ¿Qué estoy haciendo mal

Respuestas a la pregunta(4)

Su respuesta a la pregunta