Obtener la caja de abarque de un polígono

Con esta pequeña rutina podrás obtener el punto mínimo y máximo dentro de un conjunto de puntos. Ambos puntos representarían el rectángulo mínimo que acogería en su interior un polígono.

A continuación el código fuente:

        /// <summary>

        /// Obtiene las coordenadas mínima y máxima de la caja de abarque de un polígono

        /// </summary>

        /// <param name=”MinPt“>Coordenada mínima</param>

        /// <param name=”MaxPt“>Coordenada máxima</param>

        /// <returns>True o False en función de si tiene éxito o no</returns>

        public static bool BoundBox(List<Point3D> lstVertex, ref Point3D MinPt, ref Point3D MaxPt)

        {

            try

            {

                double MinX = 0;

                double MinY = 0;

                double MinZ = 0;

                double MaxX = 0;

                double MaxY = 0;

                double MaxZ = 0;

                bool bVar = false;

                foreach (Point3D p in lstVertex)

                {

                    if (bVar == false)

                    {

                        MinX = p.x;

                        MinY = p.y;

                        MinZ = p.z;

                        MaxX = p.x;

                        MaxY = p.y;

                        MaxZ = p.z;

                        bVar = true;

                    }

                    else

                    {

                        if (MinX > p.x)

                            MinX = p.x;

                        else if (MaxX < p.x)

                            MaxX = p.x;

                        if (MinY > p.y)

                            MinY = p.y;

                        else if (MaxY < p.y)

                            MaxY = p.y;

                        if (MinZ > p.z)

                            MinZ = p.z;

                        else if (MaxZ < p.z)

                            MaxZ = p.z;

                    }

                }

                MinPt = new Point3D(MinX, MinY, MinZ);

                MaxPt = new Point3D(MaxX, MaxY, MaxZ);

                return true;

            }

            catch (Exception ex)

            {

                MessageBox.Show(“Error:” + Environment.NewLine + ex.Message, “Test”,

                                MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;

            }

        }

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

        private void cajaDeAbarqueDePolí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));

            Point3D ptMin = new Point3D();

            Point3D ptMax = new Point3D();

            if (MyClase.BoundBox(pts, ref ptMin, ref ptMax))

            {

                MessageBox.Show(“Esquina inferior izquierda: “ + ptMin.ToString() + Environment.NewLine +

                                “Esquina superior derecha: “ + ptMax.ToString(), “Test”,

                                MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

        }

Si todo está 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