unsigned n_endpoints = (*i)->get_type().get_endpoints().size();
for(unsigned j=0; j<n_endpoints; ++j)
{
- Vector pos = (*i)->get_endpoint_position(j);
+ Vector pos = (*i)->get_snap_node(j).position;
if(i==tracks.begin() && j==0)
minp = maxp = pos;
else
void SvgExporter::save_track(const Track &track, xmlpp::Element &group)
{
const Vector &pos = track.get_position();
- float rot = track.get_rotation();
- string transform = format("translate(%.3f %.3f) rotate(%.3f)", pos.x*1000, -pos.y*1000, -rot*180/M_PI);
+ const Angle &rot = track.get_rotation();
+ string transform = format("translate(%.3f %.3f) rotate(%.3f)", pos.x*1000, -pos.y*1000, -rot.degrees());
group.set_attribute("transform", transform);
const TrackType &type = track.get_type();
xmlpp::Element *elem = group.add_child("path");
elem->set_attribute("class", "endpoint");
- float dx = -sin(i->dir)*gauge;
- float dy = -cos(i->dir)*gauge;
+ Vector delta = rotated_vector(Vector(0, gauge, 0), i->dir);
string data = format("M %.3f %.3f L %.3f %.3f",
- i->pos.x*1000+dx, -i->pos.y*1000+dy,
- i->pos.x*1000-dx, -i->pos.y*1000-dy);
+ i->pos.x*1000+delta.x, -i->pos.y*1000-delta.y,
+ i->pos.x*1000-delta.x, -i->pos.y*1000+delta.y);
elem->set_attribute("d", data);
}
xmlpp::Element *elem = group.add_child("path");
elem->set_attribute("class", "rail");
- float cs = cos(start.dir);
- float ss = sin(start.dir);
- float ce = cos(end.dir);
- float se = sin(end.dir);
- float dx1 = -ss*(gauge+rail_width)*0.5;
- float dy1 = -cs*(gauge+rail_width)*0.5;
- float dx2 = -se*(gauge+rail_width)*0.5;
- float dy2 = -ce*(gauge+rail_width)*0.5;
+ Vector delta1 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.dir);
+ Vector delta2 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), end.dir);
// Largely an educated guess, but seems to be accurate enough
float clen = i->get_length()*1000/2.9;
+ Vector ctrl1 = rotated_vector(Vector(clen, 0, 0), start.dir);
+ Vector ctrl2 = rotated_vector(Vector(clen, 0, 0), end.dir);
string data = format("M %.3f %.3f C %.3f %.3f %.3f %.3f %.3f %.3f")
- (start.pos.x*1000+dx1)(-start.pos.y*1000+dy1)
- (start.pos.x*1000+dx1+cs*clen)(-start.pos.y*1000+dy1-ss*clen)
- (end.pos.x*1000+dx2-ce*clen)(-end.pos.y*1000+dy2+se*clen)
- (end.pos.x*1000+dx2)(-end.pos.y*1000+dy2).str();
+ (start.pos.x*1000+delta1.x)(-start.pos.y*1000-delta1.y)
+ (start.pos.x*1000+delta1.x+ctrl1.x)(-start.pos.y*1000-delta1.y-ctrl1.y)
+ (end.pos.x*1000+delta2.x-ctrl2.x)(-end.pos.y*1000-delta2.y+ctrl2.y)
+ (end.pos.x*1000+delta2.x)(-end.pos.y*1000-delta2.y).str();
data += format(" M %.3f %.3f C %.3f %.3f %.3f %.3f %.3f %.3f")
- (start.pos.x*1000-dx1)(-start.pos.y*1000-dy1)
- (start.pos.x*1000-dx1+cs*clen)(-start.pos.y*1000-dy1-ss*clen)
- (end.pos.x*1000-dx2-ce*clen)(-end.pos.y*1000-dy2+se*clen)
- (end.pos.x*1000-dx2)(-end.pos.y*1000-dy2).str();
+ (start.pos.x*1000-delta1.x)(-start.pos.y*1000+delta1.y)
+ (start.pos.x*1000-delta1.x+ctrl1.x)(-start.pos.y*1000+delta1.y-ctrl1.y)
+ (end.pos.x*1000-delta2.x-ctrl2.x)(-end.pos.y*1000+delta2.y+ctrl2.y)
+ (end.pos.x*1000-delta2.x)(-end.pos.y*1000+delta2.y).str();
elem->set_attribute("d", data);
}
else
xmlpp::Element *elem = group.add_child("path");
elem->set_attribute("class", "rail");
- float dx = -sin(start.dir)*(gauge+rail_width)*0.5;
- float dy = -cos(start.dir)*(gauge+rail_width)*0.5;
+ 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+dx, -start.pos.y*1000+dy,
- end.pos.x*1000+dx, -end.pos.y*1000+dy);
+ 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-dx, -start.pos.y*1000-dy,
- end.pos.x*1000-dx, -end.pos.y*1000-dy);
+ 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);
}
}
TrackPoint label_pt = parts.front().get_point(parts.front().get_length()/2);
- while(rot+label_pt.dir>M_PI/2)
- label_pt.dir -= M_PI;
- while(rot+label_pt.dir<-M_PI/2)
- label_pt.dir += M_PI;
+ label_pt.dir.wrap_with_base(-Angle::quarter_turn());
+ if(label_pt.dir>Angle::quarter_turn())
+ label_pt.dir -= Angle::half_turn();
- label_pt.pos.x = label_pt.pos.x*1000+sin(label_pt.dir)*gauge*0.25;
- label_pt.pos.y = label_pt.pos.y*1000-cos(label_pt.dir)*gauge*0.25;
+ label_pt.pos *= 1000;
+ label_pt.pos += rotated_vector(Vector(0, -gauge*0.25, 0), label_pt.dir);
xmlpp::Element *elem = group.add_child("text");
elem->set_attribute("class", "artnr");
elem->set_attribute("transform", format("translate(%.3f %.3f) rotate(%.3f)",
- label_pt.pos.x, -label_pt.pos.y, -label_pt.dir*180/M_PI));
+ label_pt.pos.x, -label_pt.pos.y, -label_pt.dir.degrees()));
elem->set_child_text(track.get_type().get_article_number().str());
}