2011-05-23 103 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 

端的距離