Obtener las coordenadas de las aristas de un polígono

En un polígono, además de los vértices, siempre puede venir bien disponer de las aristas coleccionadas como objetos. Una arista viene a ser el equivalente a una línea, así pues, vamos a implementar una pequeña clase a la que llamaremos “line” con algunas propiedades que nos vendrán bien para futuras rutinas.

A continuación el código de la clase “line”:

    public class line

    {

        public line() { }

 

        public line(Point3D _StartPoint, Point3D _EndPoint)

        {

            this.StartPoint = _StartPoint;

            this.EndPoint = _EndPoint;

        }

 

        public Point3D StartPoint { get; set; } = new Point3D();

        public Point3D EndPoint { get; set; } = new Point3D();

        public double Length

        {

            get

            {

                return StartPoint.DistanceTo(EndPoint);

            }

        }

        public double Angle

        {

            get

            {

                return StartPoint.AngleTo(EndPoint);

            }

        }

 

        public Point3D MidPoint

        {

            get

            {

                double x = (StartPoint.x + EndPoint.x) / 2;

                double y = (StartPoint.y + EndPoint.y) / 2;

                double z = (StartPoint.z + EndPoint.z) / 2;

                return new Point3D(x, y, z);

            }

        } 

    }

Ahora la función que va a devolvernos la lista de aristas que forman un conjunto de puntos que representan los vértices de un polígono.

        /// <summary>

        /// Obtiene las coordenadas de las aristas de un polígono

        /// definidas como líneas

        /// </summary>

        /// <param name=”lstVertex“>Lista de vértices del polígono</param>

        /// <returns>La lista de líneas que representan las aristas del polígono</returns>

        public static List<line> CalculeEdges(List<Point3D> lstVertex)

        {

            List<line> lstEdges = new List<line>();

            if (lstVertex.Count < 2)

                return null;

            for (int i = 0; i <= lstVertex.Count – 2; i++)

            {

                line l1 = new line(lstVertex[i], lstVertex[i + 1]);

                if (l1.Length > 0)

                    lstEdges.Add(l1);

            }

            if (!lstEdges.Last().EndPoint.Equals(lstEdges.First().StartPoint))

            {

                line l2 = new line(lstEdges.Last().EndPoint, lstEdges.First().StartPoint);

                lstEdges.Add(l2);

            }

            return lstEdges;

        }

Para ponerlo a prueba puedes escribir una pequeña rutina parecida a la siguiente:

        private void calcularAristasPolígonoToolStripMenuItem_Click(object sender, EventArgs e)

        {

            List<Point3D> pts = new List<Point3D>();

            pts.Add(new Point3D(10, 5, 0));

            pts.Add(new Point3D(10, 10, 0));

            pts.Add(new Point3D(12.5, 10, 0));

            pts.Add(new Point3D(15, 12.5, 0));

            pts.Add(new Point3D(17.5, 12.5, 0));

            pts.Add(new Point3D(17.5, 5, 0));

            pts.Add(new Point3D(15, 5, 0));

            pts.Add(new Point3D(15, 7.5, 0));

            pts.Add(new Point3D(12.5, 5, 0));

            List<line> aristas = MyClase.CalculeEdges(pts);

            if (aristas != null)

            {

                string c = “Lista de aristas localizadas:” + Environment.NewLine;

                foreach (line arista in aristas)

                {

                    c += arista.StartPoint.ToString() + “—>>” + arista.EndPoint.ToString() + Environment.NewLine;

                }

                MessageBox.Show(c, “Test”, MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

        }

Si todo ha ido bien deberías obtener un resultado parecido al siguiente:

   

Ponlo a prueba, piensa en cómo mejorarlo y comparte con nosotros tus progresos.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Información básica sobre protección de datos Ver más

  • Responsable: MTB Software de Ponent, SLU.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Hostinet, SL que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver Política de cookies
Privacidad