ivpcdview.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "ivpcdview.h"
  2. #include <QTime>
  3. IVPCDView::IVPCDView()
  4. {
  5. image = new QImage(2000, 2000, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  6. mimagepaint = new QImage(2000, 2000, QImage::Format_RGB32);
  7. painter = new QPainter(image);
  8. painter->end();
  9. }
  10. void IVPCDView::run()
  11. {
  12. while(!QThread::isInterruptionRequested())
  13. {
  14. if(mnReadIndex != mnWriteIndex)
  15. {
  16. paint();
  17. mnReadIndex = mnWriteIndex;
  18. mbImageUpdate = true;
  19. }
  20. else
  21. {
  22. msleep(1);
  23. }
  24. }
  25. }
  26. void IVPCDView::SetPointCloud(pcl::PointCloud<pcl::PointXYZI>::Ptr pc)
  27. {
  28. mMutex.lock();
  29. pc.swap(mpoint_cloud);
  30. mnWriteIndex++;
  31. mMutex.unlock();
  32. }
  33. void IVPCDView::paint()
  34. {
  35. QTime xTime;
  36. xTime.start();
  37. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  38. new pcl::PointCloud<pcl::PointXYZI>());
  39. int nz = 0;
  40. mMutex.lock();
  41. point_cloud.swap(mpoint_cloud);
  42. mMutex.unlock();
  43. if(point_cloud->width <1)return;
  44. painter->begin(image);
  45. image->fill(QColor(255, 255, 255));//对画布进行填充
  46. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  47. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  48. painter->translate(1000,1000);
  49. painter->setPen(Qt::black);
  50. painter->drawLine(-1000,0,1000,0);
  51. painter->drawLine(0,-1000,0,1000);
  52. int i;
  53. for(i=-9;i<=9;i++)
  54. {
  55. painter->drawLine(i*100,0,i*100,-20);
  56. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*10));
  57. }
  58. // std::cout<<"enter paint."<<std::endl;
  59. painter->save();
  60. painter->rotate(90);
  61. for(i=-9;i<=9;i++)
  62. {
  63. painter->drawLine(i*100,0,i*100,-20);
  64. // painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*(-10)));
  65. }
  66. painter->restore();
  67. if(point_cloud != 0)
  68. {
  69. for(i=0;i<point_cloud->width;i++)
  70. {
  71. pcl::PointXYZI pxyzi = point_cloud->at(i);
  72. int x,y;
  73. // std::cout<<" x is "<<pxyzi.x<<" y is "<<pxyzi.y<<std::endl;
  74. x =(int) (pxyzi.x*10.0);
  75. y = (int)(pxyzi.y*(-10.0));
  76. if((fabs(x)<5) &&(fabs(y)<5))
  77. {
  78. nz++;
  79. }
  80. // std::cout<<" x is "<<x<<" y is "<<y<<std::endl;
  81. int inten = pxyzi.intensity;
  82. inten = inten/2;
  83. QColor color;
  84. color.setHsl(inten,255,120);
  85. painter->setPen(color);
  86. painter->drawPoint(x,y);
  87. }
  88. }
  89. // qDebug("nz = %d",nz);
  90. // QColor x;
  91. // x.setHsl(200,255,120);
  92. // painter->setPen(x);
  93. // painter->drawText(-300,-300,40,40,Qt::AlignHCenter | Qt::AlignTop,"hello");
  94. painter->end();
  95. mMutexPaint.lock();
  96. // delete mimagepaint;
  97. // mimagepaint = new QImage(*image);
  98. *mimagepaint = image->copy();
  99. mMutexPaint.unlock();
  100. qDebug("paint time is %d ",xTime.elapsed());
  101. }
  102. QImage IVPCDView::GetImage()
  103. {
  104. mMutexPaint.lock();
  105. // QImage imagertn(*mimagepaint);
  106. QImage imagertn = mimagepaint->copy();
  107. mMutexPaint.unlock();
  108. mbImageUpdate = false;
  109. return imagertn;
  110. }
  111. bool IVPCDView::IsHaveNew()
  112. {
  113. return mbImageUpdate;
  114. }
  115. int IVPCDView::GetType()
  116. {
  117. return 1;
  118. }