C#中的圆和线段碰撞

时间:2013-09-02 03:48:03

标签: c# geometry collision-detection

我正在尝试实现一种检查圆和线是否相交的方法。我使用了大部分this代码(根据答案修复),并且还修改了一些代码以使用Point代替Vector2f's。

这是我目前所拥有的:

private bool CircleLineIntersect(int x, int y, int radius, Point linePoint1, Point linePoint2) {
            Point p1 = new Point(linePoint1.X,linePoint1.Y);
            Point p2 = new Point(linePoint2.X,linePoint2.Y);
            p1.X -= x;
            p1.Y -= y;
            p2.X -= x;
            p2.Y -= y;
            float dx = p2.X - p1.X;
            float dy = p2.Y - p1.Y;
            float dr = (float)Math.Sqrt((double)(dx * dx) + (double)(dy * dy));
            float D = (p1.X * p2.Y)  -  (p2.X * p1.Y);

            float di = (radius * radius) * (dr * dr) - (D * D);

            if (di < 0) return false;
            else return true;
        }

它看起来与this算法一致,所以我不确定问题是什么。

如果有人能提供指导,我们将不胜感激。

编辑:

它似乎没有正确计算。例如,输入x = 1272,y = 1809,半径= 80,linePoint1 = {X = 1272,Y = 2332},linePoint2 = {X = 1272,Y = 2544},不应有交点(y +半径)小于线段的y值),但函数返回true。

1 个答案:

答案 0 :(得分:1)

测试用例中存在错误。它不仅相交,而且你的线穿过圆心。该线是垂直线(X = 1272)。你的圆圈以(1272,1809)为中心。 ERGO穿过中心。

也许你在数学中的术语线和线段之间存在误解。