]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/profile.cpp
Make LCD output selectable at runtime through an extra I/O pin
[r2c2.git] / source / libmarklin / profile.cpp
index f4dcf188d03b1f58d7ff7c56f153f12217446d94..7b9dce52073075de8cb9473ae1fa3dda35ceedde 100644 (file)
@@ -13,6 +13,23 @@ using namespace Msp;
 
 namespace Marklin {
 
+void Profile::append_point(const Point &p)
+{
+       points.push_back(p);
+       if(points.size()==1)
+       {
+               min_coords = p;
+               max_coords = p;
+       }
+       else
+       {
+               min_coords.x = min(min_coords.x, p.x);
+               min_coords.y = min(min_coords.y, p.y);
+               max_coords.x = max(max_coords.x, p.x);
+               max_coords.y = max(max_coords.y, p.y);
+       }
+}
+
 const Point &Profile::get_point(unsigned i) const
 {
        if(i>=points.size())
@@ -27,7 +44,7 @@ Point Profile::get_edge_normal(unsigned i) const
        float dx = points[i+1].x-points[i].x;
        float dy = points[i+1].y-points[i].y;
        float len = sqrt(dx*dx+dy*dy);
-       return Point(-dx/len, dy/len);
+       return Point(dy/len, -dx/len);
 }
 
 
@@ -37,22 +54,9 @@ Profile::Loader::Loader(Profile &p):
        add("point", &Loader::point);
 }
 
-void Profile::Loader::finish()
-{
-       obj.min_coords = obj.points[0];
-       obj.max_coords = obj.points[0];
-       for(unsigned i=1; i<obj.points.size(); ++i)
-       {
-               obj.min_coords.x = min(obj.min_coords.x, obj.points[i].x);
-               obj.min_coords.y = min(obj.min_coords.y, obj.points[i].y);
-               obj.max_coords.x = max(obj.max_coords.x, obj.points[i].x);
-               obj.max_coords.y = max(obj.max_coords.y, obj.points[i].y);
-       }
-}
-
 void Profile::Loader::point(float x, float y)
 {
-       obj.points.push_back(Point(x/1000, y/1000));
+       obj.append_point(Point(x/1000, y/1000));
 }
 
 } // namespace Marklin