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.M11プロパティとMatrix.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 に答える