示例#1
0
文件: segments.c 项目: cetium/routino
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);
 
}