]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.cpp
Store all axles in a single array
[r2c2.git] / source / libr2c2 / vehicle.cpp
index 17d67b666a28a49ae73822f82e91aec6162db1b1..96ad879fbc0c2d300ad1ae19cb6f10e2f2bb050e 100644 (file)
@@ -22,9 +22,15 @@ Vehicle::Vehicle(Layout &l, const VehicleType &t):
        front_sensor(0),
        back_sensor(0)
 {
-       axles.assign(type.get_fixed_axles().begin(), type.get_fixed_axles().end());
+       axles.assign(type.get_axles().begin(), type.get_axles().end());
+       for(vector<Axle>::iterator i=axles.begin(); i!=axles.end(); ++i)
+               if(!i->type->bogie)
+                       fixed_axles.push_back(&*i);
        bogies.assign(type.get_bogies().begin(), type.get_bogies().end());
        rods.assign(type.get_rods().begin(), type.get_rods().end());
+       for(vector<Bogie>::iterator i=bogies.begin(); i!=bogies.end(); ++i)
+               for(unsigned j=0; j<i->axles.size(); ++j)
+                       i->axles[j] = &axles[i->type->first_axle+j];
 
        layout.add(*this);
 }
@@ -134,13 +140,20 @@ void Vehicle::advance(float d)
        propagate_position();
 }
 
-const Vehicle::Axle &Vehicle::get_fixed_axle(unsigned i) const
+const Vehicle::Axle &Vehicle::get_axle(unsigned i) const
 {
        if(i>=axles.size())
-               throw out_of_range("Vehicle::get_fixed_axle");
+               throw out_of_range("Vehicle::get_axle");
        return axles[i];
 }
 
+const Vehicle::Axle &Vehicle::get_fixed_axle(unsigned i) const
+{
+       if(i>=fixed_axles.size())
+               throw out_of_range("Vehicle::get_fixed_axle");
+       return *fixed_axles[i];
+}
+
 const Vehicle::Bogie &Vehicle::get_bogie(unsigned i) const
 {
        if(i>=bogies.size())
@@ -154,7 +167,7 @@ const Vehicle::Axle &Vehicle::get_bogie_axle(unsigned i, unsigned j) const
                throw out_of_range("Vehicle::get_bogie_axle");
        if(j>=bogies[i].axles.size())
                throw out_of_range("Vehicle::get_bogie_axle");
-       return bogies[i].axles[j];
+       return *bogies[i].axles[j];
 }
 
 const Vehicle::Rod &Vehicle::get_rod(unsigned i) const
@@ -168,10 +181,10 @@ void Vehicle::update_position()
 {
        OrientedPoint p;
 
-       if(axles.size()>=2)
+       if(fixed_axles.size()>=2)
        {
-               float wheelbase = axles.front().type->position-axles.back().type->position;
-               p = get_point(track, wheelbase, -axles.back().type->position/wheelbase);
+               float wheelbase = fixed_axles.front()->type->position-fixed_axles.back()->type->position;
+               p = get_point(track, wheelbase, -fixed_axles.back()->type->position/wheelbase);
        }
        else if(bogies.size()>=2)
        {
@@ -180,13 +193,13 @@ void Vehicle::update_position()
                float bogie_spacing = bogies.front().type->position-bogies.back().type->position;
                adjust_for_distance(front, back, bogie_spacing);
 
-               const vector<Axle> &front_axles = bogies.front().axles;
-               float wheelbase = front_axles.front().type->position-front_axles.back().type->position;
-               OrientedPoint front_point = get_point(front, wheelbase, -front_axles.back().type->position/wheelbase);
+               const vector<Axle *> &front_axles = bogies.front().axles;
+               float wheelbase = front_axles.front()->type->position-front_axles.back()->type->position;
+               OrientedPoint front_point = get_point(front, wheelbase, -front_axles.back()->type->position/wheelbase);
 
-               const vector<Axle> &back_axles = bogies.back().axles;
-               wheelbase = back_axles.front().type->position-back_axles.back().type->position;
-               OrientedPoint back_point = get_point(back, wheelbase, -back_axles.back().type->position/wheelbase);
+               const vector<Axle *> &back_axles = bogies.back().axles;
+               wheelbase = back_axles.front()->type->position-back_axles.back()->type->position;
+               OrientedPoint back_point = get_point(back, wheelbase, -back_axles.back()->type->position/wheelbase);
 
                p = get_point(front_point.position, back_point.position, -bogies.back().type->position/bogie_spacing);
 
@@ -282,9 +295,6 @@ void Vehicle::turn_axles(float d)
 {
        for(vector<Axle>::iterator i=axles.begin(); i!=axles.end(); ++i)
                i->angle += Angle::from_radians(d*2/i->type->wheel_dia);
-       for(vector<Bogie>::iterator i=bogies.begin(); i!=bogies.end(); ++i)
-               for(vector<Axle>::iterator j=i->axles.begin(); j!=i->axles.end(); ++j)
-                       j->angle += Angle::from_radians(d*2/j->type->wheel_dia);
 
        update_rods();
 }
@@ -423,11 +433,9 @@ Vehicle::Axle::Axle(const VehicleType::Axle &t):
 
 
 Vehicle::Bogie::Bogie(const VehicleType::Bogie &t):
-       type(&t)
-{
-       for(VehicleType::AxleArray::const_iterator i=type->axles.begin(); i!=type->axles.end(); ++i)
-               axles.push_back(*i);
-}
+       type(&t),
+       axles(t.axles.size())
+{ }
 
 
 Vehicle::Rod::Rod(const VehicleType::Rod &t):