给定线段line1(x1,y1)(x2,y2)和线段line2(x3,y3)(x4,y4),求两线段交点。

30次阅读

共计 1095 个字符,预计需要花费 3 分钟才能阅读完成。

我的思路
两线段交点就是两条线段相等的时候,也就是这个点既满足 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))
可能有些繁琐,希望有简单方法的可爱可以提出来。

正文完
 0