+ for(unsigned i=0; i<links.size(); ++i)
+ if(links[i]==&other)
+ return i;
+
+ return -1;
+}
+
+Point Track::get_endpoint_position(unsigned epi) const
+{
+ const vector<Endpoint> &eps = type.get_endpoints();
+ if(epi>=eps.size())
+ throw InvalidParameterValue("Endpoint index out of range");
+
+ const Endpoint &ep = eps[epi];
+
+ float c = cos(rot);
+ float s = sin(rot);
+
+ Point p(pos.x+c*ep.pos.x-s*ep.pos.y, pos.y+s*ep.pos.x+c*ep.pos.y, pos.z);
+ if(eps.size()==2 && epi==1)
+ p.z += slope;
+ return p;
+}
+
+float Track::get_endpoint_direction(unsigned epi) const
+{
+ const vector<Endpoint> &eps = type.get_endpoints();
+ if(epi>=eps.size())
+ throw InvalidParameterValue("Endpoint index out of range");
+
+ const Endpoint &ep = eps[epi];
+
+ return rot+ep.dir;