Anti-Grain Geometryは、変換のスケーリングを決定するための基本的な方法を使用します(agg_trans_affine.cppにある実装)。それは次のようにして行われます:
- 変換の回転を計算する
- 変換を複製し、反対の回転を適用します
- 2つの既知のポイントを変換し、結果からスケールを計算します
C#に変換すると、次のようになります。
Matrix transform = (Matrix)graphics.Transform.Clone();
PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);
double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));
PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);
float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;
AGGコードには、これが正しく機能しない縮退したケースがあるという警告も含まれていますが、状況に役立つ場合があります。