public JSonMouseInfo(MouseControllerAction mouseAction) { _mouseAction = mouseAction; }
public MouseControllerAction SetHandPosition(KinectSensor sensor, Joint joint, Skeleton skeleton) { MouseControllerAction action = new MouseControllerAction(); action.mouseMove = false; Vector2 vector2 = FilterJointPosition(sensor, joint); if (!lastKnownPosition.HasValue) { lastKnownPosition = vector2; previousDepth = joint.Position.Z; return action; } bool isClicked = false; if (DisableGestureClick) { } else { if (ClickGestureDetector == null) isClicked = Math.Abs(joint.Position.Z - previousDepth) > 0.05f; else isClicked = clickGestureDetected; } if (impostor != null) { // Still magnetized ? if ((vector2 - lastKnownPosition.Value).Length > 0.1f) { impostor.Progression = 0; isMagnetized = false; previousMagnetizedElement = null; } // Looking for nearest magnetic control float minDistance = float.MaxValue; FrameworkElement nearestElement = null; var impostorPosition = new Vector2((float)(vector2.X * impostorCanvas.ActualWidth), (float)(vector2.Y * impostorCanvas.ActualHeight)); foreach (FrameworkElement element in MagneticsControl) { // Getting the four corners var position = element.TransformToAncestor(rootVisual).Transform(new Point(0, 0)); var p1 = new Vector2((float)position.X, (float)position.Y); var p2 = new Vector2((float)(position.X + element.ActualWidth), (float)position.Y); var p3 = new Vector2((float)(position.X + element.ActualWidth), (float)(position.Y + element.ActualHeight)); var p4 = new Vector2((float)position.X, (float)(position.Y + element.ActualHeight)); // Minimal distance float previousMinDistance = minDistance; minDistance = Math.Min(minDistance, (impostorPosition - p1).Length); minDistance = Math.Min(minDistance, (impostorPosition - p2).Length); minDistance = Math.Min(minDistance, (impostorPosition - p3).Length); minDistance = Math.Min(minDistance, (impostorPosition - p4).Length); if (minDistance != previousMinDistance) { nearestElement = element; } } // If a control is at a sufficient distance if (minDistance < MagneticRange || isMagnetized) { // Magnetic control found var position = nearestElement.TransformToAncestor(rootVisual).Transform(new Point(0, 0)); Canvas.SetLeft(impostor, position.X + nearestElement.ActualWidth / 2 - impostor.ActualWidth / 2); Canvas.SetTop(impostor, position.Y + nearestElement.ActualHeight / 2); lastKnownPosition = vector2; if (!isMagnetized || previousMagnetizedElement != nearestElement) { isMagnetized = true; magnetizationStartDate = DateTime.Now; } else { impostor.Progression = (int)(((DateTime.Now - magnetizationStartDate).TotalMilliseconds * 100) / 2000.0); } } else { Canvas.SetLeft(impostor, impostorPosition.X - impostor.ActualWidth / 2); Canvas.SetTop(impostor, impostorPosition.Y); } if (!isMagnetized) lastKnownPosition = vector2; previousMagnetizedElement = nearestElement; } else { action.mouseMove = true; action.dx = (int)((vector2.X - lastKnownPosition.Value.X) * Screen.PrimaryScreen.Bounds.Width * GlobalSmooth); action.dy = (int)((vector2.Y - lastKnownPosition.Value.Y) * Screen.PrimaryScreen.Bounds.Height * GlobalSmooth); MouseInterop.ControlMouse(action.dx, action.dy, permanentClick); lastKnownPosition = vector2; } previousDepth = joint.Position.Z; clickGestureDetected = false; return action; }