I am doing a surface application where I need to scale the scene (zoom) while the user zooms with his fingers (e.g. pinching)
I am currently working fine, but the problem is that I need to increase the center point between users' fingers.
I have a point, but the math behind the translation is hard to understand.
When I apply ScaleTransformCanvas to my ribbon, it zooms in on the upper left corner of the canvas, I need it to increase the center point of my gesture finger (which again I have).
How would translation math work to zoom in, zoom in at the center point of gestures?
Edit:
This is basically what I have:
void Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
{
if (e.ScaleDelta != 1)
ApplyZoom(e);
else if (e.Delta.Length != 0)
ApplyTranslation(e);
}
private void ApplyZoom(Affine2DOperationDeltaEventArgs e)
{
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;
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, , .