- xmlpp::Element *elem = group.add_child("path");
- elem->set_attribute("class", "rail");
-
- Vector delta = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.dir);
-
- string data = format("M %.3f %.3f L %.3f %.3f",
- start.pos.x*1000+delta.x, -start.pos.y*1000-delta.y,
- end.pos.x*1000+delta.x, -end.pos.y*1000-delta.y);
- data += format(" M %.3f %.3f L %.3f %.3f",
- start.pos.x*1000-delta.x, -start.pos.y*1000+delta.y,
- end.pos.x*1000-delta.x, -end.pos.y*1000+delta.y);
- elem->set_attribute("d", data);
+ xmlpp::Element *path = group->add_child("path");
+ path->set_attribute("class", "rail");
+
+ string data;
+
+ OrientedPoint start = i->get_point(0);
+ OrientedPoint end = i->get_point(i->get_length());
+ if(i->is_curved())
+ {
+ Vector delta1 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.rotation);
+ Vector delta2 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), end.rotation);
+ // Largely an educated guess, but seems to be accurate enough
+ float clen = i->get_length()/2.9;
+ Vector ctrl1 = rotated_vector(Vector(clen, 0, 0), start.rotation);
+ Vector ctrl2 = rotated_vector(Vector(clen, 0, 0), end.rotation);
+
+ data = create_curve_data(start.position+delta1, ctrl1, ctrl2, end.position+delta2);
+ data += ' ';
+ data += create_curve_data(start.position-delta1, ctrl1, ctrl2, end.position-delta2);
+ }
+ else
+ {
+ Vector delta = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.rotation);
+
+ data = create_line_data(start.position+delta, end.position+delta);
+ data += ' ';
+ data += create_line_data(start.position-delta ,end.position-delta);
+ }
+
+ path->set_attribute("d", data);