Dưới đây là một cách tiếp cận có thể. Hàm trả về đúng hoặc sai tùy thuộc vào việc đa giác có bất kỳ góc nào dưới một kích thước nhất định hoặc nằm trong một phạm vi xung quanh một góc mục tiêu. Chỉ cần ghi nhớ đây là một cách tiếp cận rất đơn giản và giả định số hóa đường thẳng. Tôi kiểm tra một vòng tròn, nhưng không kiểm tra các đường cong hoặc các khả năng khác có thể làm tăng chức năng.
angleTarget = góc mong muốn (ví dụ 90).
edgeVariance = bánh quế cho phép của đường thẳng (ví dụ: thay đổi hướng 0,5 độ cho phép).
angleVariance = độ lệch cho phép của góc mong muốn (ví dụ 1 nếu 91 độ là 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;
}