internal static Matrix CreateMatrix(GeneralTransform transform)
 {
     if (transform != null && !IsIdentity(transform))
     {
         Point offset = transform.Transform(new Point(0, 0));
         Point i = transform.Transform(new Point(1, 0)).Minus(offset);
         Point j = transform.Transform(new Point(0, 1)).Minus(offset);
         Matrix matrix = new Matrix(i.X, i.Y, j.X, j.Y, offset.X, offset.Y);
         return matrix;
     }
     else
     {
         return Matrix.Identity;
     }
 }
		static Rect TransformRectByMiddlePoint(GeneralTransform transform, Rect r)
		{
			// we don't want to adjust the size of the control when moving it out of a scaled
			// container, we just want to move it correcly
			Point p = new Point(r.Left + r.Width / 2, r.Top + r.Height / 2);
			Vector movement = transform.Transform(p) - p;
			return new Rect(r.TopLeft + movement, r.Size);
		}
        /// <summary>
        /// Handles when the mouse moves
        /// </summary>
        /// <param name="mousePos"></param>
        /// <param name="screenToSceneTransform"></param>
        public void MouseMoved(Point mousePos, GeneralTransform screenToSceneTransform)
        {
            if (screenToSceneTransform == null)
                return;
            // Convert the mouse coordinates to scene coordinates
            mousePos = screenToSceneTransform.Transform(mousePos);

            bool newLocked = false;
            Point newPoint = mousePos;

            if (points.Count > 0)
            {
                // Transform the minimum distance ignoring the translation
                Rect minimumBounds = screenToSceneTransform.TransformBounds(minimumDistance);

                double nearestDistanceSquared;
                newPoint = GetEllipseScaledNearestPoint(points, mousePos, (Vector) (minimumBounds.Size),
                                                        out nearestDistanceSquared);
                newLocked = nearestDistanceSquared <= 1;
            }

            bool lockedChanged = newLocked != locked;
            bool pointChanged = newPoint != closestPoint;

            locked = newLocked;
            closestPoint = newPoint;

            if ((pointChanged && locked) || lockedChanged)
            {
                OnClosestPointChanged();
            }
        }
 /// <summary>
 /// Handles when the mouse moves
 /// </summary>
 /// <param name="mousePos"></param>
 /// <param name="screenToSceneTransform"></param>
 public Point MouseMoved(Point mousePos, GeneralTransform screenToSceneTransform) {
   if(screenToSceneTransform == null)
     return new Point(0, 0);
   // Convert the mouse coordinates to scene coordinates
   mousePos = screenToSceneTransform.Transform(mousePos);
   // Transform the minimum distance ignoring the translation
   Rect minimumBounds = screenToSceneTransform.TransformBounds(_minimumDistance);
   return MouseMoved(mousePos, minimumBounds);
 }
 public void QueueMouseMove(Point mousePos, GeneralTransform screenToSceneTransform) {
   mousePos = screenToSceneTransform.Transform(mousePos);
   Rect minimumBounds = screenToSceneTransform.TransformBounds(_minimumDistance);
   _mousePosQueue.Add(new PointAndBounds(mousePos, minimumBounds));
 }
 void ArrangeTicksAndMarkers(IEnumerable<DataAxisTick> ticksOrMarkers, GeneralTransform axisTransform, Size arrangeSize, double tickLength)
 {
     foreach (var tick in ticksOrMarkers)
     {
         Point tickLabelPosition;
         switch (AxisLocation)
         {
             case AxisLocation.Top:
             case AxisLocation.Bottom:
                 tick.Location = axisTransform.Transform(new Point(tick.Value, 0)).X;
                 if (tick.TextBlockBorder != null)
                 {
                     var yPos = tickLength;
                     if (AxisLocation == AxisLocation.Top) yPos += tick.TextBlockBorder.DesiredSize.Height;
                     tickLabelPosition = axisTransform.Transform(new Point(tick.Value, yPos));
                     tickLabelPosition.X -= tick.TextBlockBorder.DesiredSize.Width / 2;
                     tickLabelPosition.X = Math.Min(Math.Max(tickLabelPosition.X, 0), arrangeSize.Width - tick.TextBlockBorder.DesiredSize.Width);
                     tick.TextBlockBorder.Arrange(new Rect(tickLabelPosition, tick.TextBlockBorder.DesiredSize));
                 }
                 break;
             case AxisLocation.Left:
             case AxisLocation.Right:
                 tick.Location = axisTransform.Transform(new Point(tick.Value, 0)).Y;
                 if (tick.TextBlockBorder != null)
                 {
                     tickLabelPosition = axisTransform.Transform(new Point(tick.Value, tickLength + 2));
                     if (AxisLocation == AxisLocation.Left) tickLabelPosition.X -= tick.TextBlockBorder.DesiredSize.Width;
                     tickLabelPosition.Y -= tick.TextBlockBorder.DesiredSize.Height / 2;
                     tickLabelPosition.Y = Math.Min(Math.Max(tickLabelPosition.Y, 0), arrangeSize.Height - tick.TextBlockBorder.DesiredSize.Height);
                     tick.TextBlockBorder.Arrange(new Rect(tickLabelPosition, tick.TextBlockBorder.DesiredSize));
                 }
                 break;
             default:
                 throw new ApplicationException("DataAxis: Unknown AxisLocation value.");
         }
     }
 }
 /// <summary>
 /// Sets the coordinates on the cursor using the transform passed in
 /// </summary>
 /// <param name="mousePos"></param>
 /// <param name="uiElement"></param>
 /// <param name="transform"></param>
 public void SetCoordinatesOnCursor(Point mousePos, FrameworkElement uiElement, GeneralTransform transform)
 {
     if (transform != null && hasPermissionToRun)
     {
         try
         {
             cursorPosition = mousePos;
             lastCoordinate = transform.Transform(mousePos);
             SetStringFormat(transform);
             SetCoordinatesOnCursor(uiElement);
         }
         catch (Exception)
         {
             hasPermissionToRun = false;
         }
     }
 }