多个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的分段函数用新合成的分段函数替换
}
}
}