gpt4 book ai didi

wpf - 如何在 WPF/Surface 中缩放时计算平移

转载 作者:行者123 更新时间:2023-12-04 18:24:36 25 4
gpt4 key购买 nike

我正在做一个表面应用程序,我需要在用户用手指缩放(即捏合)时缩放我的场景(缩放)

目前我可以正常工作,但问题是我需要放大用户手指之间的中心点。

我明白了,但是翻译背后的数学很难理解。

当我将 ScaleTransform 应用到我的 Canvas 场景时,它会在 Canvas 的左上角放大,我需要它来放大我捏合手势的中心点(同样,我有)。

翻译的数学原理如何使缩放看起来像放大手势的中心点?

编辑:

这基本上就是我所拥有的:

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 的 Canvas ,它是我应用变换的 Canvas 。

最佳答案

这是我的实现,最终运行良好

private void ApplyZoom(Affine2DOperationDeltaEventArgs e)
{
//scale
var newScale = _zoomTransform.ScaleX * e.ScaleDelta;
newScale = GetCappedZoomLevel(newScale);
var pinchPoint = e.ManipulationOrigin;
DoZoom(newScale, _transformGroup.Inverse.Transform(pinchPoint), pinchPoint);
}

private void DoZoom(double newScale, Point pinchPosition, Point physicalPosition)
{
_translateTransform.X = -1 * (pinchPosition.X * newScale - physicalPosition.X);
_translateTransform.Y = -1 * (pinchPosition.Y * newScale - physicalPosition.Y);
_zoomTransform.ScaleX = newScale;
_zoomTransform.ScaleY = newScale;
}

关于wpf - 如何在 WPF/Surface 中缩放时计算平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2144450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com