private void PolygonCutterViewer_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && PolygonCutterViewer.SelectedPolygonTriangle.SelectionType != PolygonTriangle.SelectionTypes.None && SelectionChoice == SelectionChoices.Move) { PolygonTriangle SelectedPolygonTriangle = PolygonCutterViewer.SelectedPolygonTriangle; #region Move Polygon ActivePolygon = SelectedPolygonTriangle.ActivePolygon; if (SelectedPolygonTriangle.SelectionType == PolygonTriangle.SelectionTypes.Vertex)// Move Vertex. { ReplaceVertexIndex = -1; if (Control.ModifierKeys == Keys.Alt)//Snap to closest vertex. { double MinDistanceToVertex = 5; for (int V = 0; V < ActivePolygon.ArrayVertex.Length; V++) { if (V == SelectedPolygonTriangle.VertexIndex) { continue; } double DistanceToVertexX = e.X - ActivePolygon.ArrayVertex[V].X; double DistanceToVertexY = e.Y - ActivePolygon.ArrayVertex[V].Y; double DistanceToVertex = Math.Sqrt(Math.Pow(DistanceToVertexX, 2) + Math.Pow(DistanceToVertexY, 2)); if (DistanceToVertex < MinDistanceToVertex) { MinDistanceToVertex = DistanceToVertex; ReplaceVertexIndex = V; } } } if (ReplaceVertexIndex >= 0) { ActivePolygon.ArrayVertex[SelectedPolygonTriangle.VertexIndex].X = ActivePolygon.ArrayVertex[ReplaceVertexIndex].X; ActivePolygon.ArrayVertex[SelectedPolygonTriangle.VertexIndex].Y = ActivePolygon.ArrayVertex[ReplaceVertexIndex].Y; ActivePolygon.UpdateWorldPosition(Vector2.Zero, 0f); } else { ActivePolygon.ArrayVertex[SelectedPolygonTriangle.VertexIndex].X = e.X; ActivePolygon.ArrayVertex[SelectedPolygonTriangle.VertexIndex].Y = e.Y; ActivePolygon.UpdateWorldPosition(Vector2.Zero, 0f); } } else//Move Polygon { SelectedPolygonTriangle.Move(e.X - MouseEventOld.X, e.Y - MouseEventOld.Y); } #endregion } else { PolygonCutterViewer.SelectedPolygonTriangle.SelectionType = PolygonTriangle.SelectionTypes.None; for (int P = PolygonCutterViewer.ListPolygon.Count - 1; P >= 0; --P) { Polygon ActivePolygon = PolygonCutterViewer.ListPolygon[P]; Vector2 MousePosition = new Vector2(e.X, e.Y); PolygonTriangle PolygonResult = ActivePolygon.PolygonCollisionWithMouse(e.X, e.Y); if (PolygonResult.SelectionType != PolygonTriangle.SelectionTypes.None) { PolygonCutterViewer.SelectedPolygonTriangle = PolygonResult; } } switch (SelectionChoice) { case SelectionChoices.SplitPolygon: PolygonCutterViewer.SplittingPoint2 = new Vector2(e.X, e.Y); break; } } if (Control.ModifierKeys == Keys.Control && PolygonCutterViewer.SelectedPolygonTriangle != null) { PolygonCutterViewer.SelectedPolygonTriangle.SelectionType = PolygonTriangle.SelectionTypes.Polygon; } MouseEventOld = e; }