xodrscenfunc.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "xodrscenfunc.h"
  2. xodrscenfunc::xodrscenfunc()
  3. {
  4. }
  5. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadLaneItem(RoadDigit *prd)
  6. {
  7. std::vector<QGraphicsPathItem *> xvectorgrapath;
  8. std::vector<iv::RoadDigitUnit> * pvectorrdu = prd->GetRDU();
  9. int nsize = pvectorrdu->size();
  10. int i;
  11. for(i=0;i<(nsize-1);i++)
  12. {
  13. std::vector<iv::LanePoint> xvepre = pvectorrdu->at(i).mvectorLanePoint;
  14. std::vector<iv::LanePoint> xvenxt = pvectorrdu->at(i+1).mvectorLanePoint;
  15. if((xvepre.size()<2)||(xvenxt.size()<2))
  16. {
  17. continue;
  18. }
  19. unsigned int k;
  20. for(k=0;k<(xvepre.size()-1);k++)
  21. {
  22. QPainterPath xpath;
  23. if((xvenxt.size() != xvepre.size()))
  24. {
  25. double fdis = sqrt(pow(xvenxt.at(0).mfGeoX-xvepre.at(0).mfGeoX,2)
  26. +pow(xvenxt.at(0).mfGeoY - xvepre.at(0).mfGeoY,2));
  27. double fhdg = xvepre.at(0).mfhdg;
  28. xpath.moveTo(xvepre.at(k).mfX,xvepre.at(k).mfY*(-1));
  29. xpath.lineTo(xvepre.at(k).mfX + fdis*cos(fhdg),(xvepre.at(k).mfY + fdis*sin(fhdg))*(-1));
  30. xpath.lineTo(xvepre.at(k+1).mfX + fdis*cos(fhdg),(xvepre.at(k+1).mfY + fdis*sin(fhdg))*(-1));
  31. xpath.lineTo(xvepre.at(k+1).mfX,xvepre.at(k+1).mfY*(-1));
  32. }
  33. else
  34. {
  35. xpath.moveTo(xvepre.at(k).mfX,xvepre.at(k).mfY*(-1));
  36. xpath.lineTo(xvenxt.at(k).mfX,xvenxt.at(k).mfY*(-1));
  37. xpath.lineTo(xvenxt.at(k+1).mfX,xvenxt.at(k+1).mfY*(-1));
  38. xpath.lineTo(xvepre.at(k+1).mfX,xvepre.at(k+1).mfY*(-1));
  39. }
  40. xpath.closeSubpath();
  41. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  42. pitem->setPath(xpath);
  43. // pitem->setPos(mfViewMoveX +VIEW_WIDTH/2,-mfViewMoveY+VIEW_HEIGHT/2);
  44. int nlanetype = xvepre.at(k).mnlanetype;
  45. if(xvepre.at(k).mnlane<=0)nlanetype = xvepre.at(k+1).mnlanetype;
  46. QColor brushcolor = Qt::darkGray;
  47. switch (nlanetype) {
  48. case 0:
  49. brushcolor = QColor(0x66,0xBF,0x00);
  50. break;
  51. case 1:
  52. brushcolor = Qt::darkGreen;
  53. break;
  54. case 2:
  55. brushcolor = Qt::darkGray;
  56. break;
  57. case 8:
  58. brushcolor = Qt::red;
  59. break;
  60. case 9:
  61. brushcolor = QColor(0xB2,0xB2,0xD6);
  62. break;
  63. default:
  64. brushcolor = Qt::yellow;//Qt::darkGreen;
  65. break;
  66. }
  67. pitem->setBrush(brushcolor);
  68. pitem->setPen(QPen(brushcolor,0.001));
  69. // mpscene->addItem(pitem);
  70. xvectorgrapath.push_back(pitem);
  71. }
  72. }
  73. return xvectorgrapath;
  74. }
  75. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadMarkItem(RoadDigit *prd)
  76. {
  77. std::vector<QGraphicsPathItem *> xvectorgrapath;
  78. std::vector<iv::RoadDigitUnit> * pvectorrdu = prd->GetRDU();
  79. int nsize = pvectorrdu->size();
  80. int i;
  81. double flmw = 0.15;
  82. for(i=0;i<(nsize-1);i++)
  83. {
  84. std::vector<iv::LanePoint> xvepre = pvectorrdu->at(i).mvectorLanePoint;
  85. std::vector<iv::LanePoint> xvenxt = pvectorrdu->at(i+1).mvectorLanePoint;
  86. if(xvenxt.size() != xvepre.size())
  87. {
  88. continue;
  89. }
  90. unsigned int k;
  91. int noldmarktype = -1;
  92. double foldx1,foldy1,foldx2,foldy2;
  93. // double foldx1_2,foldy1_2,foldx2_2,foldy2_2;
  94. double fx1,fx2,fx3,fx4,fy1,fy2,fy3,fy4;
  95. for(k=0;k<(xvepre.size());k++)
  96. {
  97. QPainterPath xpath;
  98. int ncolor = -3;
  99. int nmarktype = xvepre[k].mnlanemarktype;
  100. if(nmarktype >= 0)
  101. {
  102. if(nmarktype<2)
  103. {
  104. if((nmarktype == 0)||(IsDrawMark(xvepre[k].mS)))
  105. {
  106. fx1 = xvepre[k].mfX + 0.5*flmw * cos(xvepre[k].mfhdg - M_PI/2.0);
  107. fy1 = (xvepre[k].mfY+0.5*flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0);
  108. fx2 = xvenxt[k].mfX+ 0.5*flmw * cos(xvenxt[k].mfhdg - M_PI/2.0);
  109. fy2 = (xvenxt[k].mfY+0.5*flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0);
  110. fx3 = xvenxt[k].mfX + 0.5*flmw * cos(xvenxt[k].mfhdg + M_PI/2.0);
  111. fy3 = (xvenxt[k].mfY+0.5*flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0);
  112. fx4 = xvepre[k].mfX+ 0.5*flmw * cos(xvepre[k].mfhdg + M_PI/2.0);
  113. fy4 = (xvepre[k].mfY+0.5*flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0);
  114. if(noldmarktype != nmarktype)
  115. {
  116. xpath.moveTo(fx1,fy1);
  117. xpath.lineTo(fx2,fy2);
  118. xpath.lineTo(fx3,fy3);
  119. xpath.lineTo(fx4,fy4);
  120. xpath.closeSubpath();
  121. }
  122. else
  123. {
  124. xpath.moveTo(foldx1,foldy1);
  125. xpath.lineTo(fx2,fy2);
  126. xpath.lineTo(fx3,fy3);
  127. xpath.lineTo(foldx2,foldy2);
  128. xpath.closeSubpath();
  129. foldx1 = fx2;
  130. foldy1 = fy2;
  131. foldx2 = fx3;
  132. foldy2 = fy3;
  133. noldmarktype = nmarktype;
  134. }
  135. ncolor = xvepre[k].mnlanecolor;
  136. }
  137. }
  138. else
  139. {
  140. if((nmarktype == 2)||(nmarktype == 3)||(IsDrawMark(xvepre[k].mS)))
  141. {
  142. xpath.moveTo(xvepre[k].mfX + flmw * cos(xvenxt[k].mfhdg + M_PI/2.0),
  143. (xvepre[k].mfY+flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0));
  144. xpath.lineTo(xvenxt[k].mfX+ flmw * cos(xvepre[k].mfhdg + M_PI/2.0),
  145. (xvenxt[k].mfY+flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0));
  146. xpath.lineTo(xvenxt[k].mfX + 2*flmw * cos(xvenxt[k].mfhdg + M_PI/2.0),
  147. (xvenxt[k].mfY+2*flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0));
  148. xpath.lineTo(xvepre[k].mfX+ 2*flmw * cos(xvepre[k].mfhdg + M_PI/2.0),
  149. (xvepre[k].mfY+2*flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0));
  150. xpath.closeSubpath();
  151. ncolor = xvepre[k].mnlanecolor;
  152. }
  153. if((nmarktype == 2)||(nmarktype == 4)||(IsDrawMark(xvepre[k].mS)))
  154. {
  155. xpath.moveTo(xvepre[k].mfX + flmw * cos(xvenxt[k].mfhdg - M_PI/2.0),
  156. (xvepre[k].mfY+flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0));
  157. xpath.lineTo(xvenxt[k].mfX+ flmw * cos(xvepre[k].mfhdg - M_PI/2.0),
  158. (xvenxt[k].mfY+flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0));
  159. xpath.lineTo(xvenxt[k].mfX + 2*flmw * cos(xvenxt[k].mfhdg - M_PI/2.0),
  160. (xvenxt[k].mfY+2*flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0));
  161. xpath.lineTo(xvepre[k].mfX+ 2*flmw * cos(xvepre[k].mfhdg - M_PI/2.0),
  162. (xvepre[k].mfY+2*flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0));
  163. xpath.closeSubpath();
  164. ncolor = xvepre[k].mnlanecolor;
  165. }
  166. }
  167. }
  168. if(ncolor != -3)
  169. {
  170. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  171. pitem->setPath(xpath);
  172. QColor brushcolor;
  173. switch (ncolor) {
  174. case 0:
  175. brushcolor = Qt::white;
  176. break;
  177. case 1:
  178. brushcolor = Qt::blue;
  179. break;
  180. case 2:
  181. brushcolor = Qt::green;
  182. break;
  183. case 3:
  184. brushcolor = Qt::red;
  185. break;
  186. case 4:
  187. brushcolor = Qt::white;
  188. break;
  189. case 5:
  190. brushcolor = Qt::yellow;
  191. break;
  192. case 6:
  193. brushcolor = Qt::yellow; //orange use yellow replace
  194. break;
  195. default:
  196. brushcolor = Qt::white;
  197. break;
  198. }
  199. pitem->setBrush(brushcolor);
  200. pitem->setPen(QPen(brushcolor,0.001));
  201. // pitem->setPos(mfViewMoveX + VIEW_WIDTH/2,-mfViewMoveY +VIEW_HEIGHT/2);
  202. // mpscene->addItem(pitem);
  203. xvectorgrapath.push_back(pitem);
  204. }
  205. else
  206. {
  207. noldmarktype = -1;
  208. }
  209. }
  210. }
  211. return xvectorgrapath;
  212. }
  213. bool xodrscenfunc::IsDrawMark(double s)
  214. {
  215. const double dotdis = 10.0;
  216. const double dotlen = 5.0;
  217. double y = fmod(s,dotdis);
  218. if(y>dotlen)return true;
  219. else
  220. {
  221. return false;
  222. }
  223. }