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

GIS编程

开发平台:

Visual C++

  1. // Draw1.cpp: implementation of the CDraw class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Draw.h"
  6. #include "Draw1.h"
  7. #include "math.h"
  8. #define pi 3.1415926
  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. //CDraw::CDraw();
  18. float GetAngle(float xx,float yy,float m_x,float m_y);
  19. float GetAngle(float xx,float yy,float m_x,float m_y)
  20. {
  21. float i;
  22. i=(float)acos((m_x-xx)/sqrt((m_y-yy)*(m_y-yy)+(m_x-xx)*(m_x-xx)));
  23.     return i;
  24. }
  25. float CDraw::PointLine(float xx,float yy,float x1,float y1,float x2,float y2)
  26. {
  27. float a,b,c,ang1,ang2,ang;
  28. a=CalDisp(x1,y1,xx,yy);
  29. if(a==0.0)
  30. return 0.0;
  31. b=CalDisp(x2,y2,xx,yy);
  32. if(b==0.0)
  33. return 0.0;
  34. c=CalDisp(x1,y1,x2,y2);
  35. if(c==0.0)
  36. return a;
  37. if(a<b)
  38. {
  39. if(fabs(y1-y2)<=0.001)
  40. {
  41. if(x1<x2)
  42. ang1=0;
  43. else
  44. ang1=(float)pi;
  45. }
  46. else
  47. {
  48. ang1=(float)acos((x2-x1)/c);
  49. if(y1>y2)
  50. ang1=(float)pi*2-ang1;
  51. }
  52. ang2=(float)acos((xx-x1)/a);
  53. if(y1>yy)
  54. ang2=(float)pi*2-ang2;
  55. ang=ang2-ang1;
  56. if(ang<0)
  57. ang=-ang;
  58. if(ang>pi)
  59. ang=(float)pi*2-ang;
  60. if(ang>pi/2)
  61. return a;
  62. else
  63. return (a*(float)sin(ang));
  64. }
  65. else
  66. {
  67. if(fabs(y1-y2)<=0.001)
  68. {
  69. if(x1<x2)
  70. ang1=(float)pi;
  71. else
  72. ang1=0;
  73. }
  74. else
  75. {
  76. ang1=(float)acos((x1-x2)/c);
  77. if(y2>y1)
  78. ang1=(float)pi*2-ang1;
  79. }
  80. ang2=(float)acos((xx-x2)/b);
  81. if(y2>yy)
  82. ang2=(float)pi*2-ang2;
  83. ang=ang2-ang1;
  84. if(ang<0)
  85. ang=-ang;
  86. if(ang>pi)
  87. ang=(float)pi*2-ang;
  88. if(ang>pi/2)
  89. return b;
  90. else
  91. return(b*(float)sin(ang));
  92. }
  93. }
  94. float CDraw::CalDisp(float x1,float y1,float x2,float y2)
  95. {
  96. return (float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  97. }
  98. void CDraw::CalArea()
  99. {
  100. }
  101. void CDraw::CalLong()
  102. {
  103. }
  104. BOOL CDraw::PointRgn(float x,float y,int Numble,PointStruct* PointList,float blc)
  105. {
  106. CRgn rgn;
  107. int x1,y1,i;
  108. POINT* pPoint;
  109. if(Numble<3)
  110. return 0;
  111. pPoint=new POINT[Numble];
  112. x1=(int)(x/blc);
  113. y1=(int)(y/blc);
  114. for(i=0;i<Numble;i++)
  115. {
  116. pPoint[i].x=(int)((PointList[i].x)/blc);
  117. pPoint[i].y=(int)((PointList[i].y)/blc);
  118. }
  119. rgn.CreatePolygonRgn(pPoint,Numble,0);
  120. i=(rgn.PtInRegion(x1,y1)!=0);
  121. rgn.DeleteObject();
  122. return i;
  123. }
  124. void CDraw::RotatePoint(float baseX,float baseY,float angle,float *xx,float *yy)
  125. {
  126. float xx1,yy1;
  127. xx1=*xx;
  128. yy1=*yy;
  129. double angle1=GetAngle(baseX,baseY,xx1,yy1);
  130. double j1=CalDisp(baseX,baseY,xx1,yy1);
  131. xx1=baseX+j1*cos(angle+angle1);
  132. yy1=baseY+j1*sin(angle+angle1);
  133. *xx=xx1;
  134. *yy=yy1;
  135. }
  136. float CDraw::GetAngle(float baseX,float baseY,float xx,float yy)
  137. {
  138. float r,ang;
  139. // 如果基点和计算点是同一个点
  140. if(fabs(baseX-xx)<=0.001&&fabs(baseY-yy)<=0.001)
  141. return 0;
  142. if(fabs(baseX-xx)<=0.001)
  143. {
  144. if(yy>baseY)
  145. ang=(float)(pi/2);
  146. else
  147. ang=(float)(pi*3/2);
  148. return ang;
  149. }
  150. else
  151. {
  152. r=(float)sqrt((xx-baseX)*(xx-baseX)+(yy-baseY)*(yy-baseY));
  153. double kk=(xx-baseX)/r;
  154. ang=(float)acos(kk);
  155. if(yy<baseY)
  156. ang=(float)(pi*2)-ang;
  157. return ang;
  158. }
  159. }
  160. void CDraw::Delete(BOOL bDelete)
  161. {
  162. b_Delete=bDelete;
  163. }
  164. BOOL CDraw::IsFill()
  165. {
  166. return FALSE;
  167. }
  168. CDraw::~CDraw()
  169. {
  170. }