-void Vehicle::adjust_for_distance(TrackPosition &front, TrackPosition &back, float tdist, float ratio) const
-{
- float margin = 0.01*layout.get_catalogue().get_scale();
- int adjust_dir = 0;
- while(1)
- {
- Vector front_point = front.get_point().pos;
- Vector back_point = back.get_point().pos;
-
- float dx = front_point.x-back_point.x;
- float dy = front_point.y-back_point.y;
- float dz = front_point.z-back_point.z;
- float dist = sqrt(dx*dx+dy*dy+dz*dz);
-
- float diff = tdist-dist;
- if(diff<-margin && adjust_dir<=0)
- {
- diff -= margin;
- adjust_dir = -1;
- }
- else if(diff>margin && adjust_dir>=0)
- {
- diff += margin;
- adjust_dir = 1;
- }
- else
- return;
-
- front.advance(diff*(1-ratio));
- back.advance(-diff*ratio);
- }
-}
-
-TrackPoint Vehicle::get_point(const Vector &front, const Vector &back, float ratio) const
-{
- float dx = front.x-back.x;
- float dy = front.y-back.y;
- float dz = front.z-back.z;
-
- TrackPoint tp;
- tp.pos = Vector(back.x+dx*ratio, back.y+dy*ratio, back.z+dz*ratio);
- tp.dir = atan2(dy, dx);
-
- return tp;
-}
-
-TrackPoint Vehicle::get_point(const TrackPosition &pos, float tdist, float ratio) const
-{
- TrackPosition front = pos;
- front.advance(tdist*(1-ratio));
-
- TrackPosition back = pos;
- back.advance(-tdist*ratio);
-
- adjust_for_distance(front, back, tdist, ratio);
- return get_point(front.get_point().pos, back.get_point().pos, ratio);
-}
-