より良い解決策は、あなたのパスを保存するために、1つ以上のSystem.Windows.Media.Geometryオブジェクトを使用することであろう、ポイントなど
あなたが実際にストロークを変えることができるように、この形状は、ペンで描画することができますTransformプロパティを使用するのがより柔軟になります。
トランスフォームを使用すると、視覚化ではなく、幾何学的表現の実際の座標を「ズーム」することができます。描画するとき、レンダリング変換を行う必要はありません。 FromPositionがのRectは、形質転換されていない境界を含まなければならない、とtoPositionのRectが変換範囲を含める必要がどこ
public static Matrix TransformShape(Rect fromPosition, Rect toPosition, bool flipVertical) {
Matrix translateThenScale = Matrix.Identity;
//we first translate to origin since that's just easier
translateThenScale.Translate(-fromPosition.X, -fromPosition.Y);
//now we scale the graph to the appropriate dimensions
translateThenScale.Scale(toPosition.Width/fromPosition.Width, toPosition.Height/fromPosition.Height);
//then we flip the graph vertically around the viewport middle since in our graph positive is up, not down.
if (flipVertical)
translateThenScale.ScaleAt(1.0, -1.0, 0.0, toPosition.Height/2.0);
//now we push the graph to the right spot, which will usually simply be 0,0.
translateThenScale.Translate(toPosition.X, toPosition.Y);
return translateThenScale;
}
:
は、私は次のように次のコードを使用し、変換を計算します。これはまた、XとYを別々にスケーリングすることも可能で、これはしばしばプロットに必要です。
それはあなたの幾何学の限界を計算するのは簡単です:
Geometry graphGeom;
//[...]
//the bounds are modified by the transform, so we want no transform!
graphGeom.Transform = Transform.Identity;
Rect graphBounds = graphGeom.Bounds;
//then set the transform again
//or, if the transform is axis-aligned, the following _should_ work:
Rect graphBoundsAlt = graphGeom.Transform.Inverse.TransformBounds(graphGeom.Bounds);
そしてもちろんのWPFは、あなたはそれが必要である必要があり、にレンダリングする必要がある境界たことを伝えることができます。それを一緒に入れて、あなたはこのソリューションを使用することの利点は、あなたが自由に使用するなら、RenderTransformsを台無しにする必要がないことです
public void RecomputeTransform(Rect targetRect, bool flipVertical) {
graphGeom.Transform = Transform.Identity;
Rect graphBounds = graphGeom.Bounds;
Matrix transMat = TransformShape(graphBounds,targetRect,flipVertical);
graphGeom.Transform = new MatrixTransform(transMat);
}
ような何かを行うことができ、そのせん断および/またはスケールXとYを変換しますあなたのラインに奇妙な歪みが無くても、ペンを不透明なオブジェクトとして扱うことができます(UIからカスタマイズする方が簡単です - ペン幅などを選択した場合、それ以上の修正は必要ありません)。
これはあなたのxとyスケールが均一である場合には罰金ですが、スケールが同じでない場合は動作しません。 – Klay