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

GDI/图象编程

开发平台:

Visual C++

  1. // QPointArray.cpp: implementation of the CQPointArray class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeQPointArray.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CQPointArray::CQPointArray(int nSize)
  15. {
  16. //  if(nSize == 0)
  17. //  {
  18. //  CQPoint * pPt = new CQPoint;
  19. //  m_PtArray.Add(pPt);
  20. //  }
  21. //  else
  22. //  {
  23. //  for(int i=0;i<nSize;i++)
  24. //  {
  25. //  CQPoint * pPt = new CQPoint;
  26. //  m_PtArray.Add(pPt);
  27. //  }
  28. //  }
  29. }
  30. //////////////////////////////////////////
  31. ///***************CQGIS****************///
  32. ///函数名称:
  33. ///返回类型:
  34. ///入口参数:
  35. ///出口参数:
  36. ///思路说明:
  37. ///***************CQGIS****************///
  38. //////////////////////////////////////////
  39. void CQPointArray::Copy(CQPointArray & ptArray)
  40. {
  41. if(&ptArray == this)
  42. return;
  43. int nSize = ptArray.GetSize();
  44. if(nSize == 0)return;
  45. else
  46. {
  47. DeleteAll();
  48. }
  49. for(int i=0;i<nSize;i++)
  50. {
  51. CQPoint * pPt = new CQPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
  52. m_PtArray.Add(pPt);
  53. }
  54. }
  55. //////////////////////////////////////////
  56. ///***************CQGIS****************///
  57. ///函数名称:
  58. ///返回类型:
  59. ///入口参数:
  60. ///出口参数:
  61. ///思路说明:
  62. ///***************CQGIS****************///
  63. //////////////////////////////////////////
  64. CQPointArray::CQPointArray(CQPointArray & ptArray)
  65. {
  66. int nSize = ptArray.GetSize();
  67. if(nSize == 0)return;
  68. for(int i=0;i<nSize;i++)
  69. {
  70. CQPoint * pPt = new CQPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
  71. m_PtArray.Add(pPt);
  72. }
  73. }
  74. CQPointArray::~CQPointArray()
  75. {
  76. DeleteAll();
  77. }
  78. //////////////////////////////////////////
  79. ///***************CQGIS****************///
  80. ///函数名称:XSort
  81. ///返回类型:无
  82. ///入口参数:int nSortType
  83. ///出口参数:无
  84. ///思路说明:冒泡排序nSortType == 0 升序 nSortType == 1降序
  85. ///***************CQGIS****************///
  86. //////////////////////////////////////////
  87. void CQPointArray::XSort(int nSortType)
  88. {
  89. int nSize = m_PtArray.GetSize();
  90. if(nSortType == 0)   //升序
  91. {
  92. for(int i=0;i<nSize-1;i++)
  93. {
  94. for(int j=i+1;j<nSize;j++)
  95. {
  96. CQPoint pPt = *(m_PtArray[i]);
  97. if(m_PtArray[j]->GetX()<m_PtArray[i]->GetX())
  98. {
  99. *(m_PtArray[i]) = *(m_PtArray[j]);
  100. *(m_PtArray[j]) = pPt;
  101. }
  102. }
  103. }
  104. }
  105. else              //降序
  106. {
  107. for(int i=0;i<nSize-1;i++)
  108. for(int j=i+1;j<nSize;j++)
  109. {
  110. CQPoint pPt = *(m_PtArray[i]);
  111. if(m_PtArray[j]->GetX()> m_PtArray[i]->GetX())
  112. {
  113. *(m_PtArray[i]) = *(m_PtArray[j]);
  114. *(m_PtArray[j]) = pPt;
  115. }
  116. }
  117. }
  118. }
  119. //////////////////////////////////////////
  120. ///***************CQGIS****************///
  121. ///函数名称:YSort
  122. ///返回类型:无
  123. ///入口参数:int nSortType
  124. ///出口参数:无
  125. ///思路说明:冒泡排序nSortType == 0 升序 nSortType == 1降序
  126. ///***************CQGIS****************///
  127. //////////////////////////////////////////
  128. void CQPointArray::YSort(int nSortType)
  129. {
  130. int nSize = m_PtArray.GetSize();
  131. if(nSortType == 0)  // 升序
  132. {
  133. for(int i=0;i<nSize-1;i++)
  134. for(int j=i+1;j<nSize;j++)
  135. {
  136. CQPoint pPt = *(m_PtArray[i]);
  137. if(m_PtArray[j]->GetY() < m_PtArray[i]->GetY())
  138. {
  139. *m_PtArray[i] = *m_PtArray[j];
  140. *m_PtArray[j] =  pPt;
  141. }
  142. }
  143. }
  144. else               // 降序
  145. {
  146. for(int i=0;i<nSize-1;i++)
  147. for(int j=i+1;j<nSize;j++)
  148. {
  149. CQPoint pPt = *m_PtArray[i];
  150. if(m_PtArray[j]->GetY()>m_PtArray[i]->GetY())
  151. {
  152. *m_PtArray[i] = *m_PtArray[j];
  153. *m_PtArray[j] = pPt;
  154. }
  155. }
  156. }
  157. }
  158. //////////////////////////////////////////
  159. ///***************CQGIS****************///
  160. ///函数名称:
  161. ///返回类型:
  162. ///入口参数:
  163. ///出口参数:
  164. ///思路说明:
  165. ///***************CQGIS****************///
  166. //////////////////////////////////////////
  167. void CQPointArray::AddPoint(CQPoint * pPt)
  168. {
  169. if(pPt)
  170. {
  171. double dx = pPt->GetX(),dy = pPt->GetY();
  172. AddPoint(dx,dy);
  173. }
  174. }
  175. //////////////////////////////////////////
  176. ///***************CQGIS****************///
  177. ///函数名称:
  178. ///返回类型:
  179. ///入口参数:
  180. ///出口参数:
  181. ///思路说明:
  182. ///***************CQGIS****************///
  183. //////////////////////////////////////////
  184. void CQPointArray::AddPoint(double x,double y)
  185. {
  186. CQPoint * pPt = new CQPoint(x,y);
  187. m_PtArray.Add(pPt);
  188. }
  189. //////////////////////////////////////////
  190. ///***************CQGIS****************///
  191. ///函数名称:
  192. ///返回类型:
  193. ///入口参数:
  194. ///出口参数:
  195. ///思路说明:
  196. ///***************CQGIS****************///
  197. //////////////////////////////////////////
  198. CQPoint * CQPointArray::RemoveAt(int nIndex)
  199. {
  200. if(nIndex<0 || nIndex>m_PtArray.GetSize())
  201. return 0;
  202. CQPoint * pPt = m_PtArray.GetAt(nIndex);
  203. m_PtArray.RemoveAt(nIndex);
  204. return pPt;
  205. }
  206. //////////////////////////////////////////
  207. ///***************CQGIS****************///
  208. ///函数名称:
  209. ///返回类型:
  210. ///入口参数:
  211. ///出口参数:
  212. ///思路说明:
  213. ///***************CQGIS****************///
  214. //////////////////////////////////////////
  215. void CQPointArray::RemoveAll()
  216. {
  217. int nSize = m_PtArray.GetSize();
  218. if(nSize == 0) return;
  219. for(int i=0;i<nSize;i++)
  220. {
  221. m_PtArray.RemoveAt(i);
  222. }
  223. }
  224. //////////////////////////////////////////
  225. ///***************CQGIS****************///
  226. ///函数名称:
  227. ///返回类型:
  228. ///入口参数:
  229. ///出口参数:
  230. ///思路说明:
  231. ///***************CQGIS****************///
  232. //////////////////////////////////////////
  233. void CQPointArray::DeleteAll()
  234. {
  235. int nSize = m_PtArray.GetSize();
  236. CQPoint * pPt = NULL;
  237. for(int i=0;i<nSize;i++)
  238. {
  239. pPt = m_PtArray.GetAt(i);
  240. if(pPt)
  241. delete pPt;
  242. }
  243. m_PtArray.RemoveAll();
  244. }
  245. //////////////////////////////////////////
  246. ///***************CQGIS****************///
  247. ///函数名称:
  248. ///返回类型:
  249. ///入口参数:
  250. ///出口参数:
  251. ///思路说明:
  252. ///***************CQGIS****************///
  253. //////////////////////////////////////////
  254. void CQPointArray::Delete(int nIndex)
  255. {
  256. if(nIndex<0 || nIndex>=m_PtArray.GetSize())return;
  257. CQPoint * ppt = 0;
  258. ppt = RemoveAt(nIndex);
  259. if(ppt != 0)
  260. delete ppt;
  261. }
  262. //////////////////////////////////////////
  263. ///***************CQGIS****************///
  264. ///函数名称:
  265. ///返回类型:
  266. ///入口参数:
  267. ///出口参数:
  268. ///思路说明:
  269. ///***************CQGIS****************///
  270. //////////////////////////////////////////
  271. void CQPointArray::InsertAt(int nIndex,CQPoint * pt)
  272. {
  273. if(nIndex<0 || !pt)return;
  274. m_PtArray.InsertAt(nIndex,pt);
  275. }
  276. //////////////////////////////////////////
  277. ///***************CQGIS****************///
  278. ///函数名称:
  279. ///返回类型:
  280. ///入口参数:
  281. ///出口参数:
  282. ///思路说明:
  283. ///***************CQGIS****************///
  284. //////////////////////////////////////////
  285. void CQPointArray::InsertAt(int nIndex,double x,double y)
  286. {
  287. if(nIndex<0) return;
  288. CQPoint * pPt = new CQPoint(x,y);
  289. m_PtArray.InsertAt(nIndex,pPt);
  290. }
  291. //////////////////////////////////////////
  292. ///***************CQGIS****************///
  293. ///函数名称:
  294. ///返回类型:
  295. ///入口参数:
  296. ///出口参数:
  297. ///思路说明:
  298. ///***************CQGIS****************///
  299. //////////////////////////////////////////
  300. void CQPointArray::InsertAfter(int nIndex,CQPoint * pt)
  301. {
  302. if(nIndex<=-1 || !pt)return;
  303. m_PtArray.InsertAt(nIndex+1,pt);
  304. }
  305. //////////////////////////////////////////
  306. ///***************CQGIS****************///
  307. ///函数名称:
  308. ///返回类型:
  309. ///入口参数:
  310. ///出口参数:
  311. ///思路说明:
  312. ///***************CQGIS****************///
  313. //////////////////////////////////////////
  314. void CQPointArray::InsertAfter(int nIndex,double x,double y)
  315. {
  316. if(nIndex<=-1)return;
  317. CQPoint * pPt = new CQPoint(x,y);
  318. m_PtArray.InsertAt(nIndex+1,pPt);
  319. }
  320. //////////////////////////////////////////
  321. ///***************CQGIS****************///
  322. ///函数名称:MakeArrayInverse
  323. ///返回类型:CQPointArray
  324. ///入口参数:无
  325. ///出口参数:无
  326. ///思路说明:数组元素倒置
  327. ///***************CQGIS****************///
  328. //////////////////////////////////////////
  329. CQPointArray CQPointArray::MakeArrayInverse()
  330. {
  331. int nSize = m_PtArray.GetSize();
  332. CQPointArray pa;
  333. for(int i=nSize-1;i>=0;i--)
  334. {
  335. pa.AddPoint(m_PtArray[i]->GetX(),m_PtArray[i]->GetY());
  336. }
  337. return pa;
  338. }
  339. //////////////////////////////////////////
  340. ///***************CQGIS****************///
  341. ///函数名称:
  342. ///返回类型:
  343. ///入口参数:
  344. ///出口参数:
  345. ///思路说明:
  346. ///***************CQGIS****************///
  347. //////////////////////////////////////////
  348. void CQPointArray::ArrayInverseCopy(CQPointArray & ptArray)
  349. {
  350. int nSize = ptArray.GetSize();
  351. if(nSize == 0) return;
  352. DeleteAll();
  353. for(int i=nSize-1;i>=0;i--)
  354. {
  355. AddPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
  356. }
  357. }
  358. //////////////////////////////////////////
  359. ///***************CQGIS****************///
  360. ///函数名称:
  361. ///返回类型:
  362. ///入口参数:
  363. ///出口参数:
  364. ///思路说明:
  365. ///***************CQGIS****************///
  366. //////////////////////////////////////////
  367. CQPoint * CQPointArray::GetPoint(int nIndex)
  368. {
  369. if(nIndex<0 || nIndex>=m_PtArray.GetSize()) return NULL;
  370. return m_PtArray.GetAt(nIndex);
  371. }
  372. //////////////////////////////////////////
  373. ///***************CQGIS****************///
  374. ///函数名称:
  375. ///返回类型:
  376. ///入口参数:
  377. ///出口参数:
  378. ///思路说明:
  379. ///***************CQGIS****************///
  380. //////////////////////////////////////////
  381. CQPoint * CQPointArray::operator [](int nIndex)
  382. {
  383. if(nIndex<0 || nIndex>=m_PtArray.GetSize() || m_PtArray.GetSize() == 0) return NULL;
  384. return m_PtArray.GetAt(nIndex);
  385. }
  386. //////////////////////////////////////////
  387. ///***************CQGIS****************///
  388. ///函数名称:
  389. ///返回类型:
  390. ///入口参数:
  391. ///出口参数:
  392. ///思路说明:
  393. ///***************CQGIS****************///
  394. //////////////////////////////////////////
  395. int CQPointArray::FindPtIndex(CQPoint & pt)
  396. {
  397. int nSize = m_PtArray.GetSize();
  398. if(nSize == 0)return -1;
  399. for(int i=0;i<nSize;i++)
  400. {
  401. if(pt == *(m_PtArray[i]))
  402. return i;
  403. }
  404. return -1;
  405. }
  406. //////////////////////////////////////////
  407. ///***************CQGIS****************///
  408. ///函数名称:
  409. ///返回类型:
  410. ///入口参数:
  411. ///出口参数:
  412. ///思路说明:
  413. ///***************CQGIS****************///
  414. //////////////////////////////////////////
  415. int CQPointArray::GetSize()
  416. {
  417. return m_PtArray.GetSize();
  418. }
  419. //////////////////////////////////////////
  420. ///***************CQGIS****************///
  421. ///函数名称:
  422. ///返回类型:
  423. ///入口参数:
  424. ///出口参数:
  425. ///思路说明:
  426. ///***************CQGIS****************///
  427. //////////////////////////////////////////
  428. void CQPointArray::GetBoundRect(CBoundaryRect * pRect)
  429. {
  430. int nSize = m_PtArray.GetSize();
  431. if(nSize == 0) return;
  432. pRect->m_fMinX = m_PtArray[0]->GetX();
  433. pRect->m_fMinY = m_PtArray[0]->GetY();
  434. pRect->m_fMaxX = m_PtArray[0]->GetX();
  435. pRect->m_fMaxY = m_PtArray[0]->GetY();
  436. for(int i=1;i<nSize;i++)
  437. {
  438. pRect->m_fMinX = min(pRect->m_fMinX,m_PtArray[i]->GetX());
  439. pRect->m_fMinY = min(pRect->m_fMinY,m_PtArray[i]->GetY());
  440. pRect->m_fMaxX = max(pRect->m_fMaxX,m_PtArray[i]->GetX());
  441. pRect->m_fMaxY = max(pRect->m_fMaxY,m_PtArray[i]->GetY());
  442. }
  443. }
  444. void CQPointArray::Serialize(CArchive & ar)
  445. {
  446. if(ar.IsStoring())  // 存
  447. {
  448. int nSize = m_PtArray.GetSize();
  449. if(nSize == 0)return;
  450. ar.Write(&nSize,sizeof(int));
  451. for(int i=0;i<nSize;i++)
  452. {
  453. CQPoint * ppt = 0;
  454. ppt = m_PtArray.GetAt(i);
  455. if(ppt == 0) continue;
  456. ppt->Serialize(ar);
  457. }
  458. }
  459. else
  460. {
  461. int nSize = 0;
  462. ar.Read(&nSize,(sizeof(int)));
  463. if(nSize == 0)return;
  464. for(int i=0;i<nSize;i++)
  465. {
  466. CQPoint * ppt = new CQPoint;
  467. ppt->Serialize(ar);
  468. m_PtArray.Add(ppt);
  469. }
  470. }
  471. }
  472. void CQPointArray::WritetoFile(CFile * pFile)
  473. {
  474. int nSize = m_PtArray.GetSize();
  475. if(nSize == 0)return;
  476. pFile->Write(&nSize,sizeof(int));
  477. for(int i=0;i<nSize;i++)
  478. {
  479. CQPoint * ppt = 0;
  480. ppt = m_PtArray.GetAt(i);
  481. if(ppt == 0)continue;
  482. ppt->WriteToFile(pFile);
  483. }
  484. }
  485. void CQPointArray::ReadFromFile(CFile * pFile)
  486. {
  487. int nSize = 0;
  488. DeleteAll();
  489. pFile->Read(&nSize,sizeof(int));
  490. for(int i=0;i<nSize;i++)
  491. {
  492. CQPoint * ppt = new CQPoint;
  493. ppt->ReadFromFile(pFile);
  494. m_PtArray.Add(ppt);
  495. }
  496. }
  497. BOOL CQPointArray::ExchangePoint(int i,int j)
  498. {
  499. if(i<0 || i>=m_PtArray.GetSize() || j<0 || j>=m_PtArray.GetSize())
  500. return FALSE;
  501. CQPoint pt = *m_PtArray[i];
  502. *m_PtArray[i] = *m_PtArray[j];
  503. *m_PtArray[j] = pt;
  504. return TRUE;
  505. }
  506. CQPoint * CQPointArray::GetCenterPoint()
  507. {
  508. int nSize = m_PtArray.GetSize();
  509. if(nSize == 0)return NULL;
  510. if(nSize == 1)
  511. return m_PtArray[0];
  512. else if(nSize == 2) // 返回中点
  513. {
  514. double fx = (m_PtArray[0]->GetX() + m_PtArray[1]->GetX())/2;
  515. double fy = (m_PtArray[0]->GetY() + m_PtArray[1]->GetY())/2;
  516. return new CQPoint(fx,fy);
  517. }
  518. else
  519. {
  520. return m_PtArray[int(nSize/2)];
  521. }
  522. }