public static Gesture_Event_Sorting_Group Detect(List <My_Point> points, Gesture_Controler controler) { List <My_Point> result = new List <My_Point>(); Gesture_Event_Grouping resturedCluster = null; Gesture_Event_Sorting_Group sortingGroupEvent = null; foreach (My_Point p in points) { if (p.Sender is Menu_Sort_Box) { foreach (Gesture_Event gesture in Gesture_List.GestureList) { if (gesture is Gesture_Event_Grouping) { Gesture_Event_Grouping cluster = gesture as Gesture_Event_Grouping; if (cluster.IsGrouping()) { My_Point[] clusterPoints = cluster.Points; if (Enclose_Helper.PNPoly(clusterPoints, p.CurrentPoint.Position.X, p.CurrentPoint.Position.Y)) { resturedCluster = cluster; result.Add(p); foreach (My_Point clusterPoint in clusterPoints) { result.Add(clusterPoint); } My_Point[] argPoints = result.ToArray(); object[] objects = new object[cluster.Senders.Length + 1]; objects[0] = cluster.Points[0].Sender; for (int i = 0; i < cluster.Senders.Length; i++) { objects[i + 1] = cluster.Senders[i]; } sortingGroupEvent = new Gesture_Event_Sorting_Group(); sortingGroupEvent.Points = cluster.Points; Gesture_List.addGesture(sortingGroupEvent); Gesture_SortingGroup_Listener listener = new Gesture_SortingGroup_Listener(controler, sortingGroupEvent); sortingGroupEvent.Register(objects, argPoints); } } } } } } if (resturedCluster != null) { Gesture_List.removeGesture(resturedCluster); controler.Control.MainWindow.GroupingGestureLayer.Remove(resturedCluster); foreach (My_Point p in result) { points.Remove(p); } return(sortingGroupEvent); } return(null); }
public void Move(Gesture_Event_Grouping cluster) { Dispatcher.BeginInvoke(new Action(() => { Line[] follower = groupLinks[cluster]; for (int i = 0; i < 4; i++) { follower[i].X1 = cluster.Points[i].CurrentPoint.Position.X; follower[i].Y1 = cluster.Points[i].CurrentPoint.Position.Y; follower[i].X2 = cluster.Points[(i + 1) % 4].CurrentPoint.Position.X; follower[i].Y2 = cluster.Points[(i + 1) % 4].CurrentPoint.Position.Y; } })); }
public override void ContinueGesture(object sender, Gesture_Event_Args gEventArgs) { Gesture_Event_Grouping gesture = sender as Gesture_Event_Grouping; Card[] cards = gEventArgs.GestureObjects as Card[]; if (!gesture.IsGrouping()) { foreach (Card c in cards) { c.MoveCard(gesture.Vector.X, gesture.Vector.Y, 0); } gestureControler.Control.MainWindow.GroupingGestureLayer.Remove(gesture); } base.ContinueGesture(sender, gEventArgs); }
public void Remove(Gesture_Event_Grouping cluster) { Dispatcher.BeginInvoke(new Action(() => { if (groupLinks.ContainsKey(cluster)) { Dictionary <Gesture_Event_Grouping, Line[]> local = groupLinks; Line[] follower = local[cluster]; for (int i = 0; i < 4; i++) { DoubleAnimation animation = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(STATICS.ANIMATION_DURATION)); follower[i].BeginAnimation(Canvas.OpacityProperty, animation); this.Children.Remove(follower[i]); } groupLinks.Remove(cluster); } })); }
public void Add(Gesture_Event_Grouping group) { Dispatcher.BeginInvoke(new Action(() => { Line[] follower = new Line[4]; for (int i = 0; i < 4; i++) { follower[i] = new Line(); follower[i].X1 = group.Points[i].CurrentPoint.Position.X; follower[i].Y1 = group.Points[i].CurrentPoint.Position.Y; follower[i].X2 = group.Points[(i + 1) % 4].CurrentPoint.Position.X; follower[i].Y2 = group.Points[(i + 1) % 4].CurrentPoint.Position.Y; follower[i].Stroke = new SolidColorBrush(Colors.Goldenrod); follower[i].StrokeThickness = 3; this.Children.Add(follower[i]); DoubleAnimation animation = new DoubleAnimation(0, 1, TimeSpan.FromSeconds(STATICS.ANIMATION_DURATION)); follower[i].BeginAnimation(Canvas.OpacityProperty, animation); } groupLinks[group] = follower; })); }
public void Remove(Gesture_Event_Grouping cluster) { Dispatcher.BeginInvoke(new Action(() => { if (groupLinks.ContainsKey(cluster)) { Dictionary<Gesture_Event_Grouping, Line[]> local = groupLinks; Line[] follower = local[cluster]; for (int i = 0; i < 4; i++) { DoubleAnimation animation = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(STATICS.ANIMATION_DURATION)); follower[i].BeginAnimation(Canvas.OpacityProperty, animation); this.Children.Remove(follower[i]); } groupLinks.Remove(cluster); } })); }
/// <param name="gestureControler">Should be the one created in the MainWindow</param> /// <param name="gestureEvent">The gesture variable which fire the event</param> public Gesture_Grouping_Listener(Gesture_Controler gestureControler, Gesture_Event_Grouping gestureEvent) : base(gestureControler, gestureEvent) { }
public static Gesture_Event_Grouping Detect(List <My_Point> points, Gesture_Controler controler) { List <My_Point> result = new List <My_Point>(); if (points.Count == 4) { foreach (My_Point p in points) { if (p.Sender is Card_Layer) { result.Add(p); } } } if (result.Count == 4) { My_Point[] argPoints = result.ToArray(); Card[] cards = Card_List.CardList.ToArray(); My_Point[] Newpoint = new My_Point[4]; for (int i = 0; i < 4; i++) { Newpoint[i] = argPoints[i]; } double maxX_1 = Math.Max(Math.Min(Newpoint[0].CurrentPoint.Position.X, Newpoint[1].CurrentPoint.Position.X), Math.Min(Newpoint[2].CurrentPoint.Position.X, Newpoint[3].CurrentPoint.Position.X)); double maxX_2 = Math.Min(Math.Max(Newpoint[0].CurrentPoint.Position.X, Newpoint[1].CurrentPoint.Position.X), Math.Max(Newpoint[2].CurrentPoint.Position.X, Newpoint[3].CurrentPoint.Position.X)); double maxY_1 = Math.Max(Math.Min(Newpoint[0].CurrentPoint.Position.Y, Newpoint[1].CurrentPoint.Position.Y), Math.Min(Newpoint[2].CurrentPoint.Position.Y, Newpoint[3].CurrentPoint.Position.Y)); double maxY_2 = Math.Min(Math.Max(Newpoint[0].CurrentPoint.Position.Y, Newpoint[1].CurrentPoint.Position.Y), Math.Max(Newpoint[2].CurrentPoint.Position.Y, Newpoint[3].CurrentPoint.Position.Y)); double midX = (maxX_1 + maxX_2) / 2; double midY = (maxY_1 + maxY_2) / 2; My_Point[] orderedPoints = new My_Point[4]; int count1 = 0; int count2 = 0; int count3 = 0; int count4 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y <= midY) { count1++; } if (Newpoint[i].CurrentPoint.Position.X <= midX && Newpoint[i].CurrentPoint.Position.Y < midY) { count2++; } if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y >= midY) { count3++; } if (Newpoint[i].CurrentPoint.Position.X >= midX && Newpoint[i].CurrentPoint.Position.Y > midY) { count4++; } } if (count1 > 1 || count2 > 1 || count3 > 1 || count4 > 1) { if (count1 > 1) { int countIndexRight1 = 0; int countIndexRight2 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y <= midY) { countIndexRight1++; if (countIndexRight1 > 1) { if (Newpoint[i].CurrentPoint.Position.X < orderedPoints[0].CurrentPoint.Position.X) { orderedPoints[1] = argPoints[i]; } else { orderedPoints[1] = orderedPoints[0]; orderedPoints[0] = argPoints[i]; } break; } orderedPoints[0] = argPoints[i]; } } double disRight = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y >= midY) { countIndexRight2++; if (countIndexRight2 > 1) { double temp = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); if (temp > disRight) { orderedPoints[3] = argPoints[i]; } else { orderedPoints[3] = orderedPoints[2]; orderedPoints[2] = argPoints[i]; } break; } orderedPoints[2] = argPoints[i]; disRight = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); } } } else if (count2 > 1) { int countIndexLeft1 = 0; int countIndexLeft2 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X <= midX && Newpoint[i].CurrentPoint.Position.Y < midY) { countIndexLeft1++; if (countIndexLeft1 > 1) { if (Newpoint[i].CurrentPoint.Position.X < orderedPoints[0].CurrentPoint.Position.X) { orderedPoints[1] = argPoints[i]; } else { orderedPoints[1] = orderedPoints[0]; orderedPoints[0] = argPoints[i]; } break; } orderedPoints[0] = argPoints[i]; } } double disLeft = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X >= midX && Newpoint[i].CurrentPoint.Position.Y > midY) { countIndexLeft2++; if (countIndexLeft2 > 1) { double temp = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); if (temp > disLeft) { orderedPoints[3] = argPoints[i]; } else { orderedPoints[3] = orderedPoints[2]; orderedPoints[2] = argPoints[i]; } break; } orderedPoints[2] = argPoints[i]; disLeft = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); } } } } else { for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y < midY) { orderedPoints[0] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y < midY) { orderedPoints[1] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X <midX && Newpoint[i].CurrentPoint.Position.Y> midY) { orderedPoints[2] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y > midY) { orderedPoints[3] = argPoints[i]; } } } List <Card> objects = new List <Card>(); lock (cards) { foreach (Card c in cards) { if (Enclose_Helper.PNPoly(orderedPoints, c.CurrentPosition.X, c.CurrentPosition.Y)) { objects.Add(c); } } } if (objects.Count > 0) { Gesture_Event_Grouping gestureEvent = new Gesture_Event_Grouping(); gestureEvent.Points = orderedPoints; gestureEvent.Senders = objects.ToArray(); Gesture_List.addGesture(gestureEvent); Gesture_Grouping_Listener gestureListener = new Gesture_Grouping_Listener(controler, gestureEvent); gestureEvent.Register(objects.ToArray(), orderedPoints); foreach (My_Point p in result) { points.Remove(p); } return(gestureEvent); } return(null); } else { return(null); } }
private Gesture_Event_Grouping detectGroupingRegister(List<My_Point> points) { List<My_Point> result = new List<My_Point>(); if (points.Count == 4) { foreach (My_Point p in points) { if(p.Sender is Card_Layer) result.Add(p); } } if (result.Count ==4) { My_Point[] argPoints = result.ToArray(); Card[] cards = Card_List.CardList.ToArray(); My_Point[] Newpoint = new My_Point[4]; for (int i = 0; i < 4; i++) { Newpoint[i] = argPoints[i]; } double maxX_1 = Math.Max(Math.Min(Newpoint[0].CurrentPoint.Position.X, Newpoint[1].CurrentPoint.Position.X), Math.Min(Newpoint[2].CurrentPoint.Position.X, Newpoint[3].CurrentPoint.Position.X)); double maxX_2 = Math.Min(Math.Max(Newpoint[0].CurrentPoint.Position.X, Newpoint[1].CurrentPoint.Position.X), Math.Max(Newpoint[2].CurrentPoint.Position.X, Newpoint[3].CurrentPoint.Position.X)); double maxY_1 = Math.Max(Math.Min(Newpoint[0].CurrentPoint.Position.Y, Newpoint[1].CurrentPoint.Position.Y), Math.Min(Newpoint[2].CurrentPoint.Position.Y, Newpoint[3].CurrentPoint.Position.Y)); double maxY_2 = Math.Min(Math.Max(Newpoint[0].CurrentPoint.Position.Y, Newpoint[1].CurrentPoint.Position.Y), Math.Max(Newpoint[2].CurrentPoint.Position.Y, Newpoint[3].CurrentPoint.Position.Y)); double midX = (maxX_1 + maxX_2) / 2; double midY = (maxY_1 + maxY_2) / 2; My_Point[] orderedPoints = new My_Point[4]; int count1 = 0; int count2 = 0; int count3 = 0; int count4 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y <= midY) { count1++; } if (Newpoint[i].CurrentPoint.Position.X <= midX && Newpoint[i].CurrentPoint.Position.Y < midY) { count2++; } if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y >= midY) { count3++; } if (Newpoint[i].CurrentPoint.Position.X >= midX && Newpoint[i].CurrentPoint.Position.Y > midY) { count4++; } } if (count1 > 1 || count2 > 1 || count3 > 1 || count4 > 1) { if (count1 > 1) { int countIndexRight1 = 0; int countIndexRight2 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y <= midY) { countIndexRight1++; if (countIndexRight1 > 1) { if (Newpoint[i].CurrentPoint.Position.X < orderedPoints[0].CurrentPoint.Position.X) { orderedPoints[1] = argPoints[i]; } else { orderedPoints[1] = orderedPoints[0]; orderedPoints[0] = argPoints[i]; } break; } orderedPoints[0] = argPoints[i]; } } double disRight = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y >= midY) { countIndexRight2++; if (countIndexRight2 > 1) { double temp = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); if (temp > disRight) { orderedPoints[3] = argPoints[i]; } else { orderedPoints[3] = orderedPoints[2]; orderedPoints[2] = argPoints[i]; } break; } orderedPoints[2] = argPoints[i]; disRight = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); } } } else if (count2 > 1) { int countIndexLeft1 = 0; int countIndexLeft2 = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X <= midX && Newpoint[i].CurrentPoint.Position.Y < midY) { countIndexLeft1++; if (countIndexLeft1 > 1) { if (Newpoint[i].CurrentPoint.Position.X < orderedPoints[0].CurrentPoint.Position.X) { orderedPoints[1] = argPoints[i]; } else { orderedPoints[1] = orderedPoints[0]; orderedPoints[0] = argPoints[i]; } break; } orderedPoints[0] = argPoints[i]; } } double disLeft = 0; for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X >= midX && Newpoint[i].CurrentPoint.Position.Y > midY) { countIndexLeft2++; if (countIndexLeft2 > 1) { double temp = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); if (temp > disLeft) { orderedPoints[3] = argPoints[i]; } else { orderedPoints[3] = orderedPoints[2]; orderedPoints[2] = argPoints[i]; } break; } orderedPoints[2] = argPoints[i]; disLeft = Math.Pow((Newpoint[i].CurrentPoint.Position.X - orderedPoints[1].CurrentPoint.Position.X), 2) + Math.Pow((Newpoint[i].CurrentPoint.Position.Y - orderedPoints[1].CurrentPoint.Position.Y), 2); } } } } else { for (int i = 0; i < 4; i++) { if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y < midY) { orderedPoints[0] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y < midY) { orderedPoints[1] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X < midX && Newpoint[i].CurrentPoint.Position.Y > midY) { orderedPoints[2] = argPoints[i]; } else if (Newpoint[i].CurrentPoint.Position.X > midX && Newpoint[i].CurrentPoint.Position.Y > midY) { orderedPoints[3] = argPoints[i]; } } } List<Card> objects = new List<Card>(); lock (cards) { foreach (Card c in cards) { if (pnpoly(orderedPoints, c.CurrentPosition.X, c.CurrentPosition.Y)) { objects.Add(c); } } } if (objects.Count > 0) { Gesture_Event_Grouping gestureEvent = new Gesture_Event_Grouping(); gestureEvent.Points = orderedPoints; gestureEvent.Senders = objects.ToArray(); Gesture_List.addGesture(gestureEvent); Gesture_Grouping_Listener gestureListener = new Gesture_Grouping_Listener(this, gestureEvent); gestureEvent.Register(objects.ToArray(), orderedPoints); foreach (My_Point p in result) { points.Remove(p); } return gestureEvent; } return null; } else { return null; } }