]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/trackpart.cpp
Major code refactoring:
[r2c2.git] / source / libmarklin / trackpart.cpp
1 #include <cmath>
2 #include "trackpart.h"
3
4 using namespace std;
5
6 namespace Marklin {
7
8 TrackPart::TrackPart():
9         x(0),
10         y(0),
11         dir(0),
12         length(0),
13         radius(0),
14         route(0),
15         dead_end(false)
16 { }
17
18 void TrackPart::collect_endpoints(vector<Endpoint> &eps)
19 {
20         eps.push_back(Endpoint(x, y, dir+M_PI, 1<<route));
21
22         if(dead_end)
23                 ;
24         else if(radius)
25         {
26                 float a=((radius<0) ? -length : length);
27                 float c=cos(a);
28                 float s=sin(a);
29                 float rx=radius*sin(dir);
30                 float ry=-radius*cos(dir);
31                 eps.push_back(Endpoint(x+c*rx-s*ry-rx, y+c*ry+s*rx-ry, dir+a, 1<<route));
32         }
33         else
34                 eps.push_back(Endpoint(x+cos(dir)*length, y+sin(dir)*length, dir, 1<<route));
35 }
36
37
38 TrackPart::Loader::Loader(TrackPart &p):
39         part(p)
40 {
41         add("start",    &Loader::start);
42         add("length",   &TrackPart::length);
43         add("radius",   &TrackPart::radius);
44         add("route",    &TrackPart::route);
45         add("dead_end", &TrackPart::dead_end);
46 }
47
48 void TrackPart::Loader::finish()
49 {
50         if(part.radius)
51         {
52                 part.length*=M_PI/180;
53                 part.radius/=1000;
54         }
55         else
56                 part.length/=1000;
57
58         part.x/=1000;
59         part.y/=1000;
60         part.dir*=M_PI/180;
61 }
62
63 void TrackPart::Loader::start(float x, float y, float d)
64 {
65         part.x=x;
66         part.y=y;
67         part.dir=d;
68 }
69
70 } // namespace Marklin