BoundaryRect.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:11k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. #include "..stdafx.h"
  3. #include "math.h"
  4. #include "..includeQBaseObj.h"
  5. #ifdef _DEBUG
  6. #undef THIS_FILE
  7. static char THIS_FILE[]=__FILE__;
  8. #define new DEBUG_NEW
  9. #endif
  10. //////////////////////////////////////////////////////////////////////////
  11. //CBoundaryRect函数定义部分
  12. //////////////////////////////////////////
  13. ///***************CQGIS****************///
  14. ///函数名称:CBoundaryRect
  15. ///函数返回:无
  16. ///入口参数:无
  17. ///出口参数:无 
  18. ///函数思路:
  19. ///***************CQGIS****************///
  20. //////////////////////////////////////////
  21. CBoundaryRect::CBoundaryRect()
  22. {
  23. m_fMinX = m_fMinY = m_fMaxX = m_fMaxY = 0.0;
  24. }
  25. //////////////////////////////////////////
  26. ///***************CQGIS****************///
  27. ///函数名称:CBoundaryRect
  28. ///函数返回:无
  29. ///入口参数:CBoundaryRect & Box
  30. ///出口参数:无
  31. ///函数思路:
  32. ///***************CQGIS****************///
  33. //////////////////////////////////////////
  34. CBoundaryRect::CBoundaryRect(CBoundaryRect & Box)
  35. {
  36. if(Box.IsValid())
  37. {
  38. m_fMinX = Box.GetLeftBottomX();
  39. m_fMinY = Box.GetLeftBottomY();
  40. m_fMaxX = Box.GetRightTopX();
  41. m_fMaxY = Box.GetRightTopY();
  42. }
  43. }
  44. //////////////////////////////////////////
  45. ///***************CQGIS****************///
  46. ///函数名称:~CBoundaryRect
  47. ///函数返回:无
  48. ///入口参数:无
  49. ///出口参数:无
  50. ///函数思路:
  51. ///***************CQGIS****************///
  52. //////////////////////////////////////////
  53. CBoundaryRect::~CBoundaryRect()
  54. {
  55. }
  56. //////////////////////////////////////////
  57. ///***************CQGIS****************///
  58. ///函数名称:Copy
  59. ///函数返回:无
  60. ///入口参数:CBoundaryRect & Box
  61. ///出口参数:无
  62. ///函数思路:边界矩形拷贝
  63. ///***************CQGIS****************///
  64. //////////////////////////////////////////
  65. void CBoundaryRect::Copy(CBoundaryRect & Box)
  66. {
  67. if(Box.IsValid())
  68. {
  69. m_fMinX = Box.GetLeftBottomX();
  70. m_fMinY = Box.GetLeftBottomY();
  71. m_fMaxX = Box.GetRightTopX();
  72. m_fMaxY = Box.GetRightTopY();
  73. }
  74. }
  75. //////////////////////////////////////////
  76. ///***************CQGIS****************///
  77. ///函数名称:PtInRect
  78. ///函数返回:BOOL
  79. ///入口参数:CQPoint & pt
  80. ///出口参数:无
  81. ///函数思路:点在矩形里
  82. ///***************CQGIS****************///
  83. //////////////////////////////////////////
  84. BOOL CBoundaryRect::PtInRect(CQPoint & pt)
  85. {
  86. double px = pt.GetX(),py = pt.GetY();
  87. if(px>=m_fMinX && px<=m_fMaxX && py>=m_fMinY && py<=m_fMaxY)
  88. return TRUE;
  89. else 
  90. return FALSE;
  91. }
  92. //////////////////////////////////////////
  93. ///***************CQGIS****************///
  94. ///函数名称:SetRect
  95. ///函数返回:无
  96. ///入口参数:double fMinx,double fMinY,double fMaxX,double fMaxY
  97. ///出口参数:无
  98. ///函数思路:设置边界矩形的值
  99. ///***************CQGIS****************///
  100. //////////////////////////////////////////
  101. void CBoundaryRect::SetRect(double fMinx,double fMinY,double fMaxX,double fMaxY)
  102. {
  103. m_fMinX = fMinx;
  104. m_fMinY = fMinY;
  105. m_fMaxX = fMaxX;
  106. m_fMaxY = fMaxY;
  107. }
  108. //////////////////////////////////////////
  109. ///***************CQGIS****************///
  110. ///函数名称:CenterPoint
  111. ///函数返回:CQPOint
  112. ///入口参数:无
  113. ///出口参数:无
  114. ///函数思路:计算边界矩形的中心点
  115. ///***************CQGIS****************///
  116. //////////////////////////////////////////
  117. CQPoint CBoundaryRect::CenterPoint()
  118. {
  119. double fx = (m_fMinX + m_fMaxX)/2;
  120. double fy = (m_fMinY + m_fMaxY)/2;
  121. return CQPoint(fx,fy);
  122. }
  123. //////////////////////////////////////////
  124. ///***************CQGIS****************///
  125. ///函数名称:IsValid
  126. ///函数返回:BOOL
  127. ///入口参数:无
  128. ///出口参数:无
  129. ///函数思路:判断边界矩形是否有效,根据角点位置
  130. ///***************CQGIS****************///
  131. //////////////////////////////////////////
  132. BOOL CBoundaryRect::IsValid()
  133. {
  134. if(m_fMinX<=m_fMaxX && m_fMinY<=m_fMaxY)
  135. return TRUE;
  136. else
  137. return FALSE;
  138. }
  139. //////////////////////////////////////////
  140. ///***************CQGIS****************///
  141. ///函数名称:Offset
  142. ///函数返回:无
  143. ///入口参数:double dx,double dy
  144. ///出口参数:double dx,double dy
  145. ///函数思路:增量平移
  146. ///***************CQGIS****************///
  147. //////////////////////////////////////////
  148. inline void CBoundaryRect::Offset(double dx,double dy)
  149. {
  150. m_fMinX += dx;
  151. m_fMaxX += dx;
  152. m_fMinY += dy;
  153. m_fMaxY += dy;
  154. }
  155. //////////////////////////////////////////
  156. ///***************CQGIS****************///
  157. ///函数名称:Offset
  158. ///函数返回:无
  159. ///入口参数:CQPoint & pt
  160. ///出口参数:无
  161. ///函数思路:增量平移
  162. ///***************CQGIS****************///
  163. //////////////////////////////////////////
  164. inline void CBoundaryRect::Offset(CQPoint & pt)
  165. {
  166. m_fMinX += pt.GetX();
  167. m_fMaxX += pt.GetX();
  168. m_fMinY += pt.GetY();
  169. m_fMaxY += pt.GetY();
  170. }
  171. //////////////////////////////////////////
  172. ///***************CQGIS****************///
  173. ///函数名称:operator =
  174. ///函数返回:CBoundaryRect
  175. ///入口参数:CBoundaryRect & Box
  176. ///出口参数:无
  177. ///函数思路:重载赋值运算符
  178. ///***************CQGIS****************///
  179. //////////////////////////////////////////
  180. CBoundaryRect & CBoundaryRect::operator = (CBoundaryRect & Box)
  181. {
  182. m_fMinX = Box.GetLeftBottomX();
  183. m_fMinY = Box.GetLeftBottomY();
  184. m_fMaxX = Box.GetRightTopX();
  185. m_fMaxY = Box.GetRightTopY();
  186. return (*this);
  187. }
  188. //////////////////////////////////////////
  189. ///***************CQGIS****************///
  190. ///函数名称:UnionBoundary
  191. ///函数返回:CBoundaryRect *
  192. ///入口参数:CBoundaryRect * pBox
  193. ///出口参数:无
  194. ///函数思路:求两个外接矩形的并集
  195. ///***************CQGIS****************///
  196. //////////////////////////////////////////
  197. CBoundaryRect * CBoundaryRect::UnionBoundary(CBoundaryRect * pBox)
  198. {
  199.  if(pBox->IsValid())
  200.  {
  201.  double fMinX = min(m_fMinX,pBox->GetLeftBottomX());
  202.  double fMaxX = max(m_fMaxX,pBox->GetRightTopX());
  203.  double fMinY = min(m_fMinY,pBox->GetLeftBottomY());
  204.  double fMaxY = max(m_fMaxY,pBox->GetRightTopY());
  205.  CBoundaryRect * pRect = new CBoundaryRect;
  206.  pRect->SetRect(fMinX,fMinY,fMaxX,fMaxY);
  207.  return pRect;
  208.  }
  209.  return NULL;
  210. }
  211. //////////////////////////////////////////
  212. ///***************CQGIS****************///
  213. ///函数名称:
  214. ///返回类型:
  215. ///入口参数:
  216. ///出口参数:
  217. ///思路说明:
  218. ///***************CQGIS****************///
  219. //////////////////////////////////////////
  220. void CBoundaryRect::Union(CBoundaryRect * pRect)
  221. {
  222. if(pRect->IsValid())
  223. {
  224. double fMinX = min(m_fMinX,pRect->GetLeftBottomX());
  225. double fMinY = min(m_fMinY,pRect->GetLeftBottomY());
  226. double fMaxX = max(m_fMaxX,pRect->GetRightTopX());
  227. double fMaxY = max(m_fMaxY,pRect->GetRightTopY());
  228. SetRect(fMinX,fMinY,fMaxX,fMaxY);
  229. }
  230. }
  231. //////////////////////////////////////////
  232. ///***************CQGIS****************///
  233. ///函数名称:Cutout
  234. ///函数返回:CBoundaryRect *
  235. ///入口参数:CBoundaryRect * pBox
  236. ///出口参数:无
  237. ///函数思路:计算两个边界矩形的交集
  238. ///***************CQGIS****************///
  239. //////////////////////////////////////////
  240. CBoundaryRect * CBoundaryRect::Cutout(CBoundaryRect * pBox)
  241. {
  242. if(pBox->IsValid())
  243. {
  244. if(!IsCross(pBox)) return NULL;
  245. if(m_fMinX<pBox->GetLeftBottomX()) m_fMinX = pBox->GetLeftBottomX();
  246. if(m_fMinY<pBox->GetLeftBottomY()) m_fMinY = pBox->GetLeftBottomY();
  247. if(m_fMaxX>pBox->GetRightTopX()) m_fMaxX = pBox->GetRightTopX();
  248. if(m_fMaxY>pBox->GetRightTopY()) m_fMaxY = pBox->GetRightTopY();
  249. return this;
  250. }
  251. return NULL;
  252. }
  253. //////////////////////////////////////////
  254. ///***************CQGIS****************///
  255. ///函数名称:
  256. ///函数返回:
  257. ///入口参数:
  258. ///出口参数:
  259. ///函数思路:
  260. ///***************CQGIS****************///
  261. //////////////////////////////////////////
  262. BOOL CBoundaryRect::IsCross(CBoundaryRect * pBox)
  263. {
  264. if(pBox->IsValid())
  265. {
  266. if(m_fMinX>pBox->m_fMaxX ||
  267. m_fMaxX<pBox->m_fMinX ||
  268. m_fMinY>pBox->m_fMaxY ||
  269. m_fMaxY<pBox->m_fMinY)
  270. return FALSE;
  271. else
  272. return TRUE;
  273. }
  274. return FALSE;
  275. }
  276. //////////////////////////////////////////
  277. ///***************CQGIS****************///
  278. ///函数名称:GetLeftBottomX
  279. ///函数返回:double
  280. ///入口参数:无
  281. ///出口参数:无
  282. ///函数思路:
  283. ///***************CQGIS****************///
  284. //////////////////////////////////////////
  285. inline double CBoundaryRect::GetLeftBottomX()
  286. {
  287. return m_fMinX;
  288. }
  289. //////////////////////////////////////////
  290. ///***************CQGIS****************///
  291. ///函数名称:GetLeftBottomY
  292. ///函数返回:double
  293. ///入口参数:无
  294. ///出口参数:无
  295. ///函数思路:
  296. ///***************CQGIS****************///
  297. //////////////////////////////////////////
  298. inline double CBoundaryRect::GetLeftBottomY()
  299. {
  300. return m_fMinY;
  301. }
  302. //////////////////////////////////////////
  303. ///***************CQGIS****************///
  304. ///函数名称:GetRightTopX
  305. ///函数返回:double
  306. ///入口参数:无
  307. ///出口参数:无
  308. ///函数思路:
  309. ///***************CQGIS****************///
  310. //////////////////////////////////////////
  311. inline double CBoundaryRect::GetRightTopX()
  312. {
  313. return m_fMaxX;
  314. }
  315. //////////////////////////////////////////
  316. ///***************CQGIS****************///
  317. ///函数名称:GetRightTopY
  318. ///函数返回:double
  319. ///入口参数:无
  320. ///出口参数:无
  321. ///函数思路:
  322. ///***************CQGIS****************///
  323. //////////////////////////////////////////
  324. inline double CBoundaryRect::GetRightTopY()
  325. {
  326. return m_fMaxY;
  327. }
  328. void CBoundaryRect::SetLeftBottomX(double lx)
  329. {
  330. m_fMinX = lx;
  331. }
  332. void CBoundaryRect::SetLeftBottomY(double ly)
  333. {
  334. m_fMinY = ly;
  335. }
  336. void CBoundaryRect::SetRightTopX(double rx)
  337. {
  338. m_fMaxX = rx;
  339. }
  340. void CBoundaryRect::SetRightTopY(double ry)
  341. {
  342. m_fMaxY = ry;
  343. }
  344. double CBoundaryRect::Width()
  345. {
  346. return (m_fMaxX - m_fMinX);
  347. }
  348. double CBoundaryRect::Height()
  349. {
  350. return (m_fMaxY - m_fMinY);
  351. }
  352. IMPLEMENT_SERIAL(CBoundaryRect,CObject,1)
  353. void CBoundaryRect::Serialize(CArchive & ar)
  354. {
  355. if(ar.IsStoring())
  356. {
  357. ar.Write(&m_fMinX,sizeof(float));
  358. ar.Write(&m_fMinY,sizeof(float));
  359. ar.Write(&m_fMaxX,sizeof(float));
  360. ar.Write(&m_fMaxY,sizeof(float));
  361. }
  362. else
  363. {
  364. ar.Read(&m_fMinX,sizeof(float));
  365. ar.Read(&m_fMinY,sizeof(float));
  366. ar.Read(&m_fMaxX,sizeof(float));
  367. ar.Read(&m_fMaxY,sizeof(float));
  368. }
  369. }
  370. CString CBoundaryRect::VarToStr()
  371. {
  372. CString szResult;
  373. szResult.Format("左下角X坐标:%f左下角Y坐标:%f右上角X坐标:%f右上角Y坐标:%f",m_fMinX,m_fMinY,m_fMaxX,m_fMaxY);
  374. return szResult;
  375. }
  376. void CBoundaryRect::WriteToFile(CFile * pFile)
  377. {
  378. pFile->Write(&m_fMinX,sizeof(float));
  379. pFile->Write(&m_fMinY,sizeof(float));
  380. pFile->Write(&m_fMaxX,sizeof(float));
  381. pFile->Write(&m_fMaxY,sizeof(float));
  382. }
  383. void CBoundaryRect::ReadFromFile(CFile * pFile)
  384. {
  385. pFile->Read(&m_fMinX,sizeof(float));
  386. pFile->Read(&m_fMinY,sizeof(float));
  387. pFile->Read(&m_fMaxX,sizeof(float));
  388. pFile->Read(&m_fMaxY,sizeof(float));
  389. }
  390. void CBoundaryRect::Lager(double dStep)
  391. {
  392. dStep = static_cast<double>(fabs(dStep));
  393. m_fMinY -= dStep;
  394. m_fMinX -= dStep;
  395. m_fMaxX += dStep;
  396. m_fMaxY += dStep;
  397. }
  398. void CBoundaryRect::Smaller(double dStep)
  399. {
  400. dStep = static_cast<double>(fabs(dStep));
  401. m_fMinX += dStep;
  402. m_fMinY += dStep;
  403. m_fMaxX -= dStep;
  404. m_fMaxY -= dStep;
  405. }