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

GDI/图象编程

开发平台:

Visual C++

  1. // QGISAlgorithmLib->cpp: implementation of the CQGISAlgorithmLib class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "....QObjectsincludeResource.h"
  6. #include "..includeResource.h"
  7. #include "..includeC_QGISAlgorithmLib.h"
  8. #include "....QObjectsincludeQLineObj.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. CQGISAlgorithmLib::CQGISAlgorithmLib()
  18. {
  19. }
  20. CQGISAlgorithmLib::~CQGISAlgorithmLib()
  21. {
  22. }
  23. //////////////////////////////////////////
  24. ///***************CQGIS****************///
  25. ///函数名称:IsLineCross
  26. ///返回类型:BOOL
  27. ///入口参数:CQPoint p1,CQPoint p2,CQPoint q1,CQPoint q2
  28. ///出口参数:无
  29. ///思路说明:边界矩形,矢量跨立实验
  30. ///***************CQGIS****************///
  31. //////////////////////////////////////////
  32. BOOL CQGISAlgorithmLib::IsLineCross(CQPoint p1,CQPoint p2,CQPoint q1,CQPoint q2)
  33. {
  34. //创建两条直线对象 用于进行边界矩形的判断
  35. if(p1 == q1 || p1 == q2 || p2 == q1 || p2 == q2)
  36. return TRUE; //直接得出直线相交
  37. CQLineObj * pLine1 = new CQLineObj;
  38. pLine1->m_PtList.AddPoint(&p1);
  39. pLine1->m_PtList.AddPoint(&p2);
  40. CQLineObj * pLine2 = new CQLineObj;
  41. pLine2->m_PtList.AddPoint(&q1);
  42. pLine2->m_PtList.AddPoint(&q2);
  43. CBoundaryRect * pRect1 = new CBoundaryRect;
  44. pLine1->GetBoundingRect(pRect1);
  45. CBoundaryRect * pRect2 = new CBoundaryRect;
  46. pLine2->GetBoundingRect(pRect2);
  47. if(!pRect1->IsCross(pRect2))
  48. {
  49. //假如两个边界矩形不相交
  50. delete pRect2;
  51. delete pRect1;
  52. delete pLine2;
  53. delete pLine1;
  54. return FALSE; //不相交
  55. }
  56. //进行跨立实验
  57. double p1q1x = p1.GetX() - q1.GetX();
  58. double p1q1y = p1.GetY() - q1.GetY();
  59. double q2q1x = q2.GetX() - q1.GetX();
  60. double q2q1y = q2.GetY() - q1.GetY();
  61. double p2q1x = p2.GetX() - q1.GetX();
  62. double p2q1y = p2.GetY() - q1.GetY();
  63. double fResult;  //运算结果
  64. double fpq = p1q1x*q2q1y - q2q1x*p1q1y;
  65. double fqp = q2q1x*p2q1y - p2q1x*q2q1y;
  66. fResult = fpq*fqp;
  67. if(fResult>=0)
  68. {
  69. delete pRect2;
  70. delete pRect1;
  71. delete pLine2;
  72. delete pLine1;
  73. return TRUE;
  74. }
  75. delete pRect2;
  76. delete pRect1;
  77. delete pLine2;
  78. delete pLine1;
  79. return FALSE;
  80. }
  81. //////////////////////////////////////////
  82. ///***************CQGIS****************///
  83. ///函数名称:CalLineCrossPoint
  84. ///返回类型:无
  85. ///入口参数:CQPoint p1,CQPoint p2,CQPoint q1,CQPoint q2
  86. ///出口参数:CQPointArray * pResult
  87. ///思路说明:判断两条直线是否相交,若相交则返回其交点
  88. ///***************CQGIS****************///
  89. //////////////////////////////////////////
  90. void CQGISAlgorithmLib::CalLineCrossPoint(CQPoint pp1,CQPoint pp2,CQPoint qq1,CQPoint qq2,CQPointArray * pResult)
  91. {
  92. if(!IsLineCross(pp1,pp2,qq1,qq2))
  93. {
  94. pResult = 0;
  95. return;
  96. }
  97. CQPoint * p1 = new CQPoint(pp1);
  98. CQPoint * p2 = new CQPoint(pp2);
  99. CQPoint * q1 = new CQPoint(qq1);
  100. CQPoint * q2 = new CQPoint(qq2);
  101. //计算两条直线的斜率
  102. //double k1 = (p2.GetY()-p1.GetY())/(p2.GetX()-p1.GetX());
  103. //double k2 = (q2.GetY()-q1.GetY())/(q2.GetX()-q1.GetX());
  104. //L0(p1,p2),L1(q1,q2);
  105. //情况1 L0平行于Y轴
  106. //分两种情况 当L1也与Y轴平行时,则两条直线共线 
  107. //若L1与Y轴不平行,则直接代入方程求解
  108. if(p1->GetX() == p2->GetX())
  109. {
  110. if(q1->GetX() == q2->GetX()) //L1也与Y轴平行
  111. {
  112. CalSameLineCrossPoint(*p1,*p2,*q1,*q2,pResult);
  113. return;
  114. }
  115. else      //L1与Y轴不平行
  116. {
  117. double k2 = (q2->GetY()-q1->GetY())/(q2->GetX()-q1->GetX());
  118. double x2 = p1->GetX();
  119. //y2 = k2x2-k2x1+y1;x1 = q1->GetX(),y1 = q1->getY();
  120. double y2 = k2*x2-k2*q1->GetX()+q1->GetY();
  121. pResult->AddPoint(x2,y2);
  122. delete q2;
  123. }
  124. }
  125. else if(q1->GetX() == q2->GetX())
  126. {
  127. double k1 = (p2->GetY()-p1->GetY())/(p2->GetX()-p1->GetX());
  128. double x1 = q1->GetX(),y1;
  129. y1 = k1*x1-k1*p1->GetX()+p1->GetY();
  130. pResult->AddPoint(x1,y1);
  131. }
  132. else if(p1->GetY() == p2->GetY()) //平行与X 轴
  133. {
  134. if(q1->GetY() == q2->GetY())  //L1也平行与X轴
  135. {
  136. CalSameLineCrossPoint(*p1,*p2,*q1,*q2,pResult);
  137. }
  138. else
  139. {
  140. double k2 = (q2->GetY()-q1->GetY())/(q2->GetX()-q1->GetX());
  141. double y2 = p1->GetY();
  142. double x2 = (y2+k2*q1->GetX()-q1->GetY())/k2;
  143. pResult->AddPoint(x2,y2);
  144. }
  145. }
  146. else if(q1->GetY() == q2->GetY())
  147. {
  148. double k1 = (p2->GetY()-p1->GetY())/(p2->GetX()-p1->GetX());
  149. double y1 = q1->GetY();
  150. double x1 = (y1+k1*p1->GetX()-p1->GetY())/k1;
  151. pResult->AddPoint(x1,y1);
  152. }
  153. else
  154. {
  155. double k1 = (p2->GetY()-p1->GetY())/(p2->GetX()-p1->GetX());
  156. double k2 = (q2->GetY()-q1->GetY())/(q2->GetX()-q1->GetX());
  157. if(k1-k2 == SMALL_NUMBER)
  158. {
  159. CalSameLineCrossPoint(*p1,*p2,*q1,*q1,pResult);
  160. }
  161. else
  162. {
  163. double xResult = k1*p1->GetX()-k2*q1->GetX()+q1->GetY()-p1->GetY();
  164. xResult = xResult/(k1-k2);
  165. double yResult = k1*xResult-k1*p1->GetX()+p1->GetY();
  166. pResult->AddPoint(xResult,yResult);
  167. }
  168. }
  169. delete q2;
  170. delete q1;
  171. delete p2;
  172. delete p1;
  173. }
  174. //////////////////////////////////////////
  175. ///***************CQGIS****************///
  176. ///函数名称:CalSameLineCrossPoint
  177. ///返回类型:无
  178. ///入口参数:CQPoint p1,CQPoint p2,CQPoint q1,CQPoint q2
  179. ///出口参数:CQPointArray * pResult
  180. ///思路说明:
  181. ///***************CQGIS****************///
  182. //////////////////////////////////////////
  183. void CQGISAlgorithmLib::CalSameLineCrossPoint(CQPoint pp1,CQPoint pp2,CQPoint qq1,CQPoint qq2,CQPointArray * pResult)
  184. {
  185. //直接计算 不做条件判断 在调用之前一定要确保两直线是相交的
  186. //共线计算只考虑垂直于X,Y轴的情形
  187. double fy1,fy2;
  188. double fy3,fy4;
  189. double fx1,fx2;
  190. double fx3,fx4;
  191. CQPoint * p1 = new CQPoint(pp1);
  192. CQPoint * p2 = new CQPoint(pp2);
  193. CQPoint * q1 = new CQPoint(qq1);
  194. CQPoint * q2 = new CQPoint(qq2);
  195. //先找出较长的直线
  196. double dd1 = p1->Distance(*p2);
  197. double dd2 = q1->Distance(*q2);
  198. //始终用较长的线段为基准进行判断
  199. if(dd1<dd2)
  200. {
  201. CQPoint tmPoint = *p1;
  202. *p1 = *q1;
  203. *q1 = tmPoint;
  204. tmPoint = *p2;
  205. *p2 = *q2;
  206. *q2 = tmPoint;
  207. }
  208. if(p1->GetX() == p2->GetX() && q1->GetX() == q2->GetX())  //两条直线都与Y轴平行 
  209. {
  210. fy1 = min(p1->GetY(),p2->GetY());
  211. fy2 = max(p1->GetY(),p2->GetY());
  212. fy3 = min(q1->GetY(),q2->GetY());
  213. fy4 = max(q1->GetY(),q2->GetY());
  214. p1->SetPoint(p1->GetX(),fy1);  //Y较小的点
  215. p2->SetPoint(p2->GetX(),fy2);  //Y较大的点
  216. q1->SetPoint(q1->GetX(),fy3);
  217. q2->SetPoint(q2->GetX(),fy4);
  218. if(p1->GetY() > q2->GetY() || p2->GetY() < q1->GetY())
  219. {
  220. pResult = 0;
  221. }
  222. else
  223. {
  224. if(p2->GetY() == q1->GetY())
  225. {
  226. pResult->AddPoint(p2->GetX(),p2->GetY());
  227. }
  228. else if(q1->GetY()<p2->GetY() && q1->GetY() >p1->GetY())
  229. {
  230. if(p2->GetY()>q1->GetY() && p2->GetY()<q2->GetY())
  231. {
  232. pResult->AddPoint(q1->GetX(),q1->GetY());
  233. pResult->AddPoint(p2->GetX(),p2->GetY());
  234. }
  235. else if(p2->GetY()>=q2->GetY())
  236. {
  237. pResult->AddPoint(q1->GetX(),q1->GetY());
  238. pResult->AddPoint(q2->GetY(),q2->GetY());
  239. }
  240. }
  241. else if(*p1 == *q1 && *p2 == *q2)  //两直线重合
  242. {
  243. pResult->AddPoint(p1->GetX(),p1->GetY());
  244. pResult->AddPoint(p2->GetX(),p2->GetY());
  245. }
  246. }
  247. }
  248. else if(p1->GetY() == p2->GetY() && q1->GetY() == q2->GetY())  //两条直线都与X轴平行 
  249. {
  250. fx1 = min(p1->GetX(),p2->GetX());
  251. fx2 = max(p1->GetX(),p2->GetX());
  252. fx3 = min(q1->GetX(),q2->GetX());
  253. fx4 = max(q1->GetX(),q2->GetX());
  254. p1->SetPoint(fx1,p1->GetY());
  255. p2->SetPoint(fx2,p2->GetY());
  256. q1->SetPoint(fx3,q1->GetY());
  257. q2->SetPoint(fx4,q2->GetY());
  258. if(p2->GetX() < q1->GetX() || p1->GetX() > q2->GetX())
  259. {
  260. pResult = 0;
  261. }
  262. else if(q1->GetX()>p1->GetX() && q1->GetX()<p2->GetX())
  263. {
  264. if(p2->GetX()>q1->GetX() && p2->GetX()<q2->GetX())
  265. {
  266. pResult->AddPoint(q1->GetX(),q1->GetY());
  267. pResult->AddPoint(p2->GetX(),p2->GetY());
  268. }
  269. else if(p2->GetX()>=q2->GetX())
  270. {
  271. pResult->AddPoint(q1->GetX(),q1->GetY());
  272. pResult->AddPoint(q2->GetX(),q2->GetY());
  273. }
  274. }
  275. else if(p2->GetX() == q1->GetX())
  276. {
  277. pResult->AddPoint(p2->GetX(),p2->GetY());
  278. }
  279. else if(*p1 == *q1 && *p2 == *q2)
  280. {
  281. pResult->AddPoint(p1->GetX(),p2->GetY());
  282. pResult->AddPoint(p2->GetX(),p2->GetY());
  283. }
  284. }
  285. else   //两条直线只是斜率相等
  286. {
  287. if(p1->GetX()>p2->GetX())
  288. {
  289. CQPoint tmPoint;
  290. tmPoint = *p1;
  291. *p1 = *p2;
  292. *p2 = tmPoint;
  293. }
  294. if(q1->GetX()>q2->GetX())
  295. {
  296. CQPoint tmPoint;
  297. tmPoint = *q1;
  298. *q1 = *q2;
  299. *q2 = tmPoint;
  300. }
  301. if(p2->GetX()<q1->GetX())
  302. {
  303. CQPoint tmPoint = *q1;
  304. *p1 = *q1;
  305. *q1 = tmPoint;
  306. tmPoint = *q2;
  307. *p2 = *q2;
  308. *q2 = tmPoint;
  309. }
  310. if(p2->GetX() < q1->GetX() || p1->GetX() > q2->GetX())
  311. {
  312. pResult = 0;
  313. return;
  314. }
  315. else if(q1->GetX()>p1->GetX() && q1->GetX()<p2->GetX())
  316. {
  317. if(p2->GetX()>q1->GetX() && p2->GetX()<q2->GetX())
  318. {
  319. pResult->AddPoint(q1->GetX(),q1->GetY());
  320. pResult->AddPoint(p2->GetX(),p2->GetY());
  321. }
  322. else if(p2->GetX()>=q2->GetX())
  323. {
  324. pResult->AddPoint(q1->GetX(),q1->GetY());
  325. pResult->AddPoint(q2->GetX(),q2->GetY());
  326. }
  327. }
  328. else if(p2->GetX() == q1->GetX())
  329. {
  330. pResult->AddPoint(p2->GetX(),p2->GetY());
  331. }
  332. else if(*p1 == *q1 && *p2 == *q2)
  333. {
  334. pResult->AddPoint(p1->GetX(),p1->GetY());
  335. pResult->AddPoint(p2->GetX(),p2->GetY());
  336. }
  337. }
  338. delete q2;
  339. delete q1;
  340. delete p2;
  341. delete p1;
  342. }
  343. //弧度转换为度单位
  344. double CQGISAlgorithmLib::RadianToDegree(double fRadian)
  345. {
  346. return fRadian*PIunder180;
  347. }
  348. double CQGISAlgorithmLib::DegreeToRadian(double fDegree)
  349. {
  350. return fDegree*PIover180;
  351. }