我正在开发一个表面应用程序,需要在用户使用手指缩放(即捏合)时缩放场景(缩放)。
目前我已经让它正常工作了,但问题是我需要在用户手指之间的中心点上进行缩放。
我有这个点,但是背后的数学原理很难理解。
当我将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 的画布,ZoomCanvas 是我应用变换的画布。
Scale
、CanPan
和CanScale
是自定义属性吗?还是你扩展了一个ScrollViewer
?使用ScrollViewer
比使用X和Y平移更容易吗? - Mark