ROIRect2.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include "ROIRect2.h"
  2. #include"HHomMat2D.h"
  3. #include "MyStream.h"
  4. ROIRect2::ROIRect2()
  5. {
  6. numHandles = 6; // 4 corners + 1 midpoint + 1 rotationpoint
  7. activeHandleIdx = 4;
  8. roiType = ROIType::Rectangle2;
  9. length1 = 0;
  10. length2 = 0;
  11. midR = 0;
  12. midC = 0;
  13. phi = 0;
  14. }
  15. void ROIRect2::createROI(double midX, double midY)
  16. {
  17. midR = midY;
  18. midC = midX;
  19. length1 = 100;
  20. length2 = 50;
  21. phi = 0.0;
  22. rowsInit.Clear();
  23. rowsInit[0] = -1.0;
  24. rowsInit[1] = -1.0;
  25. rowsInit[2] = 1.0;
  26. rowsInit[3] = 1.0;
  27. rowsInit[4] = 0.0;
  28. rowsInit[5] = 0.0;
  29. colsInit.Clear();
  30. colsInit[0] = -1.0;
  31. colsInit[1] = 1.0;
  32. colsInit[2] = 1.0;
  33. colsInit[3] = -1.0;
  34. colsInit[4] = 0.0;
  35. colsInit[5] = 0.6;
  36. hom2D = HHomMat2D();
  37. tmp = HHomMat2D();
  38. updateHandlePos();
  39. }
  40. void ROIRect2::drawROI(HTuple winID, double scaleFactor)
  41. {
  42. Q_UNUSED(scaleFactor);
  43. //DispRectangle2(winID, midR, midC, -phi, length1, length2);
  44. HObject ho_Rectangle;
  45. GenRectangle2ContourXld(&ho_Rectangle, midR, midC, -phi, length1, length2);
  46. DispObj(ho_Rectangle, winID);
  47. double width=handleWidth;
  48. for (int i = 0; i < numHandles; i++)
  49. {
  50. //DispRectangle2(winID, rows[i], cols[i], -phi, width, width);
  51. GenRectangle2ContourXld(&ho_Rectangle, rows[i], cols[i], -phi, width, width);
  52. DispObj(ho_Rectangle, winID);
  53. }
  54. DispArrow(winID, midR, midC, midR + (sin(phi) * length1 * 1.2), midC + (cos(phi) * length1 * 1.2), width/2);
  55. }
  56. double ROIRect2::distToClosestHandle(double x, double y)
  57. {
  58. double max = 10000;
  59. double val[6] = {0};
  60. for (int i = 0; i < numHandles; i++)
  61. {
  62. val[i] = HMisc::DistancePp(y, x, rows[i], cols[i]);
  63. }
  64. for (int i = 0; i < numHandles; i++)
  65. {
  66. if (val[i] < max)
  67. {
  68. max = val[i];
  69. activeHandleIdx = i;
  70. }
  71. }
  72. return val[activeHandleIdx];
  73. }
  74. void ROIRect2::displayActive(HTuple winID, double scaleFactor)
  75. {
  76. Q_UNUSED(scaleFactor);
  77. double width=handleWidth;
  78. //DispRectangle2(winID, rows[activeHandleIdx],
  79. // cols[activeHandleIdx],
  80. // -phi, width, width);
  81. HObject ho_Rectangle;
  82. GenRectangle2ContourXld(&ho_Rectangle, rows[activeHandleIdx], cols[activeHandleIdx], -phi, width, width);
  83. DispObj(ho_Rectangle, winID);
  84. if (activeHandleIdx == 5)
  85. DispArrow(winID, midR, midC,
  86. midR + (sin(phi) * length1 * 1.2),
  87. midC + (cos(phi) * length1 * 1.2),
  88. width/2);
  89. }
  90. void ROIRect2::moveByHandle(double newX, double newY)
  91. {
  92. double vX, vY;
  93. HTuple l2,l1;
  94. switch (activeHandleIdx)
  95. {
  96. case 0:
  97. DistancePl(newY,newX,rows[1],cols[1],rows[2],cols[2],&l1);
  98. DistancePl(newY,newX,rows[3],cols[3],rows[2],cols[2],&l2);
  99. length1= abs(l1.D())/2.0;
  100. length2=abs(l2.D())/2.0;
  101. midR=(newY+rows[2].D())/2.0;
  102. midC=(newX+cols[2].D())/2.0;
  103. break;
  104. case 1:
  105. DistancePl(newY,newX,rows[2],cols[2],rows[3],cols[3],&l1);
  106. DistancePl(newY,newX,rows[3],cols[3],rows[0],cols[0],&l2);
  107. length2= abs(l1.D())/2.0;
  108. length1=abs(l2.D())/2.0;
  109. midR=(newY+rows[3].D())/2.0;
  110. midC=(newX+cols[3].D())/2.0;
  111. break;
  112. case 2:
  113. DistancePl(newY,newX,rows[0],cols[0],rows[1],cols[1],&l1);
  114. DistancePl(newY,newX,rows[3],cols[3],rows[0],cols[0],&l2);
  115. length2= abs(l1.D())/2.0;
  116. length1=abs(l2.D())/2.0;
  117. midR=(newY+rows[0].D())/2.0;
  118. midC=(newX+cols[0].D())/2.0;
  119. break;
  120. case 3:
  121. DistancePl(newY,newX,rows[0],cols[0],rows[1],cols[1],&l1);
  122. DistancePl(newY,newX,rows[1],cols[1],rows[2],cols[2],&l2);
  123. length2= abs(l1.D())/2.0;
  124. length1=abs(l2.D())/2.0;
  125. midR=(newY+rows[1].D())/2.0;
  126. midC=(newX+cols[1].D())/2.0;
  127. break;
  128. // tmp = hom2D.HomMat2dInvert();
  129. // x = tmp.AffineTransPoint2d(newX, newY, &y);
  130. // length2 = abs(y);
  131. // length1 = abs(x);
  132. // checkForRange(x, y);
  133. // break;
  134. case 4:
  135. midC = newX;
  136. midR = newY;
  137. break;
  138. case 5:
  139. vY = newY - rows[4].D();
  140. vX = newX - cols[4].D();
  141. phi = atan2(vY, vX);
  142. break;
  143. }
  144. updateHandlePos();
  145. }
  146. QCursor ROIRect2::showByHandle()
  147. {
  148. QCursor cursor;
  149. switch (activeHandleIdx)
  150. {
  151. case 0: // 鼠标在圆上的一点时
  152. cursor= Qt::SizeAllCursor;
  153. break;
  154. case 1: // 鼠标在圆心上时
  155. cursor= Qt::SizeBDiagCursor;
  156. break;
  157. }
  158. return cursor;
  159. }
  160. HRegion ROIRect2::getRegion()
  161. {
  162. HRegion region;
  163. region.GenRectangle2(midR, midC, -phi, length1, length2);
  164. return region;
  165. }
  166. HTuple ROIRect2::getROIData()
  167. {
  168. HTuple dat;
  169. dat.Clear();
  170. dat[0] = midR;
  171. dat[1] = midC;
  172. dat[2] = -phi;
  173. dat[3] = length1;
  174. dat[4] = length2;
  175. return dat;
  176. }
  177. void ROIRect2::setROIData(HTuple dat)
  178. {
  179. Q_UNUSED(dat);
  180. }
  181. void ROIRect2::save(QDataStream &dataStream)
  182. {
  183. ROI::save(dataStream);
  184. int paranum;//参数数量
  185. paranum = 10;
  186. dataStream << paranum;//先保存参数数量
  187. dataStream << (int)1 << length1;
  188. dataStream << (int)2 << length2;
  189. dataStream << (int)3 << midR;
  190. dataStream << (int)4 << midC;
  191. dataStream << (int)5 << phi;
  192. dataStream << (int)6 << rowsInit;
  193. dataStream << (int)7 << colsInit;
  194. dataStream << (int)8 << rows;
  195. dataStream << (int)9 << cols;
  196. dataStream << (int)10 << m_strTitle;
  197. }
  198. void ROIRect2::load(QDataStream &dataStream)
  199. {
  200. ROI::load(dataStream);
  201. int paranum;//参数数量
  202. int para;
  203. dataStream >> paranum;//读取参数数量
  204. for (int i = 0; i < paranum; i++)
  205. {
  206. dataStream >> para;
  207. switch (para)
  208. {
  209. case 1: dataStream >> length1; break;
  210. case 2: dataStream >> length2; break;
  211. case 3: dataStream >> midR; break;
  212. case 4: dataStream >> midC; break;
  213. case 5: dataStream >> phi; break;
  214. case 6: dataStream >> rowsInit; break;
  215. case 7: dataStream >> colsInit; break;
  216. case 8: dataStream >> rows; break;
  217. case 9: dataStream >> cols; break;
  218. case 10: dataStream >> m_strTitle; break;
  219. default:
  220. {
  221. qWarning() << "配置文档错误!";
  222. }
  223. break;
  224. }
  225. }
  226. }
  227. void ROIRect2::updateHandlePos()
  228. {
  229. hom2D.HomMat2dIdentity();
  230. hom2D = hom2D.HomMat2dTranslate(midC, midR);
  231. hom2D = hom2D.HomMat2dRotateLocal(phi);
  232. tmp = hom2D.HomMat2dScaleLocal(length1, length2);
  233. cols = tmp.AffineTransPoint2d(colsInit, rowsInit, &rows);
  234. }
  235. void ROIRect2::checkForRange(double x, double y)
  236. {
  237. switch (activeHandleIdx)
  238. {
  239. case 0:
  240. if ((x < 0) && (y < 0))
  241. return;
  242. if (x >= 0) length1 = 0.01;
  243. if (y >= 0) length2 = 0.01;
  244. break;
  245. case 1:
  246. if ((x > 0) && (y < 0))
  247. return;
  248. if (x <= 0) length1 = 0.01;
  249. if (y >= 0) length2 = 0.01;
  250. break;
  251. case 2:
  252. if ((x > 0) && (y > 0))
  253. return;
  254. if (x <= 0) length1 = 0.01;
  255. if (y <= 0) length2 = 0.01;
  256. break;
  257. case 3:
  258. if ((x < 0) && (y > 0))
  259. return;
  260. if (x >= 0) length1 = 0.01;
  261. if (y <= 0) length2 = 0.01;
  262. break;
  263. default:
  264. break;
  265. }
  266. }