面试题 16.03. 交点

面试题 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};
    }
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值