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.

Scroll al inicio
Abrir chat
1
Hola
¿En qué podemos ayudarte?