]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/trackpart.cpp
Add Id tags and copyright notices to files
[r2c2.git] / source / libmarklin / trackpart.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include <cmath>
9 #include "trackpart.h"
10
11 using namespace std;
12
13 namespace Marklin {
14
15 TrackPart::TrackPart():
16         x(0),
17         y(0),
18         dir(0),
19         length(0),
20         radius(0),
21         route(0),
22         dead_end(false)
23 { }
24
25 void TrackPart::collect_endpoints(vector<Endpoint> &eps)
26 {
27         eps.push_back(Endpoint(x, y, dir+M_PI, 1<<route));
28
29         if(dead_end)
30                 ;
31         else if(radius)
32         {
33                 float a=((radius<0) ? -length : length);
34                 float c=cos(a);
35                 float s=sin(a);
36                 float rx=radius*sin(dir);
37                 float ry=-radius*cos(dir);
38                 eps.push_back(Endpoint(x+c*rx-s*ry-rx, y+c*ry+s*rx-ry, dir+a, 1<<route));
39         }
40         else
41                 eps.push_back(Endpoint(x+cos(dir)*length, y+sin(dir)*length, dir, 1<<route));
42 }
43
44
45 TrackPart::Loader::Loader(TrackPart &p):
46         part(p)
47 {
48         add("start",    &Loader::start);
49         add("length",   &TrackPart::length);
50         add("radius",   &TrackPart::radius);
51         add("route",    &TrackPart::route);
52         add("dead_end", &TrackPart::dead_end);
53 }
54
55 void TrackPart::Loader::finish()
56 {
57         if(part.radius)
58         {
59                 part.length*=M_PI/180;
60                 part.radius/=1000;
61         }
62         else
63                 part.length/=1000;
64
65         part.x/=1000;
66         part.y/=1000;
67         part.dir*=M_PI/180;
68 }
69
70 void TrackPart::Loader::start(float x, float y, float d)
71 {
72         part.x=x;
73         part.y=y;
74         part.dir=d;
75 }
76
77 } // namespace Marklin