Pline.cpp
上传用户:yklx818
上传日期:2013-04-13
资源大小:459k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // Pline.cpp: implementation of the CPline class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Draw.h"
  6. #include "Pline.h"
  7. #include "DrawDoc.h"
  8. #include "math.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. extern IsRectCross(float minx,float miny,float maxx,float maxy);
  18. CPline::CPline();
  19. void CPline::Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)
  20. {
  21. int x1,y1;
  22. if(b_Delete)
  23. {
  24. return ;
  25. }
  26. float minx,miny,maxx,maxy;
  27. GetRect(&minx,&miny,&maxx,&maxy);//得到边界矩形
  28. if(!IsRectCross(minx,miny,maxx,maxy))//如果边界矩形不与屏幕窗口相交
  29. return;
  30. short LineType=m_LineType;
  31. short LineWide=max(1,DLtoVL(m_LineWide));
  32. short ColorPen=m_ColorPen;
  33. if(m_DrawModel==1)
  34. {
  35. if(m_LineType!=2)
  36. LineType=2;
  37. else
  38. LineType++;
  39. }
  40. else if(m_DrawModel==2)
  41. ColorPen=BackColor;
  42. CGraphPara m_GraphPara;
  43.     CGraphPara *p_GraphPara;
  44. p_GraphPara=&m_GraphPara;
  45. CPen pen(LineType,LineWide,p_GraphPara->GetColor(ColorPen));
  46. CPen* pOldPen=pDC->SelectObject(&pen);
  47. if(m_DrawMode==0)
  48. pDC->SetROP2(R2_COPYPEN);
  49. else if(m_DrawMode==1)
  50. pDC->SetROP2(R2_NOT);
  51. POINT* ppoint=new POINT[m_Numble+1];
  52. for(int i=0;i<m_Numble;i++)
  53. {
  54. DPtoVP(m_PointList[i].x,m_PointList[i].y,&x1,&y1);
  55. if(i==0)
  56. pDC->MoveTo(x1,y1);
  57. else
  58. pDC->LineTo(x1,y1);
  59. }
  60. pDC->SelectObject(pOldPen);
  61. }
  62. void CPline::CalLong()
  63. {
  64. m_fLength=0;
  65. for(int i=0;i<this->m_Numble-1;i++)
  66. {
  67. m_fLength+=sqrt((m_PointList[i].x-m_PointList[i+1].x)*(m_PointList[i].x-m_PointList[i+1].x)+
  68. (m_PointList[i].y-m_PointList[i+1].y)*(m_PointList[i].y-m_PointList[i+1].y));
  69. }
  70. }
  71. void CPline::GetRect(float* minX,float* minY,float* maxX,float* maxY)
  72. {
  73. float x1,y1,x2,y2;
  74. //用第一个顶点的坐标初始化变量
  75. x1=m_PointList[0].x;
  76. x2=m_PointList[0].y;
  77. y1=m_PointList[0].x;
  78. y2=m_PointList[0].y;
  79. for(int i=1;i<m_Numble;i++)
  80. {
  81. x1=min(x1,m_PointList[i].x);
  82. x2=min(x2,m_PointList[i].x);
  83. y1=min(y1,m_PointList[i].y);
  84. y2=min(y2,m_PointList[i].y);
  85. }
  86. *minX=x1;
  87. *maxX=x2;
  88. *minY=y1;
  89. *maxY=y2;
  90. }
  91. BOOL CPline::IsPoint(float x,float y,float j1,float blc)
  92. {
  93. int i;
  94. float xx,x1,y1,x2,y2;
  95. if(b_Delete)
  96. return FALSE;
  97. GetRect(&x1,&y1,&x2,&y2);
  98. if(!(x>=x1-j1&&x<=x2+j1&&y>=y1-j1&&y<=y2+j1))
  99. return FALSE;
  100. for(i=0;i<m_Numble-1;i++)
  101. {
  102. xx=PointLine(x,y,m_PointList[i].x,m_PointList[i].y,
  103. m_PointList[i+1].x,m_PointList[i+1].y);
  104. if(xx<j1)
  105. return TRUE;
  106. }
  107. return FALSE;
  108. }
  109. void CPline::Move(float x_Move,float y_Move)
  110. {
  111. for(int i=0;i<m_Numble;i++)
  112. {
  113. m_PointList[i].x+=x_Move;
  114. m_PointList[i].y+=y_Move;
  115. }
  116. }
  117. void CPline::Rotate(float baseX,float baseY,float angle)
  118. {
  119. for(int i=0;i<this->m_Numble;i++)
  120. {
  121. RotatePoint(baseX,baseY,angle,&m_PointList[i].x,&m_PointList[i].y);
  122. }
  123. }
  124. CPline::~CPline();