duration_t Duration(Segment *segmentp,Way *wayp,Profile *profile) { speed_t speed1=wayp->speed; speed_t speed2=profile->speed[HIGHWAY(wayp->type)]; distance_t distance=DISTANCE(segmentp->distance); if(speed1==0) { if(speed2==0) return(hours_to_duration(10)); else return distance_speed_to_duration(distance,speed2); } else /* if(speed1!=0) */ { if(speed2==0) return distance_speed_to_duration(distance,speed1); else if(speed1<=speed2) return distance_speed_to_duration(distance,speed1); else return distance_speed_to_duration(distance,speed2); } }
duration_t Duration(index_t node, Segment *segmentp,Way *wayp,Profile *profile,speed_t *pspeedresult) { speed_t speed1=wayp->speed; speed_t speed2=profile->speed[HIGHWAY(wayp->type)]; speed_t speedcalc; distance_t distance=DISTANCE(segmentp->distance); if(speed1==0) { if(speed2==0) return(hours_to_duration(10)); else *pspeedresult=speed2; } else /* if(speed1!=0) */ { if(speed2==0) *pspeedresult=speed1; else if(speed1<=speed2) *pspeedresult=speed1; else *pspeedresult=speed2; } if (profile->allow != Transports_Bicycle || (wayp->incline == 0 && segmentp->percentascent == 0 && segmentp->percentdescent == 0)) return distance_speed_to_duration(distance,*pspeedresult); #if DEBUG printf(" incline=%d node=%"Pindex_t" seg->node1=%"Pindex_t" seg->node2=%"Pindex_t" percentascent=%f percentdescent=%f distx=%08x\n",wayp->incline,node,segmentp->node1,segmentp->node2,segmentp->percentascent,segmentp->percentdescent,segmentp->descent,segmentp->distance ); #endif if (wayp->incline != 0) { if (segmentp->node1 == node && segmentp->distance & INCLINEUP_2TO1) return distance_speed_to_duration(distance,*pspeedresult); if (segmentp->node2 == node && segmentp->distance & INCLINEUP_1TO2) return distance_speed_to_duration(distance,*pspeedresult); if (abs(wayp->incline) < 50) return distance_speed_to_duration(distance,*pspeedresult); if (abs(wayp->incline) < 100) speedcalc = 20 - abs(wayp->incline)/10; else if (abs(wayp->incline) < 160) speedcalc = 18 - abs(wayp->incline)/10; else speedcalc = 2; #if DEBUG printf("Duration incline=%d speedcalc=%d result=%d\n",wayp->incline,speedcalc,*pspeedresult ); #endif } else { float percent=0; if (segmentp->node1 == node && segmentp->percentascent > 0) percent = segmentp->percentascent - segmentp->percentdescent; if (segmentp->node2 == node && segmentp->percentdescent > 0) percent = segmentp->percentdescent - segmentp->percentascent; if(percent < 5) return distance_speed_to_duration(distance,*pspeedresult); if(percent < 10) speedcalc = 20 - percent; if(percent < 16) speedcalc = 18 - percent; else speedcalc = 2; #if DEBUG printf("Duration percent: %0.2f speedcalc=%d result=%d\n",percent,speedcalc,*pspeedresult ); #endif } if (speedcalc < *pspeedresult) *pspeedresult=speedcalc; return distance_speed_to_duration(distance,*pspeedresult); }