1

我在按如下方式捏合的画布上使用 MatrixTransform:

var transformation = MyCanvas.RenderTransform as MatrixTransform;
var matrix = transformation == null ? Matrix.Identity:transformation.Matrix;

matrix.ScaleAt(e.DeltaManipulation.Scale.X,
               e.DeltaManipulation.Scale.Y,
               e.ManipulationOrigin.X,
               e.ManipulationOrigin.Y);

Matrix m = MyCanvas.RenderTransform.Value;

如何判断它是增加还是减少?有没有我失踪的财产?

4

1 回答 1

3

我不确定我是否正确,但如果您需要知道生成的矩阵的比例因子是小于 1 还是大于 1,您可以简单地检查Matrix.M11Matrix.M22属性。除非您也旋转,否则它们会为您提供 x 和 y 方向的缩放因子。生成的总缩放取决于您如何定义它。最简单的定义可能是算术平均值 (M11 + M22) / 2:

matrix.ScaleAt(e.DeltaManipulation.Scale.X,
               e.DeltaManipulation.Scale.Y,
               e.ManipulationOrigin.X,
               e.ManipulationOrigin.Y);

var effectiveScale = (matrix.M11 / matrix.M22) / 2;

编辑:阅读评论后,我必须补充一点,只要您在 x 和 y 方向上独立缩放,您可能会放大一个方向,同时缩小另一个方向。为了避免这种情况并获得定义明确的统一缩放因子,您首先必须通过类似的方式计算平均缩放因子

var scale = (e.DeltaManipulation.Scale.X +
             e.DeltaManipulation.Scale.Y) / 2;

该值大于 1 用于放大,小于 1 用于缩小操作。然后,您将像这样缩放矩阵:

matrix.ScaleAt(scale, scale,
               e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
于 2012-11-29T07:08:47.523 回答