En un polígono, además de los vértices, siempre puede venir bien disponer de las aristas coleccionadas como objetos. Una arista viene a ser el equivalente a una línea, así pues, vamos a implementar una pequeña clase a la que llamaremos “line” con algunas propiedades que nos vendrán bien para futuras rutinas.
A continuación el código de la clase “line”:
public class line
{
public line() { }
public line(Point3D _StartPoint, Point3D _EndPoint)
{
this.StartPoint = _StartPoint;
this.EndPoint = _EndPoint;
}
public Point3D StartPoint { get; set; } = new Point3D();
public Point3D EndPoint { get; set; } = new Point3D();
public double Length
{
get
{
return StartPoint.DistanceTo(EndPoint);
}
}
public double Angle
{
get
{
return StartPoint.AngleTo(EndPoint);
}
}
public Point3D MidPoint
{
get
{
double x = (StartPoint.x + EndPoint.x) / 2;
double y = (StartPoint.y + EndPoint.y) / 2;
double z = (StartPoint.z + EndPoint.z) / 2;
return new Point3D(x, y, z);
}
}
}
Ahora la función que va a devolvernos la lista de aristas que forman un conjunto de puntos que representan los vértices de un polígono.
/// <summary>
/// Obtiene las coordenadas de las aristas de un polígono
/// definidas como líneas
/// </summary>
/// <param name=”lstVertex“>Lista de vértices del polígono</param>
/// <returns>La lista de líneas que representan las aristas del polígono</returns>
public static List<line> CalculeEdges(List<Point3D> lstVertex)
{
List<line> lstEdges = new List<line>();
if (lstVertex.Count < 2)
return null;
for (int i = 0; i <= lstVertex.Count – 2; i++)
{
line l1 = new line(lstVertex[i], lstVertex[i + 1]);
if (l1.Length > 0)
lstEdges.Add(l1);
}
if (!lstEdges.Last().EndPoint.Equals(lstEdges.First().StartPoint))
{
line l2 = new line(lstEdges.Last().EndPoint, lstEdges.First().StartPoint);
lstEdges.Add(l2);
}
return lstEdges;
}
Para ponerlo a prueba puedes escribir una pequeña rutina parecida a la siguiente:
private void calcularAristasPolí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));
List<line> aristas = MyClase.CalculeEdges(pts);
if (aristas != null)
{
string c = “Lista de aristas localizadas:” + Environment.NewLine;
foreach (line arista in aristas)
{
c += arista.StartPoint.ToString() + “—>>” + arista.EndPoint.ToString() + Environment.NewLine;
}
MessageBox.Show(c, “Test”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
Si todo ha ido bien deberías obtener un resultado parecido al siguiente:
Ponlo a prueba, piensa en cómo mejorarlo y comparte con nosotros tus progresos.