多边形线碰撞检测

时间:2012-04-07 11:52:33

标签: c++ math

我正在尝试找到一个公式来确定一条线是否与多边形相交。我试过,但下面的代码不能正常工作。

bool Check_Collision(float x1,float y1, float x2, float y2)
{
        int j=MyPolyVector.size()-1;
        for (int i=0;i<MyPolyVector.size();i++)
        {
                float x3=MyPolyVector[i].X;
                float x4=MyPolyVector[j].X;
                float y3=MyPolyVector[i].Y;
                float y4=MyPolyVector[j].Y;

                float denom= ((y4-y3)*(x2-x1))-((x4-x3)*(y2-y1));
                float ua = (((x4-x3)*(y1-y3))-((y4-y3)*(x1-x3)))/denom;
                float ub = (((x2-x1)*(y1-y3))-((y2-y1)*(x1-x3)))/denom;
                j=i;

                if(ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f) return true;
        }
        return false;
}

3 个答案:

答案 0 :(得分:2)

我认为这个链接对您来说可能很有趣,以获得专业知识: Point in Polygon Problem

对于C代码,还有一个链接资源: Point in Polygon - C Code

这个问题主要是在OpenGL上下文中处理的,解决这个问题的主要思想是计算多边形和任何直线的交点,这些直线通过你的点进行检查。

您需要检查多少几何体,多边形内的一个点是什么?

PS:我刚刚发现这篇关于这个问题的帖子:-) Stackoverflow - Point in Polygon

答案 1 :(得分:0)

我可以建议您查看this book并在计算之前搜索行线交叉点2D和范围检查。

此外,您的代码需要进行零检查,并进一步考虑相反的线尺寸和公差。

答案 2 :(得分:0)

对于线路交叉点,您似乎有错误的等式。我认为正确的公式列在 here

也就是说,解决此问题的一个好方法是查看该线是否与多边形上的任何线段相交。因此,为了测试这一点,计算线与多边形边缘的每条线的交点,如果这个点在多边形的线段内,那么就有一个交点(看看该点是否在由该段的终点)。 (也许这就是你要做的事情,但由于你没有给出任何解释,这有点难以辨别。)