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.