-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().position;
- Vector back_point = back.point().position;
-
- 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);
- }
-}
-
-OrientedPoint Vehicle::get_point(const Vector &front, const Vector &back, float ratio) const
-{
- Vector span = front-back;
-
- OrientedPoint p;
- p.position = back+span*ratio;
- p.rotation = Geometry::atan2(span.y, span.x);
- p.tilt = Geometry::atan2(span.z, LinAl::Vector<float, 2>(span).norm());
-
- return p;
-}
-
-OrientedPoint 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().position, back.point().position, ratio);
-}
-