Beispiel #1
0
        private static IShape BuildCurrentShape(ShapeMode mode, RealPoint startPoint, RealPoint endPoint)
        {
            IShape output = null;

            switch (mode)
            {
            case ShapeMode.Rectangle:
                output = new PolygonRectangle(startPoint, endPoint.X - startPoint.X, endPoint.Y - startPoint.Y);
                break;

            case ShapeMode.Circle:
                output = new Circle(new Segment(startPoint, endPoint).Barycenter, startPoint.Distance(endPoint) / 2);
                break;

            case ShapeMode.CircleFromCenter:
                output = new Circle(startPoint, startPoint.Distance(endPoint));
                break;

            case ShapeMode.Segment:
                output = new Segment(startPoint, endPoint);
                break;

            case ShapeMode.Line:
                output = new Line(startPoint, endPoint);
                break;
            }

            return(output);
        }
Beispiel #2
0
        public static double Distance(Line line, RealPoint point)
        {
            // Pour calculer la distance, on calcule la droite perpendiculaire passant par ce point
            // Puis on calcule l'intersection de la droite et de sa perpendiculaire
            // On obtient la projection orthogonale du point, qui est le point de la droite le plus proche du point donné
            // On retourne la distance entre ces deux points

            return(point.Distance(line.GetProjection(point)));
        }
Beispiel #3
0
        public static double Distance(Segment segment, RealPoint point)
        {
            // Le raisonnement est le même que pour la droite cf Droite.Distance

            Line             perpendicular = segment.GetPerpendicular(point);
            List <RealPoint> cross         = segment.GetCrossingPoints(perpendicular);

            double distance;

            // Seule différence : on teste si l'intersection appartient bien au segment, sinon on retourne la distance avec l'extrémité la plus proche
            if (cross.Count > 0 && segment.Contains(cross[0]))
            {
                distance = point.Distance(cross[0]);
            }
            else
            {
                double distanceDebut = point.Distance(segment.StartPoint);
                double distanceFin   = point.Distance(segment.EndPoint);

                distance = Math.Min(distanceDebut, distanceFin);
            }

            return(distance);
        }
Beispiel #4
0
        public override List <int>[] DiagnosticLine(int distance, SensAR sens)
        {
            List <int>[] output = new List <int> [2];
            output[0] = new List <int>();
            output[1] = new List <int>();

            RealPoint startPos = new RealPoint(Position.Coordinates);

            MoveForward(distance, false);

            while ((Position.Coordinates.X != _destination.Coordinates.X ||
                    Position.Coordinates.Y != _destination.Coordinates.Y) && !Execution.Shutdown)
            {
                double dist = startPos.Distance(Position.Coordinates);
                output[0].Add((int)(dist * 1000));
                output[1].Add((int)(dist * 1000));
                Thread.Sleep(1);
            }

            return(output);
        }
Beispiel #5
0
        private void GenerateRandomBuoys()
        {
            Circle        zone    = new Circle(new RealPoint(1500, 0), 500);
            List <Circle> randoms = new List <Circle>();

            Random r = new Random();

            for (int i = 0; i < 6; i++)
            {
                RealPoint random = new RealPoint(r.Next(1000, 1500) + (i < 3 ? 0 : 500), r.Next(36, 500 - 36));
                Circle    c      = new Circle(random, 36);
                if (zone.Contains(c) && !randoms.Exists(o => random.Distance(o) < 36 + 2))
                {
                    _buoys.Add(new Buoy(random, Color.White, i % 2 == 0 ? Buoy.Green : Buoy.Red, true));
                    randoms.Add(c);
                }
                else
                {
                    i -= 1;
                }
            }
        }
Beispiel #6
0
        public static double Distance(Line line1, Line line2)
        {
            double distance;

            if (!line1.IsParallel(line2))
            {
                // Si les droites se croisent la distance est de 0
                distance = 0;
            }
            else
            {
                // Sinon elles sont parrallèles donc on trace une perdendiculaire et une mesure la distance entre les croisements avec les 2 droites

                Line perpendicular = line1.GetPerpendicular(new RealPoint(0, 0));

                RealPoint p1 = line1.GetCrossingPoints(perpendicular)[0];
                RealPoint p2 = line2.GetCrossingPoints(perpendicular)[0];

                distance = p1.Distance(p2);
            }

            return(distance);
        }
Beispiel #7
0
        public static bool Contains(Circle containingCircle, RealPoint containedPoint)
        {
            // Pour contenir un point, celui si se trouve à une distance inférieure au rayon du centre

            return(containedPoint.Distance(containingCircle.Center) <= containingCircle.Radius);
        }
