void Track::set_position(const Vector &p)
{
position = p;
- for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
- if(*i)
- (*i)->check_slope();
+ propagate_slope();
}
void Track::set_rotation(const Angle &r)
rotation = wrap_positive(r);
}
-void Track::set_slope(float s)
+void Track::set_tilt(const Angle &t)
{
if(links.size()!=2)
return;
- slope = s;
+ tilt = t;
+ slope = tan(tilt)*type.get_path_length(0);
+ propagate_slope();
}
void Track::set_flex(bool f)
flex = f;
}
+void Track::propagate_slope()
+{
+ for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
+ if(*i)
+ (*i)->check_slope();
+}
+
void Track::check_slope()
{
if(links.size()!=2)
Vector epp1 = links[1]->get_snap_node(links[1]->get_link_slot(*this)).position;
position.z = epp0.z;
slope = epp1.z-position.z;
+ tilt = Geometry::atan(slope/type.get_path_length(0));
}
else
{
p.dir += rotation;
if(type.get_endpoints().size()==2)
{
- float len = type.get_path_length(path);
- float grade = slope/len;
+ float grade = tan(tilt);
if(epi==0)
{
p.pos.z += grade*d;
{
st.push_back((DataFile::Statement("position"), position.x, position.y, position.z));
st.push_back((DataFile::Statement("rotation"), rotation.radians()));
- st.push_back((DataFile::Statement("slope"), slope));
+ st.push_back((DataFile::Statement("tilt"), tilt.radians()));
if(turnout_id)
st.push_back((DataFile::Statement("turnout_id"), turnout_id));
if(sensor_id)
{
add("position", &Loader::position);
add("rotation", &Loader::rotation);
- add("slope", &Track::slope);
+ add("tilt", &Loader::tilt);
add("turnout_id", &Loader::turnout_id);
add("sensor_id", &Loader::sensor_id);
add("flex", &Track::flex);
+
+ // deprecated
+ add("slope", &Loader::slope);
}
void Track::Loader::position(float x, float y, float z)
obj.set_sensor_id(id);
}
+void Track::Loader::slope(float s)
+{
+ tilt(atan(s/obj.type.get_path_length(0)));
+}
+
+void Track::Loader::tilt(float t)
+{
+ if(obj.links.size()!=2)
+ return;
+
+ obj.tilt = Angle::from_radians(t);
+ obj.slope = tan(t)*obj.type.get_path_length(0);
+}
+
void Track::Loader::turnout_id(unsigned id)
{
obj.set_turnout_id(id);