Abaixo está uma abordagem possível. A função retorna verdadeiro ou falso, dependendo se o polígono tiver ângulos abaixo de um determinado tamanho ou estiver dentro de um intervalo em torno de um ângulo alvo. Lembre-se de que esta é uma abordagem muito simples e assume a digitalização em linha reta. Testo um círculo, mas não testo curvas ou outras possibilidades que possam atrapalhar a função.
angleTarget = ângulo desejado (ex. 90).
edgeVariance = waffle permitido de linha reta (por exemplo, alteração de direção de 0,5 graus permitida).
angleVariance = desvio permitido do ângulo desejado (ex. 1, se 91 graus estiver OK).
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;
}