Beispiel #8
0
        public static double Distance(Circle circle, RealPoint point)
        {
            // C'est la distance entre le centre du cercle et le point moins le rayon du cercle

            return(Math.Max(0, point.Distance(circle.Center) - circle.Radius));
        }
Beispiel #9
0
        public static double Distance(RealPoint point, Polygon polygon)
        {
            if (polygon is PolygonRectangle)
            {
                // Plus rapide que la méthode des polygones
                RealPoint topLeft     = polygon.Sides[0].StartPoint;
                RealPoint topRight    = polygon.Sides[1].StartPoint;
                RealPoint bottomRight = polygon.Sides[2].StartPoint;
                RealPoint bottomLeft  = polygon.Sides[3].StartPoint;

                double distance;

                if (point.X < topLeft.X)
                {
                    if (point.Y < topLeft.Y)
                    {
                        distance = point.Distance(topLeft);
                    }
                    else if (point.Y > bottomRight.Y)
                    {
                        distance = point.Distance(bottomLeft);
                    }
                    else
                    {
                        distance = topLeft.X - point.X;
                    }
                }
                else if (point.X > bottomRight.X)
                {
                    if (point.Y < topLeft.Y)
                    {
                        distance = point.Distance(topRight);
                    }
                    else if (point.Y > bottomRight.Y)
                    {
                        distance = point.Distance(bottomRight);
                    }
                    else
                    {
                        distance = point.X - topRight.X;
                    }
                }
                else
                {
                    if (point.Y < topLeft.Y)
                    {
                        distance = topLeft.Y - point.Y;
                    }
                    else if (point.Y > bottomRight.Y)
                    {
                        distance = point.Y - bottomLeft.Y;
                    }
                    else
                    {
                        distance = 0;
                    }
                }

                return(distance);
            }

            // Distance jusqu'au segment le plus proche
            double minDistance = double.MaxValue;

            foreach (Segment s in polygon.Sides)
            {
                minDistance = Math.Min(s.Distance(point), minDistance);
            }

            return(minDistance);
        }
Beispiel #10
0
        private void pictureBoxTable_MouseMove(object sender, MouseEventArgs e)
        {
            semMove.WaitOne();
            Dessinateur.PositionCurseur = pictureBoxTable.PointToClient(MousePosition);

            if (pSelected != -1)
            {
                pointsPolaires[pSelected] = Dessinateur.Scale.ScreenToRealPosition(e.Location);

                trajectoirePolaire             = BezierCurve.GetPoints(pointsPolaires, (int)(numNbPoints.Value));//((int)pointsPolaires[0].Distance(pointsPolaires[pointsPolaires.Count - 1])) / 50);
                Dessinateur.TrajectoirePolaire = trajectoirePolaire;
                Dessinateur.PointsPolaire      = pointsPolaires;
            }

            if (boxSourisObstacle.Checked)
            {
                if ((DateTime.Now - dateCapture).TotalMilliseconds > 50)
                {
                    dateCapture = DateTime.Now;

                    Point            p         = Dessinateur.Scale.ScreenToRealPosition(pictureBoxTable.PointToClient(MousePosition));
                    List <RealPoint> positions = new List <RealPoint>();

                    positions.Add(Dessinateur.Scale.ScreenToRealPosition(pictureBoxTable.PointToClient(MousePosition)));
                    GameBoard.SetOpponents(positions);
                    //SuiviBalise.MajPositions(positions, Plateau.Enchainement == null || Plateau.Enchainement.DebutMatch == null);
                }
            }
            else
            {
                RealPoint posOnTable = Dessinateur.Scale.ScreenToRealPosition(pictureBoxTable.PointToClient(MousePosition));
                lblX.Text = posOnTable.X.ToString("0");
                lblY.Text = posOnTable.Y.ToString("0");

                bool hoverElement = false;

                foreach (GameElement element in GameBoard.Elements)
                {
                    if (posOnTable.Distance(element.Position) < element.HoverRadius)
                    {
                        element.IsHover = true;
                        hoverElement    = true;
                    }
                    else
                    {
                        element.IsHover = false;
                    }
                }

                if (hoverElement)
                {
                    this.Cursor = Cursors.Hand;
                }
                else
                {
                    this.Cursor = Cursors.Arrow;
                }

                //System.Threading.Tasks.Task.Factory.StartNew(() => ChercheTraj(new Position(Robots.GrosRobot.Position)));
            }

            semMove.Release();
        }