/// <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;
            }
        }
Пример #2
0
        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");
        }
Пример #3
0
        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)
            {
            }
        }
Пример #4
0
        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)
            {
            }
        }