#ifndef TRACK_H
#define TRACK_H
#include <cmath>
#include <cassert>
#include <vector>
#include <string>
#include "geometry.h"
class TrackPoint {
public:
Vector3 position;
Real angle;
Real speed;
Real l;
Real time;
Real length;
Real duration;
Vector3 real_pos;
TrackPoint(): angle(), speed(), l(), time(), length() { }
static Vector3 calc_real_pos(const TrackPoint &point) {
Real a = point.angle*(M_PI/180);
Real s = sin(a);
Real c = cos(a);
return Vector3(
point.position.x,
point.position.y*c - point.position.z*s,
point.position.y*s + point.position.z*c );
}
static TrackPoint median(Real l, const TrackPoint &p0, const TrackPoint &p1) {
//assert(l >= - precision && l <= 1 + precision);
Real k = 1 - l;
TrackPoint p;
p.position.x = p0.position.x*k + p1.position.x*l;
p.position.y = p0.position.y*k + p1.position.y*l;
p.position.z = p0.position.z*k + p1.position.z*l;
p.angle = p0.angle *k + p1.angle *l;
p.speed = p1.speed ;
p.l = p0.l *k + p1.l *l;
p.time = p0.time *k + p1.time *l;
p.length = p1.length *l;
p.duration = p1.duration *l;
p.real_pos.x = p0.real_pos.x*k + p1.real_pos.x*l;
p.real_pos.y = p0.real_pos.y*k + p1.real_pos.y*l;
p.real_pos.z = p0.real_pos.z*k + p1.real_pos.z*l;
return p;
}
};
typedef std::vector<TrackPoint> TrackPointList;
class Track {
public:
TrackPointList points;
void split(Real da, Real dl, Real dt);
void calc_length();
int index_by_l(Real l) const;
int index_by_time(Real t) const;
};
#endif