vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Edge.h
Go to the documentation of this file.
1 #ifndef EDGE
2 #define EDGE
3 // kazda hrana ma komplementarni hranu (pouze s prohozenymi krizovatkami
4 // fromJunction, toJunction); jestlize ma hrana numLanes 0, je nesjizdna
5 // (auta na ni nemuze jet z bodu Out do In)
6 
7 // hrany jsou vetsinou normalni, vyjimky tvori nasledujici pripady
8 #define NORMAL_EDGE 1
9 // ultrakratka (nebo take velmi kratka) hrana - ma nejaky pruh a splnuje nejmene
10 // 1 z podminek:
11 // 1. vzdalenost mezi from a to hrany je <= nez 1.5*prumerna delka auta
12 // 2. bod OUT vychazi az za bod IN (bod In vychazi blize krizovatce fromJunction
13 // nez bod Out)
14 // 3. pro komplementarni hranu plati predchozi podminka
15 #define ULTRA_SHORT_EDGE 2
16 // ultrakratka hrana bez pruhu
17 #define ULTRA_SHORT_EDGE_WITHOUT_ANY_LANE 3
18 // kratka hrana – hrana se povazuje za kratkou, pokud neni velmi kratka, ma
19 // nejmene jeden pruh a splnuje alespon jedno z tvrzeni:
20 // a) teoreticky existuje auto (s maximalni moznou delkou, ktere by u bodu Out
21 // vyjelo maximalni moznou rychlosti prujezdu krizovatkou), ktere na ni nemuze
22 // zastavit, aniz by ohrozilo provoz na krizovatce pred nim nebo za nim;
23 // jinymi slovy vzdalenost mezi OUT a IN <= 3*prumerna delka auta + 0.4 (rezerva)
24 // (mezi autem, ktere stoji na normalni hrane a bodem IN
25 // ci bodem OUT by mela byt vzdy vzdalenost aspon 0.5 * prumerna delka auta)
26 // b) hrana ma komplementarni kratkou hranu
27 #define SHORT_EDGE 4
28 // normalni nebo kratka hrana bez pruhu
29 #define NORMAL_OR_SHORT_EDGE_WITHOUT_ANY_LANE 5
30 // program ACG vynechava silnice na kraji mesta pri vytvareni jejich XML reprezentace;
31 // kolem stredu nekterych krizovatek tak vznikaji prazdna mista, ktera jsou zaplnena
32 // specialnimi hranami - terminatory
33 #define TERMINATOR_EDGE 6
34 
35 // defaultni hodnota pro tlGreenInterv
36 #define TL_GREEN_INTERV_DEFAULT 6
37 
38 #include <queue>
39 
40 namespace CarSim {
41  // u normalni hrany budou uchovany nektere informace o autu,
42  // jestlize na ni bude mezi body OUT a IN:
43  struct EdgesCar {
44  // offset predni casti auta (predniho narazniku) na hrane
45  float headOffset;
46  // offset zadni casti auta (zadniho narazniku) na hrane
47  float rearOffset;
48  // id dalsiho auta (0 - neplatne id - za autem se
49  // zadne dalsi auto nevyskytuje)
50  unsigned int frontCarId;
51  // id predchoziho auta (0 - neplatne id - pred autem se
52  // zadne predchozu auto nevyskytuje)
53  unsigned int backCarId;
54  // rychlost tohoto auta
55  float vel;
56  };
57 
58  // informace o hrane
59  struct Edge {
60  // id silnice (Road z XML souboru), ke ktere tato hrana patri
61  unsigned int roadId;
62  // smer hrany v ramci silnice (Road v XML souboru),
63  // true urcuje normalni smer dopredu (pravou stranu silnice),
64  // false znaci opacny smer v silnici (levou stranu silnice)
65  bool direction;
66  // id zakladni krizovatky (puvodni krizovatka z XML souboru),
67  // ze ktere hrana vychazi
68  unsigned int from;
69  // id zakladni krizovatky, do ktere hrana vstupuje
70  unsigned int to;
71  // id krajniho bodu (PolygonPoint), ktery urcuje tvar
72  // hrany, tento bod je u krizovatky from
73  unsigned int fromPointRight;
74  // to stejne, akorat tento bod je u krizovatky to
75  unsigned int toPointRight;
76  // pocet pruhu na hrane (v silnici v jednom smeru)
77  unsigned int numLanes;
78  // delka hrany
79  float length;
80  // IN je bod, kde auto vstupuje do krizovatky a kde auto zacne zatacet
81  // (pouze pro kratke a normalni hrany, u ostatnich hran je [0,0,0])
82  osg::Vec3 inPos;
83  // bod, ve kterem auto prestane zatacet (kde auto vyjizdi ze krizovtky)
84  // (pouze pro kratke a normalni hrany, u ostatnich hran je [0,0,0])
85  osg::Vec3 outPos;
86  // vektor z bodu OUT do bodu IN, jedna se o smer, jakym v idealnim pripade
87  // pojede hranou auto;
88  // (pouze pro kratke a normalni hrany, u ostatnich hran je [0,0,0])
89  osg::Vec3 outInVec;
90  // normala teto hrany (uz je znormalizovana)
91  osg::Vec3 normal;
92  // offset (ne v procentech, ale in (0,1)), ktery urcuje bod mezi body Out a In, kde auto
93  // zastavi svym prednim naraznikem, jestlize se rozhodne zastavit pred dalsi krizovatkou;
94  // ten bod se nachazi 0.5*(prumerna delka auta) pred bodem IN hrany;
95  // mezi posledni stojicim autem na hrane a bodem IN se nechava prostor dlouhy
96  // 0.5*(prumerna delka auta), aby auto neohrozilo provoz u nasledujici kriz.
97  // (pouze pro normalni hrany, u ostatnich hran je 0)
99  // offset (ne v procentech, ale in (0,1)), ktery urcuje bod mezi body OUT a IN, ktery
100  // kdyz auto prejede svym prednim naraznikem, rozhodne se, jestli projede dalsi
101  // krizovatkou hned nebo bude brzdit k bodu stopBeforeJunc (aby dalo nejakemu autu prednost);
102  // tato pozice se nachazi 2.0*(prumerna delka auta) pred bodem IN hrany;
103  // (pouze pro normalni hrany, u ostatnich hran je 0)
105  // typ hrany - hodnoty viz vyse
106  unsigned int type;
107  // sirka hrany u bodu toPointRight;
108  // (pouze pro kratke a normalni hrany, u ostatnich hran je 0)
109  float widthTPR;
110  // sirka hrany u bodu fromPointRight;
111  // (pouze pro kratke a normalni hrany, u ostatnich hran je 0)
112  float widthFPR;
113  // offset, ktery urcuje bod, za kterym (smerem k bodu IN) se musi nachazet zadni cast
114  // auta na startu a v cili; ten bod je vzdalen 0.5*prumerna delka auta
115  // od bodu OUT a ocita se za timto bodem (smerem k IN);
116  // (ma smysl pouze pro normalni hrany - auto musi zacinat a koncit na normalni hrane)
118  // jestlize hrana je normalni, jsou zde pro kazde auto (klic - id auta) na teto hrane
119  // mezi OUT a IN ulozeny informace ve strukture EdgesCar
120  std::map<unsigned int,EdgesCar> edgesCars;
121  // id 1. auta na hrane mezi body OUT a IN;
122  // (0 - neplatne id - na hrane jeste zadne auto neni);
123  // (opet pouze pro normalni hrany)
124  unsigned int fstCarId;
125  // id posledniho auta na hrane mezi body OUT a IN;
126  // (0 - neplatne id - na hrane jeste zadne auto neni);
127  // (opet pouze pro normalni hrany)
128  unsigned int lastCarId;
129 
130  // ma vyznam pouze u kratke hrany - jsou tam id aut, ktera pres ni pojedou
131  // (z Out do In) ve sve pristi velke krizovatce, jsou posledni na normalni hrane
132  // a jsou blizko dalsi krizovatky (tak, ze ostatni auta, ktera pojedou
133  // pres cast te kratke hrany za bodem In, zvazuji, zda jim daji prednost);
134  // mapovana hodnota obsahuje true, jestlize auto na normalni hrane stoji
135  std::map<unsigned int,bool> incomingCars;
136 
137  // u normalnich hran zde je fronta s id odsunutych/odskocenych aut
138  // (byla docasne odsunuta, protoze branila prujezdu ostatnich aut
139  // - stala pred bodem stopBeforeJunc hrany prilis dlouho);
140  // prvni auto (vpredu fronty) bylo nejdrive odsunuto, posledni auto zase nejpozdeji
141  // ze vsech aktualne odsunutych aut na hrane
142  std::queue<unsigned int> putAsideCars;
143 
144  // pocet sekund, po ktere ma na semaforu u puvodni krizovatky to pro tuto hranu svitit
145  // zelena (pokud puvodni krizovatka to ani ji nadrazena mala krizovatka (pokud se sloucila
146  // do vetsi krizovatky) nejsou rizeny pomoci semaforu, nebude tato hodnota pouzita; tato hodnota
147  // se nacita z XML konfiguracniho souboru, pokud v nem neni uvedena, pouzije se defaultni hodnota
148  // - viz nahore)
149  unsigned int tlGreenInterv;
150  };
151 }
152 
153 #endif
154 
155