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.