C#中的圆和线段冲突
本文关键字:冲突 段冲突 | 更新日期: 2023-09-27 18:29:47
我正在尝试实现一个方法来检查圆和线是否相交。我使用了大部分代码(根据答案进行了修复),并对代码进行了一些修改,使其使用Point
的,而不是Vector2f
的。
这就是我目前拥有的:
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;
}
它看起来与这个算法一致,所以我不确定问题出在哪里
如果有人能提供指导,我们将不胜感激。
编辑:
它的计算似乎不正确。例如,对于输入x=1272,y=1809,radius=80,linePoint1={x=1272、y=2332},linePoint2={x=1272和y=2544},不应该存在交集(y+radius小于线段的两个y值),但函数返回true。
测试用例中存在错误。它不仅相交,而且直线穿过圆心。这条线是一条垂直线(X=1272)。你的圆圈以(12721809)为中心。ERGO它穿过中心。
也许你在数学中对直线和线段这两个术语有误解。