zoukankan      html  css  js  c++  java
  • java计算两条线段交点

    1、判断斜率相同不,y2-y1/x2-x1,y4-y3/x4-x3,相同则无交点,不相同说明直线有交点则执行第二步; 
       2、设y=ax+b,通过斜率可求出a的值,通过坐标可以求出b的值,这样两个线段所在直线的两个方程式就得到了; 

       3、通过两个方程式求出交点,再判断交点是不是落在两线段交点的区域中

     

    代码:

    public  static Point getCrossPoint(Lseg lsegA,Lseg lsegB){
            float x;
            float y;
            float x1=lsegA.getA().getX();
            float y1=lsegA.getA().getY();
            float x2=lsegA.getB().getX();
            float y2=lsegA.getB().getY();
            float x3=lsegB.getA().getX();
            float y3=lsegB.getA().getY();
            float x4=lsegB.getB().getX();
            float y4=lsegB.getB().getY();
            float k1=Float.MAX_VALUE;
            float k2=Float.MAX_VALUE;
            boolean flag1=false;
            boolean flag2=false;
            
            if((x1-x2)==0)
                flag1=true;
            if((x3-x4)==0)
                flag2=true;
            
            if(!flag1)
                k1=(y1-y2)/(x1-x2);
            if(!flag2)
                k2=(y3-y4)/(x3-x4);
            
            if(k1==k2)
                return null;
            
            if(flag1){
                if(flag2)
                    return null;
                x=x1;
                if(k2==0){
                    y=y3;
                }else{
                    y=k2*(x-x4)+y4;
                }
            }else if(flag2){
                x=x3;
                if(k1==0){
                    y=y1;
                }else{
                    y=k1*(x-x2)+y2;
                }
            }else{
                if(k1==0){
                    y=y1;
                    x=(y-y4)/k2+x4;
                }else if(k2==0){
                    y=y3;
                    x=(y-y2)/k1+x2;
                }else{
                    x=(k1*x2-k2*x4+y4-y2)/(k1-k2);
                    y=k1*(x-x2)+y2;
                }            
            }
            if(between(x1,x2,x)&&between(y1,y2,y)&&between(x3,x4,x)&&between(y3,y4,y)){
                Point point=new Point();
                point.setX(x);
                point.setY(y);
                if(point.equals(lsegA.getA())||point.equals(lsegA.getB()))
                    return null;
                return point;
            }else{
                return null;
            }                
        }
        
        public static boolean between(float a,float b,float target){
            if(target>=a-0.01&&target<=b+0.01||target<=a+0.01&&target>=b-0.01)
                return true;
            else
                return false;
        }}
  • 相关阅读:
    HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)
    Xcode 5、Xcode 6 免证书真机调试
    Ubuntu打开终端的方法三种
    JAVA异常处理机制
    Java多线程之~~~~synchronized 方法
    iphone开发技术要学习的内容
    表达式求值(数据结构书上栈的应用之中的一个)
    Java学习篇之---json-lib(Maven)
    Nginx 笔记与总结(16)nginx 负载均衡
    SPSS数据记录的选择(Select Cases)
  • 原文地址:https://www.cnblogs.com/yunger/p/7567191.html
Copyright © 2011-2022 走看看