Dirección de un polígono. Saber si los vértices de un polígono están en sentido horario o antihorario

En ocasiones puede que necesites conocer la dirección de los vértices que componen un polígono, esto es importante cuando vas a realizar operaciones de análisis geométrico y generación de topologías uniformes.

La función que presentamos recibe una lista de objetos Point3D (ya conocido de posts anteriores) y responde indicando alguno de los tres casos posibles: Trigonométrico, Horario o Indefinido (si hay errores o no es un polígono correcto).

Para ello hemos implementado una pequeña lista de enumeración que usaremos como tipo para la respuesta de la función principal.

        public enum DirectionPolygon

        {

            Undefined = 0,

            Trigonometric = 1,

            ClockWise = -1

        }

A continuación el cuerpo de la función:

        /// <summary>

        /// Establece el sentido en el que están ordenados los vértices de un polígono

        /// </summary>

        /// <param name=”ListVertex“>Lista de puntos 3D del polígono</param>

        /// <returns>Antihorario, horario o indefinido (si hay problemas)</returns>

        public static DirectionPolygon GetDirectionPolygon (List<Point3D> ListVertex)

        {

            int i;

            double r = 0;

            try

            {

                // Prevenir si el punto final es distinto del punto inicial

                Point3D c1 = ListVertex.First();

                Point3D c2 = ListVertex.Last();

                if (!c1.Equals(c2))

                {

                    ListVertex.Add(new Point3D(c1.x, c1.y, c1.z));

                }

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

                {

                    double x1 = ListVertex[i].x;

                    double y1 = ListVertex[i].y;

                    double x2 = ListVertex[i + 1].x;

                    double y2 = ListVertex[i + 1].y;

                    r += (x2 – x1) * (y2 + y1) / 2;

                }

                if (r < 0)

                {

                    return DirectionPolygon.Trigonometric;

                }

                else

                {

                    if (r > 0)

                    {

                        return DirectionPolygon.ClockWise;

                    }

                    else

                    {

                        return DirectionPolygon.Undefined;

                    }

                }

            }

            catch (Exception)

            {

                return DirectionPolygon.Undefined;

            }

        }

Para ponerlo a prueba puedes implementar un pequeño método pasándole una lista de puntos, por ejemplo:

        private void direcciónDePolígonoToolStripMenuItem_Click(object sender, EventArgs e)

        {

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

            listPts.Add(new Point3D(0, 0, 0));

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

            listPts.Add(new Point3D(10, 20, 0));

            listPts.Add(new Point3D(0, 20, 0));

            MyClase.DirectionPolygon direct = MyClase.GetDirectionPolygon(listPts);

            MessageBox.Show(direct.ToString());

            listPts.Reverse();

            direct = MyClase.GetDirectionPolygon(listPts);

            MessageBox.Show(direct.ToString());

        }

Si todo va bien deberías recibir dos mensajes como los siguientes:

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?