給定線段line1(x1,y1)(x2,y2)和線段line2(x3,y3)(x4,y4),求兩線段交點。
我的思路
兩線段交點就是兩條線段相等的時候,也就是這個點既滿足line1
又滿足line2
。所以我們要先求出這兩條線段所在直線的方程式。因為給了兩個點,所以我們想到用斜截式(y=kx+b
)來求出直線的方程式。然後求出交點。再判斷這個點是否在兩條線段上(即判斷求出的x座標是否在x1
和x2
,x3
和x4
之間)。因為斜截式不滿足k=0(即垂直於x軸時)。所以要在k=0時加一個判斷。
大致流程
設交點座標為(a,b)
求出兩線段所在直線的方程式(需求k1、b1、k2、b2) --> 將(a,b)代入方程利用與k1、b1、k2、b2的關係求出(a,b) --> 判斷特殊情況k=0 --> 判斷(a,b)是否在兩條線段上 --> 返回結果
let line1 = [{x1:0,y1:1},{x2:0,y2:-1}]; let line2 = [{x3:0,y3:-1},{x4:2,y4:1}]; function point(line1,line2){ // 解構賦值取得 x1,y1,x2,y2,x3,y3,x4,y4 let [{x1,y1},{x2,y2}] = line1; let [{x3,y3},{x4,y4}] = line2; // 利用公式推匯出 k、b和x、y的關係。 let k1 = (y1-y2)/(x1-x2); let b1 = y1 - (k1*x1); let k2 = (y3-y4)/(x3-x4); let b2 = y3 - (k2*x3); // a、b 為交點座標 let a; let b; // 判斷 k=0 時 if(x1==x2){ k1,b1 = 0; a = x1; b = k2*a + b2; } if(x3==x4){ k2,b2 = 0; a = x3; b = k1*a + b1; } // 判斷 交點 是否在兩條線段上 if(((a>x1&&a<x2)||(a<x1&&a>x2)||a==x1||a==x2)&&((a>x3&&a<x4)||(a<x3&&a>x4)||a==x3||a==x4)&&x1!=x2&&x3!=x4){ a = (b2-b1)/(k1-k2); b = k1*a + b1; } // 返回結果 let str; if(a!==undefined&&b!==undefined){ str = `交點為(${a},${b})` }else if((k1==k2)&&(b1==b2)&&(((x1==x3)&&(x2==x4))||((x1==x4)&&(x2==x3)))){ str = "兩線段重合" }else if(k1==k2){ str = "兩線段平行" }else{ str = "兩線段不相交" } return str; } console.log(point(line1,line2))
- 可能有些繁瑣,希望有簡單方法的可愛可以提出來。