2011-05-23 87 views
9

我想确定线段与圆相交的点。例如,给定P0和P3之间的任何点(并假设您知道半径),确定P3的最简单方法是什么?线段交点交点

Circle

回答

5

你有一个方程组。该圆定义为:x^2 + y^2 = r^2。该行由y = y0 + [(y1 - y0)/(x1 - x0)]·(x - x0)定义。替换第一个,你得到x^2 + (y0 + [(y1 - y0)/(x1 - x0)]·(x - x0))^2 = r^2。解决这个问题,你会得到0-2的值。将它们插回到任何一个公式中以获得y的值。

+0

当你得到两个解决方案,你将如何分辨哪一个是P3和哪一个是圆圈另一侧的对应点? – 2011-05-23 01:32:11

+0

找出每个点与P1之间的距离。你可以通过(x3-x1)^ 2 +(y3-y1)^ 2来计算距离的平方,无论那个最小的哪一个更接近P1。 – 2011-05-23 01:42:43

16

一般来说,

  • 寻找P0之间的角度P1
  • 逼平从P0在距离r这个角度线,它会给你P3

在伪代码中,

theta = atan2(P1.y-P0.y, P1.x-P0.x) 
P3.x = P0.x + r * cos(theta) 
P3.y = P0.y + r * sin(theta) 
+0

这正是我一直在寻找的 - 试图在两个圆圈之间绘制直线,直线指向中心,但圆的*外侧*端点而不是实际中心。 – Krease 2013-06-03 21:02:39

+0

这种方法很好,但重新构造它以使用rsqrt和法线,而不是atan2 + cos + sin和角度,对我来说是表现的标志。希望它能帮助别人! :) – MickLH 2013-09-03 01:06:52

+2

这是正确的当p0是圆的中心,如上图所示,但问题似乎并不是那个 – 2017-05-08 16:09:27

8

从圆心和半径可以写出描述圆的方程。 从P0和P1两点可以写出描述线条的方程。

所以你有2个未知数的方程,你可以通过替换来解决。

设(X0,Y0)=点P0

和(X1,Y1)=点P1

和R =的圆的半径的坐标的坐标。

为圆的公式为:

(x-x0)^2 + (y-y0)^2 = r^2 

为线的等式为:

(y-y0) = M(x-x0) // where M = (y1-y0)/(x1-x0) 

封堵第二方程到第一给出:

(x-x0)^2*(1 + M^2) = r^2 

x - x0 = r/sqrt(1+M^2) 

同样你可以找到

y - y0 = r/sqrt(1+1/M^2) 

点(x,y)是直线和圆之间的交点,(x,y)是您的答案。

P3 = (x0 + r/sqrt(1+M^2), y0 + r/sqrt(1+1/M^2)) 
5

寻求此代码..其保存时间

private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr) { 
     float dx = x2 - x1; 
     float dy = y2 - y1; 
     float a = dx * dx + dy * dy; 
     float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy)); 
     float c = cx * cx + cy * cy; 
     c += x1 * x1 + y1 * y1; 
     c -= 2 * (cx * x1 + cy * y1); 
     c -= cr * cr; 
     float bb4ac = b * b - 4 * a * c; 

     if(bb4ac<0){ 
      return false; // No collision 
     }else{ 
      return true;  //Collision 
     } 
    } 
+0

这是为线条,如果不同于线段。 – Stritof 2015-12-14 14:51:32

+0

这只是返回一个布尔值,表示如果有交集,它不会返回交集本身 – 2017-05-08 16:11:43

1

MATLAB代码

函数[标志] = circleLineSegmentIntersection2(AX,AY,BX,BY,CX,CY,R)

%甲乙是线段的两个端点,C是圆的中心,%R是圆的半径。这个功能计算 的最近点氟利昂C到段%如果与 最近点> R返回0,否则,1

Dx = Bx-Ax; 
Dy = By-Ay; 

LAB = (Dx^2 + Dy^2); 
t = ((Cx - Ax) * Dx + (Cy - Ay) * Dy)/LAB; 

if t > 1 
    t=1; 
elseif t<0 
    t=0; 
end; 


nearestX = Ax + t * Dx; 
nearestY = Ay + t * Dy; 

dist = sqrt((nearestX-Cx)^2 + (nearestY-Cy)^2); 

if (dist > R) 
flag=0; 
else 
flag=1; 
end 

端的距离