-void Vehicle::adjust_for_distance(TrackOffsetIter &front, TrackOffsetIter &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.point().pos;
- Vector back_point = back.point().pos;
-
- float dist = distance(front_point, back_point);
-
- 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 = front.advance(diff*(1-ratio));
- back = back.advance(-diff*ratio);
- }
-}
-
-TrackPoint Vehicle::get_point(const Vector &front, const Vector &back, float ratio) const
-{
- Vector span = front-back;
-
- TrackPoint tp;
- tp.pos = back+span*ratio;
- tp.dir = Geometry::atan2(span.y, span.x);
-
- return tp;
-}
-
-TrackPoint Vehicle::get_point(const TrackOffsetIter &iter, float tdist, float ratio) const
-{
- TrackOffsetIter front = iter.advance(tdist*(1-ratio));
- TrackOffsetIter back = iter.advance(-tdist*ratio);
-
- adjust_for_distance(front, back, tdist, ratio);
- return get_point(front.point().pos, back.point().pos, ratio);
-}
-