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.

 

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