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

GDI/图象编程

开发平台:

Visual C++

  1. // QLineObj.cpp: implementation of the CQLineObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..StdAfx.h"
  5. #include "..includeQLineObj.h"
  6. #include "..includeQGISAlgorithmLib.h"
  7. #include "..includeQGlobalObj.h"
  8. #include <vector>
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. using namespace std;
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CQLineObj::CQLineObj():CQBaseObj()
  19. {
  20. m_szObjName.Format("线条%ld",m_lObjID);
  21. m_nObjType = QGIS_LINE;
  22. m_nLineType = 0;
  23. m_bClosed = FALSE;
  24. m_lStartNode = -1;
  25. m_lEndNode = -1;
  26. m_lLeftArea = -1;
  27. m_lRightArea = -1;
  28. m_bShowPt = FALSE;
  29. m_Boundary.SetRect(0,0,0,0); //直线对象边界矩形初始化
  30. m_fElevation = 0.0f;
  31. m_nSplineType = 0; //普通折线
  32. }
  33. CQLineObj::~CQLineObj()
  34. {
  35. }
  36. CQLineObj::CQLineObj(CQLineObj & lObj):CQBaseObj(lObj)
  37. {
  38. m_szObjName = lObj.GetObjName();
  39. m_lStartNode = lObj.m_lStartNode;
  40. m_lEndNode = lObj.m_lEndNode;
  41. m_lLeftArea = lObj.m_lLeftArea;
  42. m_lRightArea = lObj.m_lRightArea;
  43. m_PtList.Copy(lObj.m_PtList);
  44. m_bClosed = lObj.IsClosed();
  45. m_bShowPt = lObj.GetShowPointFlag();
  46. m_PtList.Copy(lObj.m_PtList);
  47. lObj.GetBoundingRect(&m_Boundary);
  48. m_fElevation = lObj.GetElevation();
  49. m_nSplineType = lObj.GetSplineType();
  50. }
  51. void CQLineObj::Copy(CQLineObj & lObj)
  52. {
  53. CQBaseObj::Copy(lObj); //调用基类的拷贝函数
  54. if(lObj.GetObjType() == QGIS_LINE)
  55. {
  56. CQLineObj & p = (CQLineObj&)lObj;
  57. m_szObjName = p.GetObjName();
  58. m_lStartNode = p.m_lStartNode;
  59. m_lEndNode = p.m_lEndNode;
  60. m_lLeftArea = p.m_lLeftArea;
  61. m_lRightArea = p.m_lRightArea;
  62. m_PtList.Copy(p.m_PtList);
  63. m_bClosed = p.IsClosed();
  64. m_bShowPt = p.GetShowPointFlag();
  65. lObj.GetBoundingRect(&m_Boundary);
  66. m_fElevation = lObj.GetElevation();
  67. m_nSplineType = lObj.GetSplineType();
  68. }
  69. }
  70. BOOL CQLineObj::IsClosed()
  71. {
  72. return m_bClosed;
  73. }
  74. void CQLineObj::SetLineClosed(BOOL bClosed)
  75. {
  76. m_bClosed = bClosed;
  77. if(m_bClosed == FALSE) //假如是线条不闭合
  78. {
  79. int nPtCount = m_ptListDisplay.GetSize();
  80. if(nPtCount<=2) return;
  81. //两个点还闭合个屁啊
  82. CQPoint * pt1 = m_ptListDisplay.GetPoint(0);
  83. CQPoint * pt2 = m_ptListDisplay.GetPoint(nPtCount-1);
  84. if(*pt1 == *pt2) //假如当前点集的首末两点的值相同
  85. {
  86. m_ptListDisplay.Delete(nPtCount-1);
  87. }
  88. }
  89. }
  90. //////////////////////////////////////////
  91. ///***************CQGIS****************///
  92. ///函数名称:Create
  93. ///返回类型:无
  94. ///入口参数:CQPointArray & ptArray
  95. ///出口参数:无
  96. ///思路说明:有点阵创建线条对象
  97. ///***************CQGIS****************///
  98. //////////////////////////////////////////
  99. CQLineObj * CQLineObj::Create(CQPointArray & ptArray)
  100. {
  101. int nSize = ptArray.GetSize();
  102. if(nSize == 0) return NULL;
  103. CQLineObj * pLine = new CQLineObj;
  104. pLine->m_PtList.Copy(ptArray);
  105. pLine->CalculateBoundary();
  106. return pLine;
  107. }
  108. //显示图元
  109. //m_nDrawMode为下列值之一
  110. //R2_BLACK , //R2_COPYPEN , //R2_MASKNOTPEN 
  111. //R2_MASKPEN  //R2_MASKPENNOT  //R2_MERGENOTPEN 
  112. //R2_MERGEPEN  //R2_MERGEPENNOT   //R2_NOP  
  113. //R2_NOT  ///R2_NOTCOPYPEN  //R2_NOTMASKPEN 
  114. //R2_NOTMERGEPEN  //R2_NOTXORPEN  //R2_WHITE //R2_XORPEN 
  115. void CQLineObj::Display(CQCoordSys * pSys,CDC * pDC,int nDrawMode,int nSpecialMode,COLORREF * pColor)
  116. {
  117. if(GetObjDeleted() || GetObjHided())return;
  118. int nPtCount = m_ptListDisplay.GetSize();
  119. if(nPtCount<2) return;
  120. pDC->SetROP2(nDrawMode); // 设置绘制模式
  121. if(m_bClosed)
  122. {
  123. m_PtList.AddPoint(m_ptListDisplay.GetPoint(0)->GetX(),m_ptListDisplay.GetPoint(0)->GetY());
  124. ++nPtCount;
  125. }
  126. //点数据准备,将其存放在ppoints内存块中,节点个数存放在ptCount;
  127. CPoint * ppt = new CPoint[nPtCount];
  128. for(int i=0;i<nPtCount;i++)
  129. {
  130. pSys->WPtoLP(*m_ptListDisplay.GetPoint(i),ppt+i);
  131. }
  132. COLORREF crPen,crBrush;
  133. if(nSpecialMode == 1) //假如是选中
  134. {
  135. crPen = RGB(255,0,0);  //红
  136. crBrush = RGB(0,255,0);//绿
  137. }
  138. else if(nSpecialMode == 2) // 指定颜色绘制
  139. {
  140. crPen = *pColor;
  141. crBrush = *pColor;
  142. }
  143. else
  144. {
  145. crPen = m_crPenColor;
  146. crBrush = m_crBrushColor;
  147. }
  148. CPen newPen(m_nLineType,(int)m_fLineWidth,crPen);
  149. CPen * pOldPen = pDC->SelectObject(&newPen);
  150. pDC->Polyline(ppt,nPtCount);
  151. if(m_bShowPt)  //假如要显示点
  152. {
  153. for(int j=0;j<nPtCount;j++)
  154. {
  155. CQPoint * pt = m_ptListDisplay.GetPoint(j);
  156. CPoint ptLogic;
  157. pSys->WPtoLP(*pt,&ptLogic);
  158. int nRadius = 3;
  159. pDC->Ellipse((int)(ptLogic.x-nRadius),(int)(ptLogic.y-nRadius),(int)(ptLogic.x+nRadius),(int)(ptLogic.y+nRadius));
  160. }
  161. }
  162. pDC->SelectObject(pOldPen);
  163. if(ppt) delete []ppt;
  164. }
  165. long CQLineObj::GetPtInWndport(CQCoordSys * pSys)
  166. {
  167. CRect rectClient;
  168. CBoundaryRect rectTemp;
  169. pSys->GetWndport(rectClient.left,rectClient.top,rectClient.right,rectClient.bottom);
  170. pSys->LPtoWP(rectClient,&rectTemp);
  171. long nPtInView = 0;
  172. long nPtCount = m_PtList.GetSize();
  173. for(int i=0;i<nPtCount;i++)
  174. {
  175. if(rectTemp.PtInRect(*m_PtList.GetPoint(i)))
  176. nPtInView++;
  177. }
  178. return nPtInView;
  179. }
  180. void CQLineObj::Move(double dx,double dy)
  181. {
  182. int nSize = m_PtList.GetSize();
  183. if(nSize == 0)return;
  184. for(int i=0;i<nSize;i++)
  185. {
  186. m_PtList.GetPoint(i)->Move(dx,dy);
  187. }
  188. m_Boundary.Offset(dx,dy);
  189. CalculateDisplayPtlist();
  190. }
  191. void CQLineObj::Rotate(CQPoint & pt,double & fAngleDegree)
  192. {
  193. int nSize = m_PtList.GetSize();
  194. for(int i=0;i<nSize;i++)
  195. {
  196. CQBaseObj::Rotate(m_PtList[i],pt,fAngleDegree);
  197. }
  198. CalculateBoundary();
  199. }
  200. void CQLineObj::GetBoundingRect(CBoundaryRect * pRect)
  201. {
  202. if(!pRect) return;
  203. CalculateBoundary(pRect);
  204. }
  205. //框选
  206. BOOL CQLineObj::Select(CQCoordSys * pSys,CBoundaryRect & rectSel)
  207. {
  208. int i = 0;
  209. CBoundaryRect rectTemp;
  210. GetBoundingRect(&rectTemp);
  211. //先判断边界矩形,如果边界矩形不相交 则肯定
  212. if(!rectTemp.IsCross(&rectSel)) return FALSE;
  213. //m_PtList被替换
  214. int NumPoint = m_ptListDisplay.GetSize(); //获得直线上的点数
  215. int nCount = 0;//边界矩形的一条边与折线某一条边的交点个数
  216. double dx,dy;
  217. CQPoint rectLeftBottom,rectLeftTop,rectRightBottom,rectRightTop;
  218. dx = rectSel.m_fMinX;
  219. dy = rectSel.m_fMinY;
  220. rectLeftBottom.SetPoint(dx,dy); //左下角坐标
  221. dx = rectSel.m_fMinX;
  222. dy = rectSel.m_fMaxY;           //左上角坐标
  223. rectLeftTop.SetPoint(dx,dy);
  224. dx = rectSel.m_fMaxX;
  225. dy = rectSel.m_fMinY;           //右下角坐标
  226. rectRightBottom.SetPoint(dx,dy);
  227. dx = rectSel.m_fMaxX;
  228. dy = rectSel.m_fMaxY;           //右上角坐标
  229. rectRightTop.SetPoint(dx,dy);
  230. // 思路依次对线条的每一个点进行判断 如果有一个点选中则表示选中
  231. // 若没有直接选中某个角点则对折线对象中的每一个线条进行判断 看
  232. // 是否与边界矩形的边相交,若相交则表示选中
  233. CQPointArray ptArray;
  234. for(i=0;i<NumPoint-1;i++)
  235. {
  236. CQPoint * pt1 = m_ptListDisplay.GetPoint(i);
  237. CQPoint * pt2 = m_ptListDisplay.GetPoint(i+1);
  238. if(rectSel.PtInRect(*(m_ptListDisplay.GetPoint(i))))
  239. return TRUE;
  240. else
  241. {
  242. BOOL IsCross = FALSE;
  243. IsCross = CQGISAlgorithmLib::IsLineCross(*pt1,*pt2,rectLeftBottom,rectLeftTop);
  244. if(IsCross)return TRUE;
  245. IsCross = CQGISAlgorithmLib::IsLineCross(*pt1,*pt2,rectLeftTop,rectRightTop);
  246. if(IsCross)return TRUE;
  247. IsCross = CQGISAlgorithmLib::IsLineCross(*pt1,*pt2,rectRightTop,rectRightBottom);
  248. if(IsCross)return TRUE;
  249. IsCross = CQGISAlgorithmLib::IsLineCross(*pt1,*pt2,rectRightBottom,rectLeftBottom);
  250. if(IsCross)return TRUE;
  251. }
  252. }
  253. return FALSE;
  254. }
  255. //点选
  256. BOOL CQLineObj::Select(CQCoordSys * pSys,CQPoint & pt,double fEffactDistance)
  257. {
  258. CBoundaryRect bRect;
  259. GetBoundingRect(&bRect);
  260. if(!bRect.PtInRect(pt))
  261. return FALSE;
  262. //m_PtList被替换
  263. int nPtNum = m_ptListDisplay.GetSize();
  264. for(int i=0;i<nPtNum-1;i++)
  265. {
  266. CQPoint * pt1 = m_ptListDisplay.GetPoint(i);
  267. CQPoint * pt2 = m_ptListDisplay.GetPoint(i+1);
  268. double fDistance = CQPoint::Distance(pt,*pt1,*pt2);
  269. if(fDistance<=g_QObj.g_fEffectiveDistance)return TRUE;
  270. }
  271. return FALSE;
  272. }
  273. void CQLineObj::CalculateBoundary(CBoundaryRect * pRect)
  274. {
  275. int nSize = m_PtList.GetSize();
  276. if(nSize == 0)return;
  277. m_Boundary.m_fMinX = m_PtList[0]->GetX();
  278. m_Boundary.m_fMinY = m_PtList[0]->GetY();
  279. m_Boundary.m_fMaxX = m_PtList[0]->GetX();
  280. m_Boundary.m_fMaxY = m_PtList[0]->GetY();
  281. //获取边界矩形
  282. for(int i=1;i<nSize;i++)
  283. {
  284. m_Boundary.m_fMinX = min(m_Boundary.m_fMinX,m_PtList.GetPoint(i)->GetX());
  285. m_Boundary.m_fMinY = min(m_Boundary.m_fMinY,m_PtList.GetPoint(i)->GetY());
  286. m_Boundary.m_fMaxX = max(m_Boundary.m_fMaxX,m_PtList.GetPoint(i)->GetX());
  287. m_Boundary.m_fMaxY = max(m_Boundary.m_fMaxY,m_PtList.GetPoint(i)->GetY());
  288. }
  289. //判断是垂直线 或是水平线的情形
  290. if(m_Boundary.m_fMinX == m_Boundary.m_fMaxX)  //垂直线
  291. {
  292. m_Boundary.m_fMinX -= 5;
  293. m_Boundary.m_fMaxX += 5;
  294. }
  295. else if(m_Boundary.m_fMinY == m_Boundary.m_fMaxY) //水平线
  296. {
  297. m_Boundary.m_fMinY -= 5;
  298. m_Boundary.m_fMaxY += 5;
  299. }
  300. CalculateDisplayPtlist();
  301. if(pRect)
  302. {
  303. pRect->m_fMinX = m_Boundary.m_fMinX;
  304. pRect->m_fMinY = m_Boundary.m_fMinY;
  305. pRect->m_fMaxX = m_Boundary.m_fMaxX;
  306. pRect->m_fMaxY = m_Boundary.m_fMaxY;
  307. }
  308. }
  309. CString CQLineObj::VarToStr()
  310. {
  311. CString szResult;
  312. CString szObj = CQBaseObj::VarToStr();
  313. CString szLine;
  314. szLine.Format("n是否圈闭:%d是否显示点:%d拓扑起始接点ID:%ld拓扑终止接点ID:%ld拓扑左多边形 ID:%ld拓扑右多边形 ID:%ld高程:%10.4fn",m_bClosed,m_bShowPt,m_lStartNode,m_lEndNode,m_lLeftArea,m_lRightArea,m_fElevation);
  315. int nSize = m_PtList.GetSize();
  316. CString szCount;
  317. szCount.Format("线条共有%d个结点n",nSize);
  318. szLine += szCount;
  319. CString szNode;
  320. for(int i=0;i<nSize;i++)
  321. {
  322. szNode.Format("结点X坐标:%f结点Y坐标:%fn",m_PtList.GetPoint(i)->GetX(),m_PtList.GetPoint(i)->GetY());
  323. szLine += szNode;
  324. }
  325. szResult = szObj+szLine;
  326. return szResult;
  327. }
  328. //////////////////////////////////////////
  329. ///***************CQGIS****************///
  330. ///函数名称:
  331. ///返回类型:
  332. ///入口参数:
  333. ///出口参数:
  334. ///思路说明:
  335. ///***************CQGIS****************///
  336. //////////////////////////////////////////
  337. void CQLineObj::Serialize(CArchive& ar)
  338. {
  339. CQBaseObj::Serialize(ar);
  340. if(ar.IsStoring())
  341. {
  342. ar.Write(&m_lStartNode,sizeof(long));
  343. ar.Write(&m_lEndNode,sizeof(long));
  344. ar.Write(&m_lLeftArea,sizeof(long));
  345. ar.Write(&m_lRightArea,sizeof(long));
  346. float fEle = static_cast<float>(m_fElevation);
  347. ar.Write(&fEle,sizeof(float));
  348. ar.Write(&m_nSplineType,sizeof(int));
  349. m_PtList.Serialize(ar);
  350. }
  351. else
  352. {
  353. ar.Read(&m_lStartNode,sizeof(long));
  354. ar.Read(&m_lEndNode,sizeof(long));
  355. ar.Read(&m_lLeftArea,sizeof(long));
  356. ar.Read(&m_lRightArea,sizeof(long));
  357. float fEle;
  358. ar.Read(&fEle,sizeof(float));
  359. m_fElevation = fEle;
  360. ar.Read(&m_nSplineType,sizeof(int));
  361. m_PtList.Serialize(ar);
  362. CalculateBoundary();
  363. }
  364. }
  365. void CQLineObj::XFlex(double dcp_x,double dFlex)
  366. {
  367. int nPtNum = m_PtList.GetSize();
  368. for(int i=0;i<nPtNum;i++)
  369. {
  370. double dx = m_PtList.GetPoint(i)->GetX();
  371. dx = (dx-dcp_x)*dFlex;
  372. m_PtList.GetPoint(i)->SetX(dx);
  373. }
  374. }
  375. void CQLineObj::YFlex(double dcp_y,double dFley)
  376. {
  377. int nPtNum = m_PtList.GetSize();
  378. for(int i=0;i<nPtNum;i++)
  379. {
  380. double dy = m_PtList.GetPoint(i)->GetY();
  381. dy = (dy-dcp_y)*dFley;
  382. m_PtList.GetPoint(i)->SetY(dy);
  383. }
  384. }
  385. double CQLineObj::GetLineLength()
  386. {
  387. int nPtNum = m_ptListDisplay.GetSize();
  388. if(nPtNum == 0)return 0;
  389. double fResult = 0;
  390. for(int i=0;i<nPtNum-1;i++)
  391. {
  392. CQPoint * pt1 = m_ptListDisplay.GetPoint(i);
  393. CQPoint * pt2 = m_ptListDisplay.GetPoint(i+1);
  394. fResult += pt1->Distance(*pt2);
  395. }
  396. return fResult;
  397. }
  398. void CQLineObj::SetShowPointFlag(BOOL bShowPt)
  399. {
  400. m_bShowPt = bShowPt;
  401. }
  402. BOOL CQLineObj::GetShowPointFlag()
  403. {
  404. return m_bShowPt;
  405. }
  406. void CQLineObj::SetStartNodeID(long lStartID)
  407. {
  408. m_lStartNode = lStartID;
  409. }
  410. void CQLineObj::SetEndNodeID(long lEndID)
  411. {
  412. m_lEndNode = lEndID;
  413. }
  414. void CQLineObj::SetLeftAreaID(long lLeftID)
  415. {
  416. m_lLeftArea = lLeftID;
  417. }
  418. void CQLineObj::SetRightAreaID(long lRightID)
  419. {
  420. m_lRightArea = lRightID;
  421. }
  422. long CQLineObj::GetStartNodeID()
  423. {
  424. return m_lStartNode;
  425. }
  426. long CQLineObj::GetEndNodeID()
  427. {
  428. return m_lEndNode;
  429. }
  430. long CQLineObj::GetLeftAreaID()
  431. {
  432. return m_lLeftArea;
  433. }
  434. long CQLineObj::GetRightAreaID()
  435. {
  436. return m_lRightArea;
  437. }
  438. void CQLineObj::WriteToFile(CFile * pFile)
  439. {
  440. CQBaseObj::WriteToFile(pFile);
  441. pFile->Write(&m_lStartNode,sizeof(long));
  442. pFile->Write(&m_lEndNode,sizeof(long));
  443. pFile->Write(&m_lLeftArea,sizeof(long));
  444. pFile->Write(&m_lRightArea,sizeof(long));
  445. float fEle = static_cast<float>(m_fElevation);
  446. pFile->Write(&fEle,sizeof(float));
  447. pFile->Write(&m_nSplineType,sizeof(int)); //输出线条的类型
  448. m_PtList.WritetoFile(pFile);
  449. }
  450. void CQLineObj::ReadFromFile(CFile * pFile)
  451. {
  452. CQBaseObj::ReadFromFile(pFile);
  453. pFile->Read(&m_lStartNode,sizeof(long));
  454. pFile->Read(&m_lEndNode,sizeof(long));
  455. pFile->Read(&m_lLeftArea,sizeof(long));
  456. pFile->Read(&m_lRightArea,sizeof(long));
  457. float fEle;
  458. pFile->Read(&fEle,sizeof(float));
  459. pFile->Read(&m_nSplineType,sizeof(int));
  460. m_fElevation = fEle;
  461. m_PtList.DeleteAll();
  462. m_PtList.ReadFromFile(pFile);
  463. CalculateDisplayPtlist();
  464. }
  465. //镜像操作 0-Y轴镜像1-X轴镜像2-原点镜像
  466. void CQLineObj::Mirror(int nMirrorType /* = 0 */,CQPoint & ptOrign,CQLineObj * pNewLine)
  467. {
  468. vector<double>  dDisVector; //用于存放距离
  469. CQPointArray ptMirrorArray;
  470. int nPtSize = m_PtList.GetSize();
  471. if(nPtSize == 0)return;
  472. CQPoint ptTemp;
  473. double dx = 0,dy = 0;
  474. double dDis = 0;
  475. if(!pNewLine)return;
  476. switch(nMirrorType)
  477. {
  478. case 0: //Y轴镜像
  479. {
  480. //第一步
  481. for(int i=0;i<nPtSize;i++)
  482. {
  483. dx = ptOrign.GetX();
  484. dy = m_PtList.GetPoint(i)->GetY();
  485. ptTemp.SetPoint(dx,dy);
  486. dDis = 2*ptTemp.XAxisDistance(*m_PtList.GetPoint(i));
  487. dDisVector.push_back(dDis); //构造点距离数组
  488. }
  489. //第二步 构造镜像线坐标数组
  490. for(int j=0;j<nPtSize;j++)
  491. {
  492. dx = m_PtList.GetPoint(j)->GetX() + dDisVector[j];
  493. dy = m_PtList.GetPoint(j)->GetY();
  494. ptMirrorArray.AddPoint(dx,dy);
  495. }
  496. if(ptMirrorArray.GetSize()>0)
  497. {
  498. pNewLine->m_PtList.Copy(ptMirrorArray);
  499. }
  500. break;
  501. }
  502. case 1://X轴镜像
  503. {
  504. //第一步
  505. for(int i=0;i<nPtSize;i++)
  506. {
  507. dx = m_PtList.GetPoint(i)->GetX();
  508. dy = ptOrign.GetY(); //Y不变
  509. ptTemp.SetPoint(dx,dy);
  510. dDis = 2*ptTemp.YAxisDistance(*m_PtList.GetPoint(i));
  511. dDisVector.push_back(dDis);
  512. }
  513. //第二步 构造镜像线坐标数组
  514. for(int j=0;j<nPtSize;j++)
  515. {
  516. dx = m_PtList.GetPoint(j)->GetX();
  517. dy = m_PtList.GetPoint(j)->GetY() + dDisVector[j];
  518. ptMirrorArray.AddPoint(dx,dy);
  519. }
  520. if(ptMirrorArray.GetSize()>0)
  521. {
  522. pNewLine->m_PtList.Copy(ptMirrorArray);
  523. }
  524. break;
  525. }
  526. case 2: //原点镜像
  527. {
  528. Mirror(0,ptOrign,pNewLine);
  529. CQLineObj tmLine;
  530. pNewLine->Mirror(1,ptOrign,&tmLine);
  531. if(tmLine.m_PtList.GetSize()>=1)
  532. {
  533. pNewLine->m_PtList.Copy(tmLine.m_PtList);
  534. }
  535. break;
  536. }
  537. default:
  538. {
  539. //第一步
  540. for(int i=0;i<nPtSize;i++)
  541. {
  542. dx = ptOrign.GetX();
  543. dy = m_PtList.GetPoint(i)->GetY();
  544. ptTemp.SetPoint(dx,dy);
  545. dDis = 2*ptTemp.Distance(*m_PtList.GetPoint(i));
  546. dDisVector.push_back(dDis); //构造点距离数组
  547. }
  548. //第二步 构造镜像线坐标数组
  549. for(int j=0;j<nPtSize;j++)
  550. {
  551. dx = m_PtList.GetPoint(j)->GetX() + dDisVector[j];
  552. dy = m_PtList.GetPoint(j)->GetY();
  553. ptMirrorArray.AddPoint(dx,dy);
  554. }
  555. if(ptMirrorArray.GetSize()>0)
  556. {
  557. pNewLine = new CQLineObj;
  558. pNewLine->m_PtList.Copy(ptMirrorArray);
  559. }
  560. break;
  561. }
  562. }
  563. }
  564. inline void CQLineObj::SetElevation(double fEle)
  565. {
  566. m_fElevation = fEle;
  567. }
  568. double CQLineObj::GetElevation() const
  569. {
  570. return m_fElevation;
  571. }
  572. inline void CQLineObj::SetSplineType(int nSplineType)
  573. {
  574. if(nSplineType<0 || nSplineType>3)
  575. nSplineType = 0;
  576. m_nSplineType = nSplineType;
  577. CalculateDisplayPtlist(); //计算显示点的列表
  578. }
  579. //获取样条曲线的类型
  580. inline int CQLineObj::GetSplineType() const
  581. {
  582. return m_nSplineType;
  583. }
  584. void CQLineObj::CalculateDisplayPtlist() //计算折线显示时候的点阵
  585. {
  586. m_ptListDisplay.DeleteAll();
  587. int ptCount = m_PtList.GetSize();
  588. if(ptCount<2)
  589. {
  590. return ;
  591. }
  592. else if(ptCount==2)
  593. {
  594. for(int i=0;i<ptCount;i++)
  595. {
  596. m_ptListDisplay.AddPoint(m_PtList[i]->GetX(),m_PtList[i]->GetY());
  597. }
  598. }
  599. else
  600. {
  601. if( m_nSplineType==1 )//为插值曲线
  602. {
  603. //加入代码对m_PtList进行处理,要保证m_PtList中的数据不改变
  604. //另外新建一个CGeoPointArray  temppointlist,将插值的结果全部放入其中
  605. //注意,要内存的使用与释放问题
  606. double *px = new double[ptCount];
  607. double *py = new double[ptCount];
  608. CQPoint * p=0;
  609. int i=0;
  610. for(;i<ptCount;i++)
  611. {
  612. p = m_PtList.GetPoint(i);
  613. *(px+i) = p->GetX();
  614. *(py+i) = p->GetY();
  615. }
  616. double * xx, * yy;
  617. int n = (ptCount-1)*10+1;
  618. xx = new double [n];
  619. yy = new double [n];
  620. CQGISAlgorithmLib::SplineClean2D(px, py, xx, yy, ptCount,10);
  621. for( i=0;i<n;i++)//将实际坐标转换成屏幕点阵坐标,存入ppoint
  622. {
  623. m_ptListDisplay.AddPoint(xx[i],yy[i]);
  624. }
  625. if(px) delete[] px;
  626. if(py) delete[] py;
  627. if(xx) delete[] xx;
  628. if(yy) delete[] yy;
  629. ptCount = n;
  630. }
  631. else if ( m_nSplineType==2 )//为2次B样条曲线
  632. {
  633. double *px = new double[ptCount];
  634. double *py = new double[ptCount];
  635. CQPoint * p=0;
  636. int i=0;
  637. for(;i<ptCount;i++)
  638. {
  639. p = m_PtList.GetPoint(i);
  640. *(px+i) = p->GetX();
  641. *(py+i) = p->GetY();
  642. }
  643. double * xx, * yy;
  644. int n = (ptCount-2)*10+1;
  645. xx = new double [n];
  646. yy = new double [n];
  647. CQGISAlgorithmLib::B2_curves(px, py, xx, yy, ptCount,10);
  648. for( i=0;i<n;i++)
  649. {
  650. m_ptListDisplay.AddPoint(xx[i],yy[i]);
  651. }
  652. if(px) delete[] px;
  653. if(py) delete[] py;
  654. if(xx) delete[] xx;
  655. if(yy) delete[] yy;
  656. ptCount = n;
  657. }
  658. else if ( m_nSplineType==3 )//为3次B样条曲线
  659. {
  660. double *px = new double[ptCount];
  661. double *py = new double[ptCount];
  662. CQPoint * p=0;
  663. int i=0;
  664. for(;i<ptCount;i++)
  665. {
  666. p = m_PtList.GetPoint(i);
  667. *(px+i) = p->GetX();
  668. *(py+i) = p->GetY();
  669. }
  670. double * xx, * yy;
  671. int n = (ptCount-3)*5+1;
  672. xx = new double [n];
  673. yy = new double [n];
  674. CQGISAlgorithmLib::B3_curves(px, py, xx, yy, ptCount,5);
  675. for( i=0;i<n;i++)
  676. {
  677. m_ptListDisplay.AddPoint(xx[i],yy[i]);
  678. }
  679. if(px) delete[] px;
  680. if(py) delete[] py;
  681. if(xx) delete[] xx;
  682. if(yy) delete[] yy;
  683. ptCount = n;
  684. }
  685. else //正常显示
  686. {
  687. for(int i=0;i<ptCount;i++)//将实际坐标转换成屏幕点阵坐标,存入ppoint
  688. {
  689. m_ptListDisplay.AddPoint(m_PtList[i]->GetX(),m_PtList[i]->GetY());
  690. }
  691. }
  692. if(m_bClosed)//如果是闭线
  693. {
  694. m_ptListDisplay.AddPoint( m_ptListDisplay[0]->GetX(),
  695. m_ptListDisplay[0]->GetY());
  696. }
  697. }
  698. }
  699. void CQLineObj::PtListBeThin(double dThinScale)
  700. {
  701. if(dThinScale<0)
  702. dThinScale = 0.0f;
  703. m_ptListDisplay.AddPoint(0,0);
  704. CQGISAlgorithmLib::PtListBeThin(m_PtList,dThinScale);
  705. }