xodrscenfunc.cpp 8.4 KB

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