Антизерновая геометрия использует базовый метод определения масштабирования преобразования (реализация находится в agg_trans_affine.cpp) Это делается путем:
- Расчет вращения преобразования
- Дублирование преобразования и применение противоположного вращения
- Преобразование двух известных точек и вычисление масштаба из результата
В переводе на 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 также содержит предупреждение о том, что существуют вырожденные случаи, когда это не будет работать правильно, но это может быть полезно для вашей ситуации.