ivtraceview.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "ivtraceview.h"
  2. #include <memory>
  3. #define VIEW_WIDTH 2000
  4. #define VIEW_HEIGHT 2000
  5. ivtraceview::ivtraceview()
  6. {
  7. // mpix.load(":/car1.png");
  8. image = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  9. mimagepaint = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);
  10. painter = new QPainter(image);
  11. painter->end();
  12. }
  13. void ivtraceview::run()
  14. {
  15. while(!QThread::isInterruptionRequested())
  16. {
  17. // if(mnReadIndex != mnWriteIndex)
  18. if(mbGPSUpdate || mbNDTUpdate || mbNDTCalibUpdate)
  19. {
  20. paint();
  21. mnReadIndex = mnWriteIndex;
  22. mbImageUpdate = true;
  23. mbGPSUpdate = false;
  24. mbNDTUpdate = false;
  25. mbNDTCalibUpdate = false;
  26. mbGlobalGPSUpdate = false;
  27. }
  28. else
  29. {
  30. msleep(10);
  31. }
  32. // paint();
  33. // mbImageUpdate = true;
  34. // msleep(1000);
  35. }
  36. }
  37. void ivtraceview::paint()
  38. {
  39. int i;
  40. std::vector<iv::ndttracepoint> xvectorndtxy;
  41. std::vector<iv::ndttracepoint> xvectorndtcalibxy;
  42. std::vector<iv::ndttracepoint> xvectorgpsxy;
  43. std::vector<iv::ndttracepoint> xvectorglobalgpsxy;
  44. mMutexGlobalGPS.lock();
  45. xvectorglobalgpsxy = mvectorglobalgpsxy;
  46. mMutexGlobalGPS.unlock();
  47. mMutexGPS.lock();
  48. xvectorgpsxy = mvectorgpsxy;
  49. mMutexGPS.unlock();
  50. mMutexNDT.lock();
  51. xvectorndtxy = mvectorndtxy;
  52. mMutexNDT.unlock();
  53. mMutexNDTCalib.lock();
  54. xvectorndtcalibxy = mvectorndtcalibxy;
  55. mMutexNDTCalib.unlock();
  56. painter->begin(image);
  57. image->fill(QColor(255, 255, 255));//对画布进行填充
  58. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  59. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  60. painter->translate(VIEW_WIDTH/2,VIEW_HEIGHT/2);
  61. painter->setPen(Qt::black);
  62. painter->drawLine(-VIEW_WIDTH/2,0,VIEW_WIDTH/2,0);
  63. painter->drawLine(0,-VIEW_HEIGHT/2,0,VIEW_HEIGHT/2);
  64. int viewstep1 = VIEW_WIDTH/2;
  65. int viewstep2 = VIEW_HEIGHT/2;
  66. for(i=-9;i<=9;i++)
  67. {
  68. painter->drawLine(i*viewstep1,0,i*viewstep1,-20);
  69. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*10));
  70. }
  71. // std::cout<<"enter paint."<<std::endl;
  72. painter->save();
  73. painter->rotate(90);
  74. for(i=-9;i<=9;i++)
  75. {
  76. painter->drawLine(i*viewstep2,0,i*viewstep2,-20);
  77. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*(-10)));
  78. }
  79. painter->restore();
  80. painter->translate(-VIEW_WIDTH/2,-VIEW_HEIGHT/2);
  81. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  82. QPen penPoint;
  83. penPoint.setColor(Qt::blue);
  84. penPoint.setWidth(1);
  85. painter->setPen(penPoint);//蓝色的笔,用于标记各个点
  86. int pointx = VIEW_WIDTH/2, pointy = VIEW_HEIGHT/2;//确定坐标轴起点坐标,这里定义(35,280)
  87. int nsize = xvectorndtxy.size();
  88. for(i=0;i<nsize;i++)
  89. {
  90. painter->drawPoint(pointx + mnFac * xvectorndtxy[i].x, pointy - mnFac *xvectorndtxy[i].y);
  91. }
  92. penPoint.setColor(Qt::yellow);
  93. penPoint.setWidth(1);
  94. painter->setPen(penPoint);//蓝色的笔,用于标记各个点
  95. nsize = xvectorgpsxy.size();
  96. for(i=0;i<nsize;i++)
  97. {
  98. painter->drawPoint(pointx + mnFac *xvectorgpsxy[i].x, pointy - mnFac *xvectorgpsxy[i].y);
  99. }
  100. penPoint.setColor(Qt::red);
  101. penPoint.setWidth(1);
  102. painter->setPen(penPoint);//蓝色的笔,用于标记各个点
  103. nsize = xvectorndtcalibxy.size();
  104. for(i=0;i<nsize;i++)
  105. {
  106. painter->drawPoint(pointx + mnFac *xvectorndtcalibxy[i].x, pointy - mnFac *xvectorndtcalibxy[i].y);
  107. }
  108. penPoint.setColor(Qt::green);
  109. penPoint.setWidth(1);
  110. painter->setPen(penPoint);//蓝色的笔,用于标记各个点
  111. nsize = xvectorglobalgpsxy.size();
  112. for(i=0;i<nsize;i++)
  113. {
  114. painter->drawPoint(pointx + mnFac *xvectorglobalgpsxy[i].x, pointy - mnFac *xvectorglobalgpsxy[i].y);
  115. }
  116. //pix.load("car.png");
  117. // painter->drawPixmap(VIEW_WIDTH/2-15,VIEW_HEIGHT/2-34,30,67,mpix);
  118. painter->end();
  119. mMutexPaint.lock();
  120. // delete mimagepaint;
  121. // mimagepaint = new QImage(*image);
  122. *mimagepaint = image->copy();
  123. mMutexPaint.unlock();
  124. }
  125. QImage ivtraceview::GetImage()
  126. {
  127. mMutexPaint.lock();
  128. // QImage imagertn(*mimagepaint);
  129. QImage imagertn = mimagepaint->copy();
  130. mMutexPaint.unlock();
  131. mbImageUpdate = false;
  132. return imagertn;
  133. }
  134. bool ivtraceview::IsHaveNew()
  135. {
  136. return mbImageUpdate;
  137. }
  138. int ivtraceview::GetType()
  139. {
  140. return 3;
  141. }
  142. void ivtraceview::SetNDTTrace(std::vector<iv::ndttracepoint> xvectorndtxy)
  143. {
  144. mMutexNDT.lock();
  145. mvectorndtxy = xvectorndtxy;
  146. mbNDTUpdate = true;
  147. mMutexNDT.unlock();
  148. }
  149. void ivtraceview::SetGPSTrace(std::vector<iv::ndttracepoint> xvectorgpsxy)
  150. {
  151. mMutexGPS.lock();
  152. mvectorgpsxy = xvectorgpsxy;
  153. mbGPSUpdate = true;
  154. mMutexGPS.unlock();
  155. }
  156. void ivtraceview::SetNDTCalibTrace(std::vector<iv::ndttracepoint> xvectorndtxy)
  157. {
  158. mMutexNDTCalib.lock();
  159. mvectorndtcalibxy = xvectorndtxy;
  160. mbNDTCalibUpdate = true;
  161. mMutexNDTCalib.unlock();
  162. }
  163. void ivtraceview::SetFac(int nFac)
  164. {
  165. mnFac = nFac;
  166. }
  167. void ivtraceview::SetGlobalGPSTrace(std::vector<iv::ndttracepoint> xvectorgpsxy)
  168. {
  169. mMutexGlobalGPS.lock();
  170. mvectorglobalgpsxy = xvectorgpsxy;
  171. mbGlobalGPSUpdate = true;
  172. mMutexGlobalGPS.unlock();
  173. }