ユーザーが指で拡大縮小している間 (つまり、ピンチ)、シーンを拡大縮小 (ズーム) する必要があるサーフェス アプリを実行しています。
現在、問題なく動作していますが、ユーザーの指の間の中心点を拡大する必要があるという問題があります。
要点はわかりますが、翻訳の背後にある数学を把握するのは困難です。
キャンバス シーンに を適用するScaleTransform
と、キャンバスの左上がズームインします。ピンチ ジェスチャの中心点をズームインする必要があります (これもありました)。
ズームがジェスチャの中心点にズームインしているように見えるようにするには、変換の計算はどのように機能するでしょうか?
編集:
これは基本的に私が持っているものです:
void Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
{
//apply zoom and translate
if (e.ScaleDelta != 1)
ApplyZoom(e);
else if (e.Delta.Length != 0)
ApplyTranslation(e);
}
private void ApplyZoom(Affine2DOperationDeltaEventArgs e)
{
//scale
var newScale = _zoomTransform.ScaleX * e.ScaleDelta;
newScale = GetCappedZoomLevel(newScale);
_zoomTransform.ScaleX = newScale;
_zoomTransform.ScaleY = newScale;
}
private void ApplyTranslation(Affine2DOperationDeltaEventArgs e)
{
var xDiff = e.ManipulationOrigin.X - _screenStartPoint.X;
var yDiff = e.ManipulationOrigin.Y - _screenStartPoint.Y;
var translateX = xDiff + _startOffset.X;
var translateY = yDiff + _startOffset.Y;
//bounds testing to limit translation
var rect = new Rect(0.0, 0.0, ZoomCanvas.RenderSize.Width, ZoomCanvas.RenderSize.Height);
Rect bounds = ZoomCanvas.TransformToAncestor(MainViewportCanvas).TransformBounds(rect);
if (CanTranslateX(translateX, bounds))
_translateTransform.X = translateX;
if (CanTranslateY(translateY, bounds))
_translateTransform.Y = translateY;
}
かなり基本的ですが、ある程度は機能します...
_zoomTransform は でScaleTransform
、_translateTransform はTranslateTransform
MainViewport は、変換を適用するキャンバスである ZoomCanvas を含むキャンバスです。