Exemple #1
0
        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;
        }