面试题 16.03. 交点
class Solution {
double ans[] = new double[0];
public double[] intersection(int[] start1, int[] end1, int[] start2, int[] end2) {
int x1 = start1[0], y1 = start1[1];
int x2 = end1[0], y2 = end1[1];
int x3 = start2[0], y3 = start2[1];
int x4 = end2[0], y4 = end2[1];
//参数方程的方法,据体见题解
//首先判断两条直线是否平行
if((y2-y1)*(x4-x3) == (y4-y3)*(x2-x1)){
//若平行,则判断(x3,x4)是否在直线l1上
if ((x3-x1)*(y2-y1) == (y3-y1)*(x2-x1)){
//若(x3,x4)在直线l1上,继续判断它是否在l1线段上
if (inside(x1,y1,x2,y2,x3,y3)){
update(x3,y3);
}
//判断(x4,y4)是否在线段l1上(x1,y1)(x2,y2)
if(inside(x1,y1,x2,y2,x4,y4)){
update(x4,y4);
}
//判断(x1,y2)是否在线段(x3,x3)(x4,x4)上
if(inside(x3,y3,x4,y4,x1,y1)){
update(x1,y1);
}
//判断(x2,y2)是否在线段(x3,y3)(x4,y4)上
if(inside(x3,y3,x4,y4,x2,y2)){
update(x2,y2);
}
}
//在平行时候,其余的所有情况都不会有交点
}
else{
//两直线不平行了,联立求得参数方程的参数
double t1 = (double) (x3 * (y4 - y3) + y1 * (x4 - x3) - y3 * (x4 - x3) - x1 * (y4 - y3)) / ((x2 - x1) * (y4 - y3) - (x4 - x3) * (y2 - y1));
double t2 = (double) (x1 * (y2 - y1) + y3 * (x2 - x1) - y1 * (x2 - x1) - x3 * (y2 - y1)) / ((x4 - x3) * (y2 - y1) - (x2 - x1) * (y4 - y3));
//接着判断t1,t2是否均在[0,1]之间,此时满足线段相交的提议
if(t1 >= 0.0 && t1 <= 1.0 && t2 >= 0.0 && t2 <= 1.0){
ans = new double[]{x1 + t1 * (x2 - x1), y1 + t1 * (y2 - y1)};
}
}
return ans;
}
//inside () 主要是判断点是不是在线段上
public boolean inside(int x1, int y1 , int x2, int y2,int xk, int yk){
//若与x轴平行,则只需要判断x部分
//同理y
//若为普通线段,都要进行判断
return (x1 == x2 || (Math.min(x1,x2) <= xk && xk <= Math.max(x1,x2)) ) && (y1 == y2 || (Math.min(y1,y2)<=yk && yk <= Math.max(y1,y2)));
}
public void update(double xk , double yk){
// 将一个交点与当前 ans 中的结果进行比较
// 若更优则替换
if(ans.length== 0 || xk < ans[0] || (xk== ans[0] && yk < ans[1])){
ans = new double[]{xk,yk};
}
}
}