public void AddPunto(Punto p)
        {
            //Comprobamos si el punto se encuentra en la lista, si es así lanzamos una excepción.
            foreach (Punto p2 in puntos)
            {
                if (p2.Equals(p))
                {
                    PolygonException dpe = new PolygonException("Se ha intentado añadir un punto duplicado.\n");
                    throw dpe;
                }
            }

            puntos.Add(p);
        }
        public List <Punto> GiftWrapper()
        {
            //Comprobamos si hay 3 o menos puntos en el polígono.
            if (puntos.Count < 3)
            {
                PolygonException pe = new PolygonException("El poligono debe de tener 3 puntos o más para calcular su envolvente convexa.\n");
                throw pe;
            }
            else if (puntos.Count == 3)
            {
                return(puntos);
            }

            int          i0 = GetPuntoBajo(); //Obtenemos el punto más bajo del polígono.
            int          i  = i0;             //Asignamos el índice del punto más bajo como primer anclaje.
            int          k  = 0;              //Índice del punto con el ángulo más pequeño.
            double       angulo;
            double       anguloMin    = 0.0;
            List <Punto> convexHull   = new List <Punto>();
            Punto        aux          = new Punto(puntos[i0].GetX() + 1, puntos[i0].GetY()); //Este punto auxiliar sirve para crear el primer eje del algoritmo.
            Vector       previousEdge = new Vector(puntos[i], aux);                          //Creamos el primer eje del algoritmo.
            Vector       newEdge;

            //Añadimos el primer punto a la envolvente convexa.
            convexHull.Add(puntos[i0]);

            do
            {
                //Inicializamos el angulo.
                anguloMin = 361.0;
                //Recorremos los demás puntos del polígono.
                for (int j = 0; j < puntos.Count(); j++)
                {
                    if (j != i)
                    {
                        //Creamos el nuevo vector.
                        newEdge = new Vector(puntos[i], puntos[j]);

                        //Calculamos el angulo del anterior vector con el nuevo.
                        angulo = previousEdge.AnguloTo(newEdge);

                        //Comparamos el ángulo.
                        if ((angulo <= anguloMin))
                        {
                            anguloMin = angulo;
                            k         = j;
                        }
                    }
                }

                //Añadimos el punto nuevo a la convex Hull.
                convexHull.Add(puntos[k]);

                //Actualizamos el eje anterior.
                previousEdge = new Vector(puntos[i], puntos[k]);

                //Actualizamos el índice del punto anterior.
                i = k;
            } while (i != i0);

            return(convexHull);
        }