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.

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