C# C语言中的圆与线段碰撞#

C# C语言中的圆与线段碰撞#,c#,geometry,collision-detection,C#,Geometry,Collision Detection,我正在尝试实现一种方法来检查圆和线是否相交。我使用了大部分代码(根据答案进行了修复),并对代码进行了一些修改,以使用点,而不是向量2f 这就是我目前拥有的: private bool CircleLineIntersect(int x, int y, int radius, Point linePoint1, Point linePoint2) { Point p1 = new Point(linePoint1.X,linePoint1.Y); P

我正在尝试实现一种方法来检查圆和线是否相交。我使用了大部分代码(根据答案进行了修复),并对代码进行了一些修改,以使用
,而不是
向量2f

这就是我目前拥有的:

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;
        }
private bool CircleLineIntersect(int x,int y,int radius,Point linePoint1,Point linePoint2){
点p1=新点(线点1.X,线点1.Y);
点p2=新点(线点2.X,线点2.Y);
p1.X-=X;
p1.Y-=Y;
p2.X-=X;
p2.Y-=Y;
浮点dx=p2.X-p1.X;
浮点dy=p2.Y-p1.Y;
float dr=(float)Math.Sqrt((double)(dx*dx)+(double)(dy*dy));
浮点D=(p1.X*p2.Y)-(p2.X*p1.Y);
浮点数di=(半径*半径)*(dr*dr)-(D*D);
如果(di<0)返回false;
否则返回true;
}
它看起来与算法一致,所以我不确定问题出在哪里

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

编辑:


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

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


也许你在数学中对直线和线段这两个术语有误解。

你的问题是什么?这段代码以什么方式不符合您的要求?@Aron它似乎计算不正确。例如,输入x=1272,y=1809,radius=80,linePoint1={x=1272,y=2332},linePoint2={x=1272,y=2544}不应该有交点(y+radius小于线段的两个y值),但函数返回true。我需要该函数测试线段,而不是直线。有什么我可以改变,使它测试的部分,而不是线?也许是测试交点是否在线段内?我添加了一些代码来测试交点是否在线段内,现在它似乎工作正常(尽管我不确定它的效率如何)。