圆和线段的交点

5

enter image description here

  • 我有一条线段(起点x1,y1,终点x2,y2(D = 5)),和一个圆(半径R,中心点x3,y3)

如何检查我的线段是否与我的圆相交?


1
你有阅读页面右侧的“相关链接”吗? - Mat
不涉及编程?http://math.stackexchange.com/ - Cody Gray
4个回答

5

作为初步检查,您可以使用叉积计算点与直线之间的距离:

(x1,y1) = p1, (x2,y2) = p2
(cx, cy) = c = circle center
delta = p2 - p1 (the difference vector)
unit = delta/norm(delta) (the unit vector along the line segment)
(c-p1) x unit = (cx-x1) * unity - (cy-y1) * unitx = d (distance of the circle center to the line)

请注意,d有一个方向(符号)。
如果d超出范围[-R,R],则线段不能与圆相交。
如果您的线段不太移动,可以保存单位向量以供后续重用。
如果圆确实与线相交(而不是线段),它仍然可能不与线段相交。检查以下三个条件:
- p1在圆内;norm(p1-c) < R - p2在圆内;norm(p2-c) < R - 从线到圆心的最近点位于p1p2之间: (unit . p1 < unit . c < unit . p2) or (unit . p2 < unit . c < unit . p1)其中.是向量点积。
如果这些条件都不成立,则它们不相交。
您可能还需要知道它们相交的位置:
perp = (-unity, unitx) (The perpendicular vector)
pclosest = perp * d + c (The point on the line closest to the circle center)
dline = sqrt(R^2 - d^2) (The distance of the intersection points from pclosest)
i{1,2} = ±dline * unit + pclosest

显然,您需要单独检查{1,2}是否位于p1p2

,就像我们在上面第三个条件中所做的那样。


C x 单位不是圆到直线的距离。你必须使用 (c-p1) 代替 c。其余部分应该是正确的。 - D-rk
@Dirk,感谢您指出问题,已经修复。 - enobayram

2
如果您有一个表示线段的Line2D,以及一个表示圆心的Point2D,只需检查line.ptSegDist(center) <= radius是否成立即可。请注意保留HTML标签。

我认为这并不完全正确。你应该使用ptSegDist方法,因为对于ptLineDist,“测量的距离是指定点与由此Line2D定义的无限延伸线上最近点之间的距离”。问题发布者特别询问了线段交叉点。 - madej

0
你有两个隐式方程:对于圆,是(x-x0)^2+(y-y0)^2-r^2=0,而对于直线,则为v2*x-v1*y=v2*x0-v1*y0(其中v1=x1-x2,v2=y1-y2)。只需要解这个方程组,然后检查解是否在你的线段上(例如,检查解的x和y坐标是否在两个角点的相应坐标之间)。

0
(y2-y1)/(x2-x1)*x + D = y(x-x3)^2 + (y-y3)^2 = R^2 推导出 (x, y)。然后判断 (x, y) 是否属于你的线段。

这里的D的值是多少? - Shiladittya Chakraborty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接