/// <summary> /// Handles touchpad and mouse rotation/zoom (ok) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e) { DoLog("PointerWheelChanged"); // get keystates bool shift = (e.KeyModifiers & VirtualKeyModifiers.Shift) == VirtualKeyModifiers.Shift; bool ctrl = (e.KeyModifiers & VirtualKeyModifiers.Control) == VirtualKeyModifiers.Control; if (ctrl) { // get new transformation var newTransformation = FlattenTransformationGroup(); var newDeltaTransform = newTransformation.Children.OfType <CompositeTransform>().FirstOrDefault(); if (newDeltaTransform == null) { return; } // get center in respect to existing transformations Point center = _currentTransformations.TransformPoint(e.GetCurrentPoint(_border).Position); newDeltaTransform.CenterX = center.X; newDeltaTransform.CenterY = center.Y; // get scroll info var deltaScroll = (-1 * e.GetCurrentPoint(_border).Properties.MouseWheelDelta) > 0 ? 0.9 : 1.1; // handle rotation if (shift) { // rotation if (deltaScroll > 1) { newDeltaTransform.Rotation = -15.0; DoLog($"delta > 0 -> {newDeltaTransform.Rotation}"); } else if (deltaScroll < 1) { newDeltaTransform.Rotation = 15.0; DoLog($"delta < 0 -> {newDeltaTransform.Rotation}"); } } // handle scale else { newDeltaTransform.ScaleX = newDeltaTransform.ScaleY = deltaScroll; if (!CheckScaleTresshold(newTransformation)) { newDeltaTransform.ScaleX = newDeltaTransform.ScaleY = 1.0; } } // update with new transformations _border.RenderTransform = _currentTransformations = newTransformation; } }
public void World1_CombineModelProjection() { var gt = new TransformGroup(); gt.Children.Add(new MatrixTransform() { Matrix = World1 }); gt.Children.Add(new MatrixTransform() { Matrix = Projection }); TestContext.WriteLine($"final matrix {gt.Value}"); var point = gt.TransformPoint(W1UL); Assert.AreEqual(Bounds.Left, point.X, "X failed"); Assert.AreEqual(Bounds.Top, point.Y, "Y failed"); point = gt.TransformPoint(W1LR); Assert.AreEqual(Bounds.Left + Bounds.Width, point.X, "X failed"); Assert.AreEqual(Bounds.Top + Bounds.Height, point.Y, "Y failed"); }
async void ManipulateMe_ManipulationStarted(object sender, Windows.UI.Xaml.Input.ManipulationStartedRoutedEventArgs e) { try { Point point = new Point( e.Position.X, e.Position.Y); TransformGroup group = new TransformGroup(); TranslateTransform tempTranslateTransform = new TranslateTransform(); tempTranslateTransform.X = _transform.CenterX; tempTranslateTransform.Y = _transform.CenterY; RotateTransform tempRotateTransform = new RotateTransform(); tempRotateTransform.CenterX = _transform.CenterX; tempRotateTransform.CenterY = _transform.CenterY; tempRotateTransform.Angle = _transform.Rotation; group.Children.Add(tempTranslateTransform); group.Children.Add(tempRotateTransform); Point center = tempRotateTransform.TransformPoint(e.Position); Point localPoint = group.Inverse.TransformPoint(center); localPoint.X *= _transform.ScaleX; localPoint.Y *= _transform.ScaleY; Point worldPoint = group.TransformPoint(localPoint); Point distance = new Point( worldPoint.X - point.X, worldPoint.Y - point.Y); _transform.TranslateX += distance.X; _transform.TranslateY += distance.Y; _transform.CenterX = point.X; _transform.CenterY = point.Y; } catch (Exception ex) { } }
async void ManipulateMe_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { try { Point point = new Point( e.Position.X, e.Position.Y); TransformGroup group = new TransformGroup(); TranslateTransform tempTranslateTransform = new TranslateTransform(); tempTranslateTransform.X = _transform.CenterX; tempTranslateTransform.Y = _transform.CenterY; RotateTransform tempRotateTransform = new RotateTransform(); tempRotateTransform.CenterX = _transform.CenterX; tempRotateTransform.CenterY = _transform.CenterY; tempRotateTransform.Angle = _transform.Rotation; group.Children.Add(tempTranslateTransform); group.Children.Add(tempRotateTransform); Point center = tempRotateTransform.TransformPoint(e.Position); Point localPoint = group.Inverse.TransformPoint(center); localPoint.X *= _transform.ScaleX; localPoint.Y *= _transform.ScaleY; Point worldPoint = group.TransformPoint(localPoint); Point distance = new Point( worldPoint.X - point.X, worldPoint.Y - point.Y); _transform.TranslateX += distance.X; _transform.TranslateY += distance.Y; CurrentZoomScale = _transform.ScaleY = _transform.ScaleX *= e.Delta.Scale; if (_transform.Rotation > 360) { _transform.Rotation -= 360; } else if (_transform.Rotation < -360) { _transform.Rotation += 360; } RotationOffset = _transform.Rotation += e.Delta.Rotation; _transform.CenterX = point.X; _transform.CenterY = point.Y; DebugDot.RenderTransform = new TranslateTransform() { X = point.X, Y = point.Y }; Rect desktopBounds = BoundsRelativeTo(Outer, LayoutRoot); double zoomRatio = Outer.ActualWidth / desktopBounds.Width; double zoomRatioInvert = desktopBounds.Width / Outer.ActualWidth; double edgeBufferYPadding = 0; if (desktopBounds.X < LayoutRoot.ActualWidth / 2 && desktopBounds.Right > LayoutRoot.ActualWidth / 2) { _transform.TranslateX += e.Delta.Translation.X; } if (desktopBounds.X > LayoutRoot.ActualWidth / 2) { _transform.TranslateX += e.Delta.Translation.X - (desktopBounds.X - (LayoutRoot.ActualWidth / 2) - 1); } if (desktopBounds.Right < LayoutRoot.ActualWidth / 2) { _transform.TranslateX += e.Delta.Translation.X - (desktopBounds.Right - (LayoutRoot.ActualWidth / 2) - 1); } if (desktopBounds.Y + edgeBufferYPadding < LayoutRoot.ActualHeight / 2 && desktopBounds.Bottom - edgeBufferYPadding * zoomRatio > LayoutRoot.ActualHeight / 2) { _transform.TranslateY += e.Delta.Translation.Y; } if (desktopBounds.Y + edgeBufferYPadding * zoomRatio > LayoutRoot.ActualHeight / 2) { _transform.TranslateY += e.Delta.Translation.Y - (desktopBounds.Y + edgeBufferYPadding - (LayoutRoot.ActualHeight / 2) - 1); } if (desktopBounds.Bottom - edgeBufferYPadding < LayoutRoot.ActualHeight / 2) { _transform.TranslateY += e.Delta.Translation.Y - (desktopBounds.Bottom - edgeBufferYPadding - (LayoutRoot.ActualHeight / 2) - 1); } } catch (Exception ex) { } }