]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/tracktype.cpp
Code reformatting: add spaces around assignment operators
[r2c2.git] / source / libmarklin / tracktype.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include <cmath>
9 #include "tracktype.h"
10
11 using namespace std;
12
13 namespace Marklin {
14
15 TrackType::TrackType(unsigned a):
16         art_nr(a)
17 { }
18
19 float TrackType::get_total_length() const
20 {
21         return get_route_length(-1);
22 }
23
24 float TrackType::get_route_length(int r) const
25 {
26         float len = 0;
27         for(vector<TrackPart>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
28                 if(r<0 || i->route==static_cast<unsigned>(r))
29                 {
30                         float l = i->length;
31                         if(i->radius)
32                                 l *= abs(i->radius);
33                         len += l;
34                 }
35         return len;
36 }
37
38 unsigned TrackType::get_n_routes() const
39 {
40         unsigned n = 1;
41         for(vector<TrackPart>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
42                 if(i->route>=n)
43                         n = i->route+1;
44         return n;
45 }
46
47 void TrackType::collect_endpoints()
48 {
49         endpoints.clear();
50
51         for(vector<TrackPart>::iterator i=parts.begin(); i!=parts.end(); ++i)
52                 i->collect_endpoints(endpoints);
53
54         for(vector<Endpoint>::iterator i=endpoints.begin(); i!=endpoints.end();)
55         {
56                 bool rm = false;
57                 for(vector<Endpoint>::iterator j=i+1; j!=endpoints.end();)
58                 {
59                         float dx = i->pos.x-j->pos.x;
60                         float dy = i->pos.y-j->pos.y;
61                         if(dx*dx+dy*dy<0.0001)
62                         {
63                                 float da = i->dir-j->dir;
64                                 if(da<-M_PI)
65                                         da += M_PI*2;
66                                 if(da>M_PI)
67                                         da -= M_PI*2;
68                                 if(da<-3.1 || da>3.1)
69                                         rm = true;
70                                 i->routes |= j->routes;
71                                 j = endpoints.erase(j);
72                         }
73                         else
74                                 ++j;
75                 }
76
77                 if(rm)
78                         i = endpoints.erase(i);
79                 else
80                         ++i;
81         }
82 }
83
84
85 TrackType::Loader::Loader(TrackType &t):
86         Msp::DataFile::BasicLoader<TrackType>(t)
87 {
88         add("description", &TrackType::description);
89         add("part",        &Loader::part);
90 }
91
92 void TrackType::Loader::finish()
93 {
94         obj.collect_endpoints();
95 }
96
97 void TrackType::Loader::part()
98 {
99         TrackPart p;
100         load_sub(p);
101         obj.parts.push_back(p);
102 }
103
104 } // namespace Marklin