Di bawah ini adalah salah satu pendekatan yang mungkin. Fungsi mengembalikan benar atau salah tergantung jika poligon memiliki sudut di bawah ukuran tertentu atau berada dalam kisaran di sekitar sudut target. Perlu diingat bahwa ini adalah pendekatan yang sangat sederhana dan mengasumsikan digitalisasi garis lurus. Saya menguji lingkaran, tetapi tidak menguji kurva atau kemungkinan lain yang bisa meningkatkan fungsi.
angleTarget = sudut yang diinginkan (mis. 90).
edgeVariance = wafel yang diizinkan dari garis lurus (mis. perubahan arah 0,5 derajat diizinkan).
angleVariance = penyimpangan yang diijinkan dari sudut yang diinginkan (mis. 1 jika 91 derajat 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;
}