圆和线段交叉

时间:2012-01-29 10:35:47

标签: java math line geometry

enter image description here

  • 我有一个线段(开始x1,y1,结束x2,y2(假设D = 5))和a 圆(半径R,中心x3,y3)

如果我的线段与我的圆相交,我该如何检查?

4 个答案:

答案 0 :(得分:4)

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

(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位于圈内;范数(p1-c)< [R
  • p2位于圈内;范数(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

您显然需要单独检查i{1,2}p1之间是否p2,就像我们在第三个条件中所做的那样。

答案 1 :(得分:2)

如果您的线段有Line2D,而圆圈的中心有Point2D,那么只需检查line.ptSegDist(center) <= radius

答案 2 :(得分: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坐标是否在两个角点的相应坐标之间)。

答案 3 :(得分:0)

(x, y)(y2-y1)/(x2-x1)*x + D = y获取(x-x3)^2 + (y-y3)^2 = R^2。然后找出(x, y)是否属于您的细分受众群。