ROICircle.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "ROICircle.h"
  2. #include"Util.h"
  3. ROICircle::ROICircle()
  4. {
  5. //控制点2个
  6. numHandles = 2; // one at corner of circle + midpoint
  7. //默认控制点为圆心
  8. activeHandleIdx = 1;
  9. roiType = ROIType::Circle;
  10. row1 = 0;
  11. col1 = 0;
  12. midC = 0;
  13. midR = 0;
  14. radius = 0;
  15. }
  16. void ROICircle::createROI(double midX, double midY)
  17. {
  18. //圆心为鼠标所在点
  19. midR = midY;
  20. midC = midX;
  21. //半径为100
  22. radius = 100;
  23. //圆上的点
  24. row1 = midR;
  25. col1 = midC + radius;
  26. }
  27. void ROICircle::drawROI(HTuple winID, double scaleFactor)
  28. {
  29. //显示圆
  30. //DispCircle(winID, midR, midC, radius);
  31. HObject ho_ContCircle;
  32. GenCircleContourXld(&ho_ContCircle, midR, midC, radius, 0, 6.28318, "positive", 1);
  33. DispObj(ho_ContCircle, winID);
  34. double width=handleWidth;
  35. //显示两个控制框
  36. //DispRectangle2(winID, row1, col1, 0, width, width);
  37. //DispRectangle2(winID, midR, midC, 0, width, width);
  38. HObject ho_Rectangle1, ho_Rectangle2;
  39. GenRectangle2ContourXld(&ho_Rectangle1, row1, col1, 0, width / scaleFactor, width / scaleFactor);
  40. GenRectangle2ContourXld(&ho_Rectangle2, midR, midC, 0, width / scaleFactor, width / scaleFactor);
  41. DispObj(ho_Rectangle1, winID);
  42. DispObj(ho_Rectangle2, winID);
  43. }
  44. double ROICircle::distToClosestHandle(double x, double y)
  45. {
  46. //ROI::distToClosestHandle(x, y);
  47. double max = 10000;
  48. double val[2];
  49. val[0] = HMisc::DistancePp(y, x, row1, col1); // border handle
  50. val[1] = HMisc::DistancePp(y, x, midR, midC); // midpoint
  51. for (int i = 0; i < numHandles; i++)
  52. {
  53. if (val[i] < max)
  54. {
  55. max = val[i];
  56. activeHandleIdx = i;
  57. }
  58. }// end of for
  59. return val[activeHandleIdx];
  60. }
  61. void ROICircle::displayActive(HTuple winID, double scaleFactor)
  62. {
  63. double width=handleWidth;
  64. HObject ho_Rectangle;
  65. // Util::notify(QString(GBK("结果:%1")).arg(width));
  66. switch (activeHandleIdx)
  67. {
  68. case 0://圆上的点
  69. //DispRectangle2(winID, row1, col1, 0, width, width);
  70. GenRectangle2ContourXld(&ho_Rectangle, row1, col1, 0, width / scaleFactor, width / scaleFactor);
  71. DispObj(ho_Rectangle, winID);
  72. break;
  73. case 1://圆心
  74. //DispRectangle2(winID, midR, midC, 0, width, width);
  75. GenRectangle2ContourXld(&ho_Rectangle, midR, midC, 0, width / scaleFactor, width / scaleFactor);
  76. DispObj(ho_Rectangle, winID);
  77. break;
  78. }
  79. }
  80. void ROICircle::moveByHandle(double newX, double newY)
  81. {
  82. HTuple distance;
  83. double shiftX, shiftY;
  84. switch (activeHandleIdx)
  85. {
  86. case 0: // 鼠标在圆上的一点时
  87. row1 = newY;
  88. col1 = newX;
  89. distance = HMisc::DistancePp(row1, col1,
  90. midR, midC);
  91. radius = distance;
  92. break;
  93. case 1: // 鼠标在圆心上时
  94. shiftY = midR - newY;
  95. shiftX = midC - newX;
  96. midR = newY;
  97. midC = newX;
  98. row1 -= shiftY;
  99. col1 -= shiftX;
  100. break;
  101. }
  102. }
  103. QCursor ROICircle::showByHandle()
  104. {
  105. QCursor cursor;
  106. switch (activeHandleIdx)
  107. {
  108. case 0: // 鼠标在圆上的一点时
  109. cursor= Qt::SizeBDiagCursor ;
  110. break;
  111. case 1: // 鼠标在圆心上时
  112. cursor= Qt::SizeAllCursor;
  113. break;
  114. }
  115. return cursor;
  116. }
  117. HRegion ROICircle::getRegion()
  118. {
  119. HRegion region;
  120. region.GenCircle(midR, midC, radius);
  121. return region;
  122. }
  123. HTuple ROICircle::getROIData()
  124. {
  125. HTuple dat;
  126. dat.Clear();
  127. dat[0] = midR;
  128. dat[1] = midC;
  129. dat[2] = radius;
  130. return dat;
  131. }
  132. void ROICircle::setROIData(HTuple dat)
  133. {
  134. Q_UNUSED(dat);
  135. }
  136. void ROICircle::save(QDataStream &dataStream)
  137. {
  138. ROI::save(dataStream);
  139. int paranum;//参数数量
  140. paranum = 6;
  141. dataStream << paranum;//先保存参数数量
  142. dataStream << (int)1 << radius;
  143. dataStream << (int)2 << row1;
  144. dataStream << (int)3 << col1;
  145. dataStream << (int)4 << midR;
  146. dataStream << (int)5 << midC;
  147. dataStream << (int)6 << m_strTitle;
  148. }
  149. void ROICircle::load(QDataStream &dataStream)
  150. {
  151. ROI::load(dataStream);
  152. int paranum;//参数数量
  153. int para;
  154. dataStream >> paranum;//读取参数数量
  155. for (int i = 0; i < paranum; i++)
  156. {
  157. dataStream >> para;
  158. switch (para)
  159. {
  160. case 1: dataStream >> radius; break;
  161. case 2: dataStream >> row1; break;
  162. case 3: dataStream >> col1; break;
  163. case 4: dataStream >> midR; break;
  164. case 5: dataStream >> midC; break;
  165. case 6: dataStream >> m_strTitle; break;
  166. default:
  167. {
  168. qWarning () << "配置文档错误!";
  169. }
  170. break;
  171. }
  172. }
  173. }