roaddigit.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. #include "roaddigit.h"
  2. #include <math.h>
  3. #include "xodrfunc.h"
  4. RoadDigit::RoadDigit(Road * pRoad,double fspace)
  5. {
  6. mpRoad = pRoad;
  7. UpdateSpace(fspace);
  8. }
  9. std::vector<iv::RoadDigitUnit> * RoadDigit::GetRDU()
  10. {
  11. return &mvectorRDU;
  12. }
  13. void RoadDigit::UpdateSpace(double fspace)
  14. {
  15. if(mpRoad == 0)return;
  16. CalcLine(fspace);
  17. CalcLane();
  18. }
  19. int RoadDigit::GetSectionIndex(Road *pRoad, double s)
  20. {
  21. int nrtn = 0;
  22. int nsectioncount = pRoad->GetLaneSectionCount();
  23. if(nsectioncount == 1)return 0;
  24. int i;
  25. for(i=0;i<(nsectioncount-1);i++)
  26. {
  27. if(pRoad->GetLaneSection(i+1)->GetS()>s)
  28. {
  29. break;
  30. }
  31. }
  32. nrtn = i;
  33. return nrtn;
  34. }
  35. void RoadDigit::CalcLine(double fspace)
  36. {
  37. unsigned int j;
  38. iv::RoadDigitUnit rdu;
  39. bool bLastGeo = false;
  40. for(j=0;j<mpRoad->GetGeometryBlockCount();j++)
  41. {
  42. GeometryBlock * pgeob = mpRoad->GetGeometryBlock(j);
  43. double x,y;
  44. double x_center,y_center;
  45. double R;
  46. RoadGeometry * pg;
  47. GeometryArc * parc;
  48. GeometryParamPoly3 * ppp3;
  49. GeometrySpiral *pSpiral;
  50. GeometryPoly3 *ppoly;
  51. double rel_x,rel_y,rel_hdg;
  52. pg = pgeob->GetGeometryAt(0);
  53. x = pg->GetX();
  54. y = pg->GetY();
  55. if(j == (mpRoad->GetGeometryBlockCount() -1))
  56. {
  57. bLastGeo = true;
  58. }
  59. switch (pg->GetGeomType()) {
  60. case 0:
  61. {
  62. rdu.mS = pg->GetS();
  63. rdu.mX = pg->GetX();
  64. rdu.mY = pg->GetY();
  65. rdu.mfHdg = pg->GetHdg();
  66. mvectorRDU.push_back(rdu);
  67. int ncount = pg->GetLength() /fspace;
  68. // int nsec1 = GetSectionIndex(mpRoad,pg->GetS());
  69. // int nsec2 = GetSectionIndex(mpRoad,pg->GetS() + pg->GetLength());
  70. // if(nsec1 != nsec2)
  71. // {
  72. // if((nsec2-nsec1)>1)
  73. // {
  74. // ncount = pg->GetLength()/0.5;
  75. // }
  76. // else
  77. // {
  78. // LaneSection * psec1 = mpRoad->GetLaneSection(nsec1);
  79. // LaneSection * psec2 = mpRoad->GetLaneSection(nsec2);
  80. // if(psec1->GetLaneCount() != psec2->GetLaneCount())
  81. // {
  82. // ncount = pg->GetLength()/0.1;
  83. // }
  84. // }
  85. // }
  86. if(ncount<2)ncount = 2;
  87. double fstep;
  88. if(ncount > 0)fstep = pg->GetLength()/ncount;
  89. int i;
  90. if(bLastGeo )ncount = ncount+1;
  91. double xtem,ytem;
  92. for(i=1;i<ncount;i++)
  93. {
  94. xtem = x + (i*fstep)*cos(pg->GetHdg());
  95. ytem = y + (i*fstep)*sin(pg->GetHdg());
  96. rdu.mS = pg->GetS() + i*fstep;
  97. rdu.mX = xtem;
  98. rdu.mY = ytem;
  99. rdu.mfHdg = pg->GetHdg();
  100. mvectorRDU.push_back(rdu);
  101. }
  102. // if(bLastGeo == false)
  103. // {
  104. // double fx = ncount*fstep -0.1;
  105. // if((fx < pg->GetLength())&&(fx> ((ncount -1 )*fstep)))
  106. // {
  107. // xtem = x + fx*cos(pg->GetHdg());
  108. // ytem = y + fx*sin(pg->GetHdg());
  109. // rdu.mS = pg->GetS() + fx;
  110. // rdu.mX = xtem;
  111. // rdu.mY = ytem;
  112. // rdu.mfHdg = pg->GetHdg();
  113. // mvectorRDU.push_back(rdu);
  114. // }
  115. // }
  116. }
  117. break;
  118. case 1:
  119. pSpiral = (GeometrySpiral * )pg;
  120. {
  121. int ncount = pSpiral->GetLength()/fspace;
  122. if(ncount < 5)ncount = 5;
  123. double sstep = pSpiral->GetLength()/((double)ncount);
  124. int k;
  125. double x0,y0,hdg0,s0;
  126. x0 = pSpiral->GetX();
  127. y0 = pSpiral->GetY();
  128. s0 = pSpiral->GetS();
  129. hdg0 = pSpiral->GetHdg() ;
  130. rdu.mS = s0;
  131. rdu.mX = x0;
  132. rdu.mY = y0;
  133. rdu.mfHdg = hdg0;
  134. mvectorRDU.push_back(rdu);
  135. pSpiral->GetCoords(s0,rel_x,rel_y,rel_hdg);
  136. if(bLastGeo )ncount = ncount+1;
  137. for(k=1;k<ncount;k++)
  138. {
  139. pSpiral->GetCoords(s0+sstep*k,rel_x,rel_y,rel_hdg);
  140. rdu.mS = s0 + sstep * k;
  141. rdu.mX = rel_x;
  142. rdu.mY = rel_y;
  143. rdu.mfHdg = rel_hdg;
  144. mvectorRDU.push_back(rdu);
  145. }
  146. }
  147. break;
  148. case 2:
  149. {
  150. parc = (GeometryArc *)pg;
  151. R = abs(1.0/parc->GetCurvature());
  152. if(parc->GetCurvature() > 0)
  153. {
  154. x_center = pg->GetX() + R *cos(pg->GetHdg() + M_PI/2.0);
  155. y_center = pg->GetY() + R * sin(pg->GetHdg() + M_PI/2.0);
  156. }
  157. else
  158. {
  159. x_center = pg->GetX() + R *cos(pg->GetHdg() -M_PI/2.0);
  160. y_center = pg->GetY() + R * sin(pg->GetHdg() - M_PI/2.0);
  161. }
  162. rdu.mS = pg->GetS();
  163. rdu.mX = pg->GetX();
  164. rdu.mY = pg->GetY();
  165. rdu.mfHdg = pg->GetHdg();
  166. mvectorRDU.push_back(rdu);
  167. int k;
  168. int ncount = parc->GetLength() /fspace;
  169. if(ncount< 5)ncount = 5;
  170. double curv = parc->GetCurvature();
  171. double arcrange = parc->GetLength()/R;
  172. if((arcrange/0.1)>ncount)ncount = arcrange/0.1;
  173. double hdgstep;
  174. double hdg0 = parc->GetHdg();
  175. double hdgnow = parc->GetHdg();
  176. if(ncount > 0) hdgstep= (parc->GetLength()/R)/ncount;
  177. double x_draw,y_draw;
  178. if(curv > 0)
  179. {
  180. hdgnow = hdg0 ;
  181. x_draw = x_center + R *cos(hdgnow - M_PI/2.0);
  182. y_draw = y_center + R * sin(hdgnow - M_PI/2.0);
  183. }
  184. else
  185. {
  186. hdgnow = hdg0;
  187. x_draw = x_center + R *cos(hdgnow + M_PI/2.0);
  188. y_draw = y_center + R * sin(hdgnow + M_PI/2.0);
  189. }
  190. if(bLastGeo )ncount = ncount+1;
  191. for(k=1;k<ncount;k++)
  192. {
  193. if(curv > 0)
  194. {
  195. hdgnow = hdg0 + k*hdgstep;
  196. x_draw = x_center + R *cos(hdgnow - M_PI/2.0);
  197. y_draw = y_center + R * sin(hdgnow - M_PI/2.0);
  198. }
  199. else
  200. {
  201. hdgnow = hdg0 - k * hdgstep;
  202. x_draw = x_center + R *cos(hdgnow + M_PI/2.0);
  203. y_draw = y_center + R * sin(hdgnow + M_PI/2.0);
  204. }
  205. rdu.mS = pg->GetS() + hdgstep * k* R;
  206. rdu.mX = x_draw;
  207. rdu.mY = y_draw;
  208. rdu.mfHdg = hdgnow;
  209. mvectorRDU.push_back(rdu);
  210. }
  211. }
  212. break;
  213. case 3:
  214. {
  215. ppoly = (GeometryPoly3 *)pg;
  216. x = pg->GetX();
  217. y = pg->GetY();
  218. double A,B,C,D;
  219. A = ppoly->GetA();
  220. B = ppoly->GetB();
  221. C = ppoly->GetC();
  222. D = ppoly->GetD();
  223. const double steplim = 0.3;
  224. double du = steplim;
  225. double u = 0;
  226. double v = 0;
  227. double oldx,oldy;
  228. oldx = x;
  229. oldy = y;
  230. double xstart,ystart;
  231. xstart = x;
  232. ystart = y;
  233. rdu.mS = pg->GetS();
  234. rdu.mX = pg->GetX();
  235. rdu.mY = pg->GetY();
  236. rdu.mfHdg = pg->GetHdg();
  237. mvectorRDU.push_back(rdu);
  238. double hdgstart = ppoly->GetHdg();
  239. double flen = 0;
  240. u = u+du;
  241. while(flen < ppoly->GetLength())
  242. {
  243. double fdis = 0;
  244. v = A + B*u + C*u*u + D*u*u*u;
  245. x = xstart + u*cos(hdgstart) - v*sin(hdgstart);
  246. y = ystart + u*sin(hdgstart) + v*cos(hdgstart);
  247. fdis = sqrt(pow(x- oldx,2)+pow(y-oldy,2));
  248. if(fdis>(steplim*2.0))du = du/2.0;
  249. flen = flen + fdis;
  250. u = u + du;
  251. rdu.mS = pg->GetS() + flen;
  252. rdu.mX = x;
  253. rdu.mY = y;
  254. rdu.mfHdg = xodrfunc::CalcHdg(QPointF(oldx,oldy),QPointF(x,y));
  255. mvectorRDU.push_back(rdu);
  256. oldx = x;
  257. oldy = y;
  258. }
  259. }
  260. break;
  261. case 4:
  262. {
  263. ppp3 = (GeometryParamPoly3 * )pg;
  264. int ncount = ppp3->GetLength() /fspace;
  265. if(ncount < 5)ncount = 5;
  266. double sstep;
  267. double arclength = ppp3->GetLength();
  268. if(ncount > 0)sstep = ppp3->GetLength()/ncount;
  269. else sstep = 10000.0;
  270. double s = 0;
  271. double xtem,ytem;
  272. double pr;
  273. xtem = ppp3->GetuA() + ppp3->GetuB() * s + ppp3->GetuC() * s*s + ppp3->GetuD() * s*s*s;
  274. ytem = ppp3->GetvA() + ppp3->GetvB() * s + ppp3->GetvC() * s*s + ppp3->GetvD() * s*s*s;
  275. x = xtem*cos(ppp3->GetHdg()) - ytem * sin(ppp3->GetHdg()) + ppp3->GetX();
  276. y = xtem*sin(ppp3->GetHdg()) + ytem * cos(ppp3->GetHdg()) + ppp3->GetY();
  277. s = s+ sstep;
  278. rdu.mS = pg->GetS();
  279. rdu.mX = pg->GetX();
  280. rdu.mY = pg->GetY();
  281. rdu.mfHdg = pg->GetHdg();
  282. mvectorRDU.push_back(rdu);
  283. double flastx = pg->GetX();
  284. double flasty = pg->GetY();
  285. while(s <= ppp3->GetLength())
  286. {
  287. double pr= 1.0;
  288. if(arclength > 0)pr = s/arclength;
  289. xtem = ppp3->GetuA() + ppp3->GetuB() * pr + ppp3->GetuC() * pr*pr + ppp3->GetuD() * pr*pr*pr;
  290. ytem = ppp3->GetvA() + ppp3->GetvB() * pr + ppp3->GetvC() * pr*pr + ppp3->GetvD() * pr*pr*pr;
  291. x = xtem*cos(ppp3->GetHdg()) - ytem * sin(ppp3->GetHdg()) + ppp3->GetX();
  292. y = xtem*sin(ppp3->GetHdg()) + ytem * cos(ppp3->GetHdg()) + ppp3->GetY();
  293. rdu.mS = pg->GetS() + s;
  294. rdu.mX = x;
  295. rdu.mY = y;
  296. rdu.mfHdg = xodrfunc::CalcHdg(QPointF(flastx,flasty),QPointF(x,y));
  297. mvectorRDU.push_back(rdu);
  298. s = s+ sstep;
  299. }
  300. }
  301. break;
  302. default:
  303. break;
  304. }
  305. // painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  306. }
  307. }
  308. void RoadDigit::CalcLane()
  309. {
  310. int i;
  311. int ncount = mvectorRDU.size();
  312. for(i=0;i<ncount;i++)
  313. {
  314. std::vector<iv::LanePoint> xvectorlp2 = xodrfunc::GetAllLanePoint(mpRoad,mvectorRDU[i].mS,
  315. mvectorRDU[i].mX,mvectorRDU[i].mY,mvectorRDU[i].mfHdg);
  316. mvectorRDU[i].mvectorLanePoint = xvectorlp2;
  317. }
  318. }