xodrscenfunc.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #include "xodrscenfunc.h"
  2. xodrscenfunc::xodrscenfunc()
  3. {
  4. }
  5. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadParkingItem(RoadDigit *prd,std::vector<QGraphicsTextItem *> & xvectortext,
  6. std::vector<QGraphicsPathItem *> & xvectormarkgraph)
  7. {
  8. std::vector<QGraphicsPathItem *> xvectorgrapath;
  9. std::vector<iv::ParkingPoint> * pvectorpark = prd->GetParkingPoint();
  10. unsigned int lsize = pvectorpark->size();
  11. unsigned int i;
  12. for(i=0;i<lsize;i++)
  13. {
  14. std::vector<iv::ParkingXY> xvectorxy = pvectorpark->at(i).mParkingXY;
  15. QPainterPath xpath;
  16. xpath.moveTo(xvectorxy[0].mX,xvectorxy[0].mY*(-1));
  17. xpath.lineTo(xvectorxy[1].mX,xvectorxy[1].mY*(-1));
  18. xpath.lineTo(xvectorxy[2].mX,xvectorxy[2].mY*(-1));
  19. xpath.lineTo(xvectorxy[3].mX,xvectorxy[3].mY*(-1));
  20. xpath.closeSubpath();
  21. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  22. pitem->setPath(xpath);
  23. pitem->setBrush(Qt::darkGray);
  24. pitem->setPen(QPen(Qt::darkGray,0.001));
  25. xvectorgrapath.push_back(pitem);
  26. QGraphicsTextItem * pitemtext = new QGraphicsTextItem;
  27. pitemtext->setPlainText(pvectorpark->at(i).strtext.data());
  28. QRectF xrect = pitemtext->boundingRect();
  29. QFont font = pitemtext->font();
  30. font.setPixelSize(100.0);
  31. // font.setPixelSize(1); // 像素大小
  32. // font.setItalic(false); // 斜体
  33. // font.setUnderline(false); // 下划线
  34. pitemtext->setFont(font);
  35. // pitemtext->setFont(QFont("华文琥珀",10));
  36. pitemtext->setDefaultTextColor(QColor(255,255,255));
  37. pitemtext->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
  38. double fScale = 0.01;
  39. pitemtext->setScale(fScale);
  40. xrect = pitemtext->boundingRect();
  41. qDebug("rect height: %f",xrect.height());
  42. double fwidth = xrect.width() * fScale;
  43. double fheight = xrect.height()*fScale;
  44. double ftemx = fwidth * (-0.5);
  45. double ftemy = fheight * 0.5;
  46. double fparkhdg = pvectorpark->at(i).mfHdg;
  47. double fposx = ftemx*cos(fparkhdg)-ftemy*sin(fparkhdg);
  48. double fposy = ftemx*sin(fparkhdg)+ftemy*cos(fparkhdg);
  49. // pitemtext->setDefaultTextColor(QColor(0, 160, 230)); // 文本色
  50. pitemtext->setDefaultTextColor(Qt::white);
  51. pitemtext->setRotation(pvectorpark->at(i).mfHdg *(-1.0)*180.0/M_PI);
  52. pitemtext->setPos(pvectorpark->at(i).mParkingCenterXY.mX + fposx,(pvectorpark->at(i).mParkingCenterXY.mY+fposy)*(-1));
  53. xvectortext.push_back(pitemtext);
  54. }
  55. for(i=0;i<lsize;i++)
  56. {
  57. std::vector<std::vector<iv::ParkingXY>> xvectormark = pvectorpark->at(i).mParkingMark;
  58. unsigned int j;
  59. for(j=0;j<xvectormark.size();j++)
  60. {
  61. QPainterPath xpath;
  62. if(xvectormark.at(j).size()<4)
  63. {
  64. std::cout<<"Park Mark size < 4"<<std::endl;
  65. continue;
  66. }
  67. xpath.moveTo(xvectormark.at(j).at(0).mX,xvectormark.at(j).at(0).mY*(-1));
  68. xpath.lineTo(xvectormark.at(j).at(1).mX,xvectormark.at(j).at(1).mY*(-1));
  69. xpath.lineTo(xvectormark.at(j).at(2).mX,xvectormark.at(j).at(2).mY*(-1));
  70. xpath.lineTo(xvectormark.at(j).at(3).mX,xvectormark.at(j).at(3).mY*(-1));
  71. xpath.closeSubpath();
  72. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  73. pitem->setPath(xpath);
  74. pitem->setBrush(Qt::yellow);
  75. pitem->setPen(QPen(Qt::white,0.001));
  76. xvectormarkgraph.push_back(pitem);
  77. }
  78. }
  79. return xvectorgrapath;
  80. }
  81. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadRefGeoItem(RoadDigit *prd)
  82. {
  83. std::vector<QGraphicsPathItem *> xvectorgrapath;
  84. std::vector<iv::RoadDigitUnit> * pvectorrdu = prd->GetRDU();
  85. int nsize = pvectorrdu->size();
  86. int i;
  87. double fgeowidth = 0.3;
  88. double fmarklen = 3.0;
  89. for(i=0;i<(nsize-1);i++)
  90. {
  91. QPainterPath xpath;
  92. double fx1,fx2,fx3,fx4,fy1,fy2,fy3,fy4;
  93. fx1 = pvectorrdu->at(i).mX + 0.5*fgeowidth * cos(pvectorrdu->at(i).mfHdg - M_PI/2.0);
  94. fy1 = (pvectorrdu->at(i).mY + 0.5* fgeowidth * sin(pvectorrdu->at(i).mfHdg - M_PI/2.0))*(-1.0);
  95. fx2 = pvectorrdu->at(i+1).mX+ 0.5*fgeowidth * cos(pvectorrdu->at(i+1).mfHdg - M_PI/2.0);
  96. fy2 = (pvectorrdu->at(i+1).mY +0.5*fgeowidth * sin(pvectorrdu->at(i+1).mfHdg - M_PI/2.0))*(-1.0);
  97. fx3 = pvectorrdu->at(i+1).mX + 0.5*fgeowidth * cos(pvectorrdu->at(i+1).mfHdg + M_PI/2.0);
  98. fy3 = (pvectorrdu->at(i+1).mY+0.5*fgeowidth * sin(pvectorrdu->at(i+1).mfHdg + M_PI/2.0))*(-1.0);
  99. fx4 = pvectorrdu->at(i).mX+ 0.5*fgeowidth * cos(pvectorrdu->at(i).mfHdg + M_PI/2.0);
  100. fy4 = (pvectorrdu->at(i).mY+0.5*fgeowidth * sin(pvectorrdu->at(i).mfHdg + M_PI/2.0))*(-1.0);
  101. xpath.moveTo(fx1,fy1);
  102. xpath.lineTo(fx2,fy2);
  103. xpath.lineTo(fx3,fy3);
  104. xpath.lineTo(fx4,fy4);
  105. xpath.closeSubpath();
  106. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  107. pitem->setPath(xpath);
  108. QColor brushcolor = Qt::red;
  109. pitem->setBrush(brushcolor);
  110. pitem->setPen(QPen(brushcolor,0.001));
  111. xvectorgrapath.push_back(pitem);
  112. }
  113. if(nsize>0)
  114. {
  115. QPainterPath xpath;
  116. double fx1,fx2,fx3,fx4,fy1,fy2,fy3,fy4;
  117. fx1 = pvectorrdu->at(0).mX + 0.5*fmarklen * cos(pvectorrdu->at(0).mfHdg - M_PI/2.0);
  118. fy1 = (pvectorrdu->at(0).mY + 0.5* fmarklen * sin(pvectorrdu->at(0).mfHdg - M_PI/2.0))*(-1.0);
  119. fx2 = pvectorrdu->at(0).mX+ 0.5*fmarklen * cos(pvectorrdu->at(0).mfHdg + M_PI/2.0);
  120. fy2 = (pvectorrdu->at(0).mY+0.5*fmarklen * sin(pvectorrdu->at(0).mfHdg + M_PI/2.0))*(-1.0);
  121. // fx3 = pvectorrdu->at(0).mX+ 0.65*fmarklen * cos(pvectorrdu->at(0).mfHdg );
  122. // fy3 = (pvectorrdu->at(0).mY+0.65*fmarklen * sin(pvectorrdu->at(0).mfHdg ))*(-1.0);
  123. fx3 = fx2+ 0.1*fmarklen * cos(pvectorrdu->at(0).mfHdg);
  124. fy3 = (fy2*(-1.0)+0.1*fmarklen * sin(pvectorrdu->at(0).mfHdg ))*(-1.0);
  125. fx4 = fx1+ 0.1*fmarklen * cos(pvectorrdu->at(0).mfHdg );
  126. fy4 = (fy1*(-1.0)+0.1*fmarklen * sin(pvectorrdu->at(0).mfHdg ))*(-1.0);
  127. xpath.moveTo(fx1,fy1);
  128. xpath.lineTo(fx2,fy2);
  129. xpath.lineTo(fx3,fy3);
  130. xpath.lineTo(fx4,fy4);
  131. xpath.closeSubpath();
  132. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  133. pitem->setPath(xpath);
  134. QColor brushcolor = Qt::green;
  135. pitem->setBrush(brushcolor);
  136. pitem->setPen(QPen(brushcolor,0.001));
  137. xvectorgrapath.push_back(pitem);
  138. }
  139. return xvectorgrapath;
  140. }
  141. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadLaneItem(RoadDigit *prd)
  142. {
  143. std::vector<QGraphicsPathItem *> xvectorgrapath;
  144. std::vector<iv::RoadDigitUnit> * pvectorrdu = prd->GetRDU();
  145. int nsize = pvectorrdu->size();
  146. int i;
  147. for(i=0;i<(nsize-1);i++)
  148. {
  149. std::vector<iv::LanePoint> xvepre = pvectorrdu->at(i).mvectorLanePoint;
  150. std::vector<iv::LanePoint> xvenxt = pvectorrdu->at(i+1).mvectorLanePoint;
  151. if((xvepre.size()<2)||(xvenxt.size()<2))
  152. {
  153. continue;
  154. }
  155. unsigned int k;
  156. for(k=0;k<(xvepre.size()-1);k++)
  157. {
  158. QPainterPath xpath;
  159. if((xvenxt.size() != xvepre.size()))
  160. {
  161. double fdis = sqrt(pow(xvenxt.at(0).mfGeoX-xvepre.at(0).mfGeoX,2)
  162. +pow(xvenxt.at(0).mfGeoY - xvepre.at(0).mfGeoY,2));
  163. double fhdg = xvepre.at(0).mfhdg;
  164. xpath.moveTo(xvepre.at(k).mfX,xvepre.at(k).mfY*(-1));
  165. xpath.lineTo(xvepre.at(k).mfX + fdis*cos(fhdg),(xvepre.at(k).mfY + fdis*sin(fhdg))*(-1));
  166. xpath.lineTo(xvepre.at(k+1).mfX + fdis*cos(fhdg),(xvepre.at(k+1).mfY + fdis*sin(fhdg))*(-1));
  167. xpath.lineTo(xvepre.at(k+1).mfX,xvepre.at(k+1).mfY*(-1));
  168. }
  169. else
  170. {
  171. xpath.moveTo(xvepre.at(k).mfX,xvepre.at(k).mfY*(-1));
  172. xpath.lineTo(xvenxt.at(k).mfX,xvenxt.at(k).mfY*(-1));
  173. xpath.lineTo(xvenxt.at(k+1).mfX,xvenxt.at(k+1).mfY*(-1));
  174. xpath.lineTo(xvepre.at(k+1).mfX,xvepre.at(k+1).mfY*(-1));
  175. }
  176. xpath.closeSubpath();
  177. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  178. pitem->setPath(xpath);
  179. // pitem->setPos(mfViewMoveX +VIEW_WIDTH/2,-mfViewMoveY+VIEW_HEIGHT/2);
  180. int nlanetype = xvepre.at(k).mnlanetype;
  181. if(xvepre.at(k).mnlane<=0)nlanetype = xvepre.at(k+1).mnlanetype;
  182. QColor brushcolor = Qt::darkGray;
  183. switch (nlanetype) {
  184. case 0:
  185. brushcolor = QColor(0x66,0xBF,0x00);
  186. break;
  187. case 1:
  188. brushcolor = Qt::darkGreen;
  189. break;
  190. case 2:
  191. brushcolor = Qt::darkGray;
  192. break;
  193. case 8:
  194. brushcolor = Qt::red;
  195. break;
  196. case 9:
  197. brushcolor = QColor(0xB2,0xB2,0xD6);
  198. break;
  199. default:
  200. brushcolor = Qt::yellow;//Qt::darkGreen;
  201. break;
  202. }
  203. pitem->setBrush(brushcolor);
  204. pitem->setPen(QPen(brushcolor,0.001));
  205. // mpscene->addItem(pitem);
  206. xvectorgrapath.push_back(pitem);
  207. }
  208. }
  209. return xvectorgrapath;
  210. }
  211. std::vector<QGraphicsPathItem *> xodrscenfunc::GetRoadMarkItem(RoadDigit *prd)
  212. {
  213. std::vector<QGraphicsPathItem *> xvectorgrapath;
  214. std::vector<iv::RoadDigitUnit> * pvectorrdu = prd->GetRDU();
  215. int nsize = pvectorrdu->size();
  216. int i;
  217. double flmw = 0.15;
  218. for(i=0;i<(nsize-1);i++)
  219. {
  220. std::vector<iv::LanePoint> xvepre = pvectorrdu->at(i).mvectorLanePoint;
  221. std::vector<iv::LanePoint> xvenxt = pvectorrdu->at(i+1).mvectorLanePoint;
  222. if(xvenxt.size() != xvepre.size())
  223. {
  224. continue;
  225. }
  226. unsigned int k;
  227. int noldmarktype = -1;
  228. double foldx1,foldy1,foldx2,foldy2;
  229. // double foldx1_2,foldy1_2,foldx2_2,foldy2_2;
  230. double fx1,fx2,fx3,fx4,fy1,fy2,fy3,fy4;
  231. for(k=0;k<(xvepre.size());k++)
  232. {
  233. QPainterPath xpath;
  234. int ncolor = -3;
  235. int nmarktype = xvepre[k].mnlanemarktype;
  236. if(nmarktype >= 0)
  237. {
  238. if(nmarktype<2)
  239. {
  240. if(xvepre[k].mnlane == 0)
  241. {
  242. int ooo = 0;
  243. ooo++;
  244. }
  245. if((nmarktype == 0)||(IsDrawMark(xvepre[k].mS)))
  246. {
  247. if(xvepre[k].mnlane == 0)
  248. {
  249. int ooo = 0;
  250. ooo++;
  251. }
  252. fx1 = xvepre[k].mfX + 0.5*flmw * cos(xvepre[k].mfhdg - M_PI/2.0);
  253. fy1 = (xvepre[k].mfY+0.5*flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0);
  254. fx2 = xvenxt[k].mfX+ 0.5*flmw * cos(xvenxt[k].mfhdg - M_PI/2.0);
  255. fy2 = (xvenxt[k].mfY+0.5*flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0);
  256. fx3 = xvenxt[k].mfX + 0.5*flmw * cos(xvenxt[k].mfhdg + M_PI/2.0);
  257. fy3 = (xvenxt[k].mfY+0.5*flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0);
  258. fx4 = xvepre[k].mfX+ 0.5*flmw * cos(xvepre[k].mfhdg + M_PI/2.0);
  259. fy4 = (xvepre[k].mfY+0.5*flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0);
  260. if(noldmarktype != nmarktype)
  261. {
  262. xpath.moveTo(fx1,fy1);
  263. xpath.lineTo(fx2,fy2);
  264. xpath.lineTo(fx3,fy3);
  265. xpath.lineTo(fx4,fy4);
  266. xpath.closeSubpath();
  267. }
  268. else
  269. {
  270. xpath.moveTo(foldx1,foldy1);
  271. xpath.lineTo(fx2,fy2);
  272. xpath.lineTo(fx3,fy3);
  273. xpath.lineTo(foldx2,foldy2);
  274. xpath.closeSubpath();
  275. foldx1 = fx2;
  276. foldy1 = fy2;
  277. foldx2 = fx3;
  278. foldy2 = fy3;
  279. noldmarktype = nmarktype;
  280. }
  281. ncolor = xvepre[k].mnlanecolor;
  282. }
  283. }
  284. else
  285. {
  286. if((nmarktype == 2)||(nmarktype == 3)||(IsDrawMark(xvepre[k].mS)))
  287. {
  288. xpath.moveTo(xvepre[k].mfX + flmw * cos(xvenxt[k].mfhdg + M_PI/2.0),
  289. (xvepre[k].mfY+flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0));
  290. xpath.lineTo(xvenxt[k].mfX+ flmw * cos(xvepre[k].mfhdg + M_PI/2.0),
  291. (xvenxt[k].mfY+flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0));
  292. xpath.lineTo(xvenxt[k].mfX + 2*flmw * cos(xvenxt[k].mfhdg + M_PI/2.0),
  293. (xvenxt[k].mfY+2*flmw * sin(xvenxt[k].mfhdg + M_PI/2.0))*(-1.0));
  294. xpath.lineTo(xvepre[k].mfX+ 2*flmw * cos(xvepre[k].mfhdg + M_PI/2.0),
  295. (xvepre[k].mfY+2*flmw * sin(xvepre[k].mfhdg + M_PI/2.0))*(-1.0));
  296. xpath.closeSubpath();
  297. ncolor = xvepre[k].mnlanecolor;
  298. }
  299. if((nmarktype == 2)||(nmarktype == 4)||(IsDrawMark(xvepre[k].mS)))
  300. {
  301. xpath.moveTo(xvepre[k].mfX + flmw * cos(xvenxt[k].mfhdg - M_PI/2.0),
  302. (xvepre[k].mfY+flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0));
  303. xpath.lineTo(xvenxt[k].mfX+ flmw * cos(xvepre[k].mfhdg - M_PI/2.0),
  304. (xvenxt[k].mfY+flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0));
  305. xpath.lineTo(xvenxt[k].mfX + 2*flmw * cos(xvenxt[k].mfhdg - M_PI/2.0),
  306. (xvenxt[k].mfY+2*flmw * sin(xvenxt[k].mfhdg - M_PI/2.0))*(-1.0));
  307. xpath.lineTo(xvepre[k].mfX+ 2*flmw * cos(xvepre[k].mfhdg - M_PI/2.0),
  308. (xvepre[k].mfY+2*flmw * sin(xvepre[k].mfhdg - M_PI/2.0))*(-1.0));
  309. xpath.closeSubpath();
  310. ncolor = xvepre[k].mnlanecolor;
  311. }
  312. }
  313. }
  314. if(ncolor != -3)
  315. {
  316. QGraphicsPathItem * pitem = new QGraphicsPathItem;
  317. pitem->setPath(xpath);
  318. QColor brushcolor;
  319. switch (ncolor) {
  320. case 0:
  321. brushcolor = Qt::white;
  322. break;
  323. case 1:
  324. brushcolor = Qt::blue;
  325. break;
  326. case 2:
  327. brushcolor = Qt::green;
  328. break;
  329. case 3:
  330. brushcolor = Qt::red;
  331. break;
  332. case 4:
  333. brushcolor = Qt::white;
  334. break;
  335. case 5:
  336. brushcolor = Qt::yellow;
  337. break;
  338. case 6:
  339. brushcolor = Qt::yellow; //orange use yellow replace
  340. break;
  341. default:
  342. brushcolor = Qt::white;
  343. break;
  344. }
  345. pitem->setBrush(brushcolor);
  346. pitem->setPen(QPen(brushcolor,0.001));
  347. // pitem->setPos(mfViewMoveX + VIEW_WIDTH/2,-mfViewMoveY +VIEW_HEIGHT/2);
  348. // mpscene->addItem(pitem);
  349. xvectorgrapath.push_back(pitem);
  350. }
  351. else
  352. {
  353. noldmarktype = -1;
  354. }
  355. }
  356. }
  357. return xvectorgrapath;
  358. }
  359. bool xodrscenfunc::IsDrawMark(double s)
  360. {
  361. const double dotdis = 10.0;
  362. const double dotlen = 5.0;
  363. double y = fmod(s,dotdis);
  364. if(y>=dotlen)return true;
  365. else
  366. {
  367. return false;
  368. }
  369. }