A continuación se muestra un enfoque posible. La función devuelve verdadero o falso dependiendo de si el polígono tiene algún ángulo por debajo de un cierto tamaño o está dentro de un rango alrededor de un ángulo objetivo. Solo tenga en cuenta que este es un enfoque muy simple y supone la digitalización en línea recta. Realizo pruebas para un círculo, pero no pruebo curvas u otras posibilidades que podrían disparar la función.
angleTarget = ángulo deseado (ej. 90).
edgeVariance = gofre permitido de línea recta (ej. cambio de dirección de 0.5 grados permitido).
angleVariance = desviación permitida del ángulo deseado (ej. 1 si 91 grados está bien).
Brian
private static bool AngleWithinTolerance(IPolygon pPoly, double angletarget, double edgeVariance, double angleVariance)
{
GeometryEnvironment geometryEnvironment = new GeometryEnvironment();
IConstructAngle constructAngle = geometryEnvironment as IConstructAngle;
IPointCollection ptcol = (IPointCollection)pPoly;
double angle;
//No circles!
if (ptcol.PointCount < 3) return false;
//Check angle made by last point first point and second point in the collection.
angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(ptcol.PointCount - 2), ptcol.get_Point(0), ptcol.get_Point(1)) * (180/3.14159250439667));
if (angle < edgeVariance || (angle < angletarget + angleVariance & angle > angletarget - angleVariance))
{
//Angle at index 0 is OK - check all other points in collection.
for (int x = 0; x != ptcol.PointCount - 2; x++)
{
angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(x), ptcol.get_Point(x + 1), ptcol.get_Point(x + 2)) * (180 / 3.14159250439667));
if (angle > edgeVariance & (angle > angletarget + angleVariance || angle < angletarget - angleVariance))
{
return false;
}
}
}
else
{
return false;
}
//never failed.
return true;
}