【发布时间】:2013-05-08 01:43:39
【问题描述】:
我正在使用 Autocad 的 .NET API,我有一个算法(我没有编写)来确定一个点是否位于多边形内(仅限直线)。
我一直在相同的 51 个多边形上反复测试我的命令。 99% 它将完美运行。每隔一段时间,它会在一个或多个多边形上失败,对于我在折线的边界框内创建的超过 2000 个点返回 false。当折线是一个简单的矩形并且所有点分布在折线内的网格中时,我已经看到它失败了。在这种情况下,它应该返回 true 超过 2000 次。它永远不会只因为其中的一点而失败,它会全部失败。我已经确认这些点在我期望的位置正确创建,并且多边形的顶点在我期望的位置。当它失败时,最后一个点的最后一个角度变量正好是两倍 PI。
我没有做任何多线程。我正在做的唯一可能“有趣”的事情是 COM 与 Excel 的互操作。这是在使用该算法为部件提交事务之后发生的,我确信我正在清理我所有的 COM 对象。如果没有 COM 互操作部分,我无法重现故障,但我认为我已经对其进行了足够的测试,还没有足够的证据。
有什么想法可能是错的吗?
bool IsInsidePolygon(Polyline polygon, Point3d pt)
{
int n = polygon.NumberOfVertices;
double angle = 0;
Point pt1, pt2;
for (int i = 0; i < n; i++)
{
pt1.X = polygon.GetPoint2dAt(i).X - pt.X;
pt1.Y = polygon.GetPoint2dAt(i).Y - pt.Y;
pt2.X = polygon.GetPoint2dAt((i + 1) % n).X - pt.X;
pt2.Y = polygon.GetPoint2dAt((i + 1) % n).Y - pt.Y;
angle += Angle2D(pt1.X, pt1.Y, pt2.X, pt2.Y);
}
if (Math.Abs(angle) < Math.PI)
return false;
else
return true;
}
public struct Point
{
public double X, Y;
};
public static double Angle2D(double x1, double y1, double x2, double y2)
{
double dtheta, theta1, theta2;
theta1 = Math.Atan2(y1, x1);
theta2 = Math.Atan2(y2, x2);
dtheta = theta2 - theta1;
while (dtheta > Math.PI)
dtheta -= (Math.PI * 2);
while (dtheta < -Math.PI)
dtheta += (Math.PI * 2);
return (dtheta);
}
【问题讨论】: