多边形线碰撞检测

Polygon-Line Collision Detection

本文关键字:碰撞检测 多边形      更新时间:2023-10-16

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

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;
}

我认为这个链接对你来说可能很有趣,可以获得专业知识:多边形中点问题

对于C代码,还有一个链接资源:多边形中的点-C代码

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

你需要检查多少几何体,一个点是否在多边形内?

附言:我刚刚发现这篇关于这个问题的帖子:-)堆栈溢出-多边形中的点

我可以建议您看一看这本书,并在计算之前搜索线-线相交2D和范围检查。

此外,您的代码需要除以零检查,并需要进一步考虑倒数线尺寸和公差。

对于直线交点,您似乎有不正确的方程。我认为这里列出了正确的方程

也就是说,解决这个问题的一个好方法是查看直线是否与多边形上的任何线段相交。因此,为了测试这一点,计算直线与多边形边缘每条直线的交点,如果该点在多边形的线段内,则存在交点(查看该点是否在线段端点定义的边界内)。(也许这就是你想要做的,但这有点难说,因为你没有给出解释。)