1.原理,直線上的一小段線段(起點到交叉點)的斜率=整個直線的斜率
x1,y1 x2,y2為一條直線起止點坐標
x3,y3 x4,y4為另一條直線起止坐標
設交點坐標為x,y 根據原理可得二元一次方程組
經過變化求得
x=(a*x1 - y1 + y3 - b*x3) / (a - b);
y= a * x - a * x1 + y1;
注意:
需考慮右側等式分母為0的情況,即L1或L2垂直於x軸時,斜率不存在的情況
2.代碼實現
double[] GetIntersectionPoint(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { var a = (y2 - y1) / (x2 - x1); //需考慮分母不能為0 即x2=x1 l1垂直於x軸 var b = (y4 - y3) / (x4 - x3); //需考慮分母不能為0 即x4=x3 l2垂直於x軸 if (a == b) {//斜率相同,說明平行 無交點 throw new Exception("兩直線平行,無交點"); } double x, y = 0; if (x2==x1) {//L1垂直於x軸 則x=x1=x2 a=infinity 想辦法消除a x = x1; ////(y-y3)/(x-x3)=b 且x=x1 變換得y=bx1-bx3+y3 y = b*x1 - b*x3 + y3; return new double[] { x, y }; } if (x4==x3) {//L2垂直於x軸 則x=x3=x4 b=infinity x = x3; y = a * x - a * x1 + y1; return new double[] { x, y }; } x = (a*x1 - y1 + y3 - b*x3) / (a - b); y = a * x - a * x1 + y1; Log("[{lng:'"+x1+"',lat:'"+y1+"'},{lng:'"+x2+"',lat:'"+y2+"'},{lng:'"+x3+"',lat:'"+y3+"'},{lng:'"+x4+"',lat:'"+y4+"'},{lng:'"+x+"',lat:'"+y+"'}]"); return new double[] { x, y }; }