java 多个一元分段行驶时间函数合并成一个分段行驶时间函数

多个f分段行驶时间函数合并需要注意的是一个节点的到达时间即为该点的出发时间。
分段函数的构造函数如下

这里写代码片
public class FunctionUnit {
    private double k,b;
    double XStart,XEnd;
    public FunctionUnit(double k,double b,double XStart,double XEnd){
        this.k=k;
        this.b=b;
        this.XStart=XStart;
        this.XEnd=XEnd;
    }

    public double getB() {
        return b;
    }

    public void setB(double b) {
        this.b = b;
    }

    public double getXEnd() {
        return XEnd;
    }

    public void setXEnd(double xEnd) {
        XEnd = xEnd;
    }

    public double getK() {
        return k;
    }

    public void setK(double k) {
        this.k = k;
    }

    public double getXStart() {
        return XStart;
    }

    public void setXStart(double xStart) {
        XStart = xStart;
    }

}

多个行驶时间函数合并代码如下:

这里写代码片
public class MergeFunction {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<List<FunctionUnit>> fun=new ArrayList<List<FunctionUnit>>();//多个分段函数集合
        List<FunctionUnit> funnew=new ArrayList<FunctionUnit>();

        for(int s=0;s<(fun.size()-1);s++){
            for(int i=0;i<fun.get(s).size();i++){//循环第s个分段函数
                double k1=fun.get(s).get(i).getK();
                double b1=fun.get(s).get(i).getB();
                double startX1=fun.get(s).get(i).getXStart();
                double tem=startX1;
                double endX1=fun.get(s).get(i).getXEnd();
                double y1=startX1*k1+b1+startX1;//startX1时刻出发的到达时间
                double y2=endX1*k1+b1+endX1;//endX1时刻出发的到达时间
                for(int j=0;j<fun.get(s+1).size();j++){//循环第s+1个分段函数
                    double k2=fun.get(s+1).get(j).getK();
                    double b2=fun.get(s+1).get(j).getB();
                    double startX2=fun.get(s+1).get(j).getXStart();
                    double endX2=fun.get(s+1).get(j).getXEnd();
                    //判断s+1的分段函数的第j个函数的分段区间与【y1,y2】的关系。
                    if(startX2<y1&&y1<endX2&&endX2<=y2){//[startX2,endX2]的后部分与[y1,y2]相交
                        double k=k2*k1+k1+k2;//两个函数合并和新函数的斜率
                        double b=k2*b1+b2+b1;//两个函数合并和新函数的截距
                        double startX=tem;//两个函数合并和新函数的起始区间值
                        double endX=0;
                        //比较endX2与y2,如果两个值相等,说明新函数的终止区间的值为endX1,否则终止区间的值为endX2对应s分段函数的第i个函数的x值
                        if(endX2==y2){
                            endX=endX1;//两个函数合并和新函数的终止区间值
                        }else{
                            endX=(endX2-b1)/k1;//endX2对应s分段函数的第i个函数的x值为两个函数合并和新函数的终止区间值
                        }
                        tem=endX;
                        FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);//将新生成的每个值添加到Fc中
                        funnew.add(Fc);
                    }else if(startX2<=y1&&endX2<=y2){//[startX2,endX2]在[y1,y2]内
                        double k=k2*k1+k1+k2;
                        double b=k2*b1+b2+b1;
                        double startX=0;
                        //比较startX2与y1,如果两个值相等,说明新函数的起始区间的值为tem,否则起始区间的值为startX2对应s分段函数的第i个函数的x值
                        if(startX2==y1){
                            startX=tem;
                        }else{
                            startX=(startX2-b1)/k1;//startX2对应s分段函数的第i个函数的x值
                        }
                        double endX=0;
                        if(endX2==y2){
                            endX=endX1;
                        }else{
                            endX=(endX2-b1)/k1;//endX2对应s分段函数的第i个函数的x值
                        }
                        tem=endX;
                        FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
                        funnew.add(Fc);
                    }else if(startX2>=y1&&startX2<y2&&endX2>y2){//[startX2,endX2]的前部分与[y1,y2]相交
                        double k=k2*k1+k1+k2;
                        double b=k2*b1+b2+b1;
                        double startX=0;
                        if(startX2==y1){
                            startX=tem;
                        }else{
                            startX=(startX2-b1)/k1;
                        }
                        double endX=endX1;
                        tem=endX;
                        FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
                        funnew.add(Fc);
                    }else if(startX2<y1&&endX2>y2){//[startX2,endX2]包含[y1,y2]
                        double k=k2*k1+k1+k2;
                        double b=k2*b1+b2+b1;
                        double startX=tem;
                        double endX=endX1;
                        tem=endX;
                        FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
                        funnew.add(Fc);
                    }

                }

            }
            fun.set(s+1, funnew);//将原来s+1的分段函数用新合成的分段函数替换

        }   
}
}

猜你喜欢

转载自blog.csdn.net/Strawberrymilkshake/article/details/80776339
今日推荐