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

GDI/图象编程

开发平台:

Visual C++

  1. #include "..stdafx.h"
  2. #include "..includeResource.h"
  3. #include "..includeQBaseObj.h"
  4. #include "math.h"
  5. #ifdef _DEBUG
  6. #undef THIS_FILE
  7. static char THIS_FILE[]=__FILE__;
  8. #define new DEBUG_NEW
  9. #endif
  10. //CQPoint函数定义部分
  11. //////////////////////////////////////////////////////////////////////////
  12. //////////////////////////////////////////
  13. ///***************CQGIS****************///
  14. ///函数名称:CQPoint
  15. ///函数返回:无
  16. ///入口参数:无
  17. ///出口参数:无
  18. ///函数思路:构造函数
  19. ///***************CQGIS****************///
  20. //////////////////////////////////////////
  21. CQPoint::CQPoint()
  22. {
  23. m_fx = m_fy = 0.0;
  24. }
  25. //////////////////////////////////////////
  26. ///***************CQGIS****************///
  27. ///函数名称:CQPoint
  28. ///函数返回:无
  29. ///入口参数:double dx,double dy
  30. ///出口参数:无
  31. ///函数思路:重载构造函数
  32. ///***************CQGIS****************///
  33. //////////////////////////////////////////
  34. CQPoint::CQPoint(double dx,double dy)
  35. {
  36. m_fx = dx;
  37. m_fy = dy;
  38. }
  39. //////////////////////////////////////////
  40. ///***************CQGIS****************///
  41. ///函数名称:CQPoint
  42. ///函数返回:无
  43. ///入口参数:const CQPoint & pt
  44. ///出口参数:无
  45. ///函数思路:拷贝构造函数
  46. ///***************CQGIS****************///
  47. //////////////////////////////////////////
  48. CQPoint::CQPoint(const CQPoint & pt)
  49. {
  50. m_fx = pt.GetX();
  51. m_fy = pt.GetY();
  52. }
  53. //////////////////////////////////////////
  54. ///***************CQGIS****************///
  55. ///函数名称:GetX
  56. ///函数返回:double
  57. ///入口参数:无
  58. ///出口参数:double 
  59. ///函数思路:返回点的X坐标值
  60. ///***************CQGIS****************///
  61. //////////////////////////////////////////
  62. inline double CQPoint::GetX() const
  63. {
  64. return m_fx;
  65. }
  66. //////////////////////////////////////////
  67. ///***************CQGIS****************///
  68. ///函数名称:GetY
  69. ///函数返回:double
  70. ///入口参数:无
  71. ///出口参数:double
  72. ///函数思路:返回点的Y坐标值
  73. ///***************CQGIS****************///
  74. //////////////////////////////////////////
  75. inline double CQPoint::GetY() const
  76. {
  77. return m_fy;
  78. }
  79. //////////////////////////////////////////
  80. ///***************CQGIS****************///
  81. ///函数名称:Copy
  82. ///函数返回:无
  83. ///入口参数:CQPoint & pt
  84. ///出口参数:无
  85. ///函数思路:点位坐标的拷贝
  86. ///***************CQGIS****************///
  87. //////////////////////////////////////////
  88. void CQPoint::Copy(const CQPoint & pt)
  89. {
  90. m_fx = pt.GetX();
  91. m_fy = pt.GetY();
  92. }
  93. //////////////////////////////////////////
  94. ///***************CQGIS****************///
  95. ///函数名称:operator = 
  96. ///函数返回:CQPoint & pt
  97. ///入口参数: CQPoint & pt
  98. ///出口参数:
  99. ///函数思路:重载=运算符,对坐标对象进行赋值操作
  100. ///***************CQGIS****************///
  101. //////////////////////////////////////////
  102. CQPoint & CQPoint::operator = (CQPoint & pt)
  103. {
  104. m_fx = pt.GetX();
  105. m_fy = pt.GetY();
  106. return (*this);
  107. }
  108. //////////////////////////////////////////
  109. ///***************CQGIS****************///
  110. ///函数名称:operator == 
  111. ///函数返回:BOOL 
  112. ///入口参数:  CQPoint & pt
  113. ///出口参数:无
  114. ///函数思路:重载==运算符,判断两坐标是否相等
  115. ///***************CQGIS****************///
  116. //////////////////////////////////////////
  117. BOOL CQPoint::operator == (CQPoint & pt)
  118. {
  119. if(fabs(pt.GetX()-m_fx)<SMALL_NUMBER&&fabs(pt.GetY()-m_fy)<SMALL_NUMBER)
  120. return TRUE;
  121. else
  122. return FALSE;
  123. }
  124. //////////////////////////////////////////
  125. ///***************CQGIS****************///
  126. ///函数名称:operator == 
  127. ///函数返回:BOOL 
  128. ///入口参数:  CQPoint & pt
  129. ///出口参数:无
  130. ///函数思路:重载==运算符,判断两坐标是否相等
  131. ///***************CQGIS****************///
  132. //////////////////////////////////////////
  133. //BOOL CQPoint::operator == (CQPoint & pt1,CQPoint & pt2)
  134. //{
  135. // if(fabs(pt1.GetX()-pt2.GetX())<SMALL_NUMBER&&(pt1.GetY()-pt2.GetY())<SMALL_NUMBER)
  136. // return TRUE;
  137. // else
  138. // return FALSE;
  139. //}
  140. //////////////////////////////////////////
  141. ///***************CQGIS****************///
  142. ///函数名称:Distance
  143. ///函数返回:double
  144. ///入口参数: CQPoint & pt
  145. ///出口参数:无
  146. ///函数思路:两点之间的距离,对象的函数
  147. ///***************CQGIS****************///
  148. //////////////////////////////////////////
  149. double CQPoint::Distance(CQPoint & pt)
  150. {
  151. return sqrt((pt.GetX()-m_fx)*(pt.GetX()-m_fx)+(pt.GetY()-m_fy)*(pt.GetY()-m_fy));
  152. }
  153. //////////////////////////////////////////
  154. ///***************CQGIS****************///
  155. ///函数名称:Distance
  156. ///函数返回:double
  157. ///入口参数:double dx,double dy
  158. ///出口参数:无
  159. ///函数思路:两点之间的距离,对象的函数
  160. ///***************CQGIS****************///
  161. //////////////////////////////////////////
  162. double CQPoint::Distance(double dx,double dy)
  163. {
  164. return sqrt((m_fx-dx)*(m_fx-dx)+(m_fy-dy)*(m_fy-dy));
  165. }
  166. //////////////////////////////////////////
  167. ///***************CQGIS****************///
  168. ///函数名称:Distance
  169. ///函数返回:double
  170. ///入口参数:double x1,double y1,double x2,double y2
  171. ///出口参数:无
  172. ///函数思路:两点之间的距离,对象的函数
  173. ///***************CQGIS****************///
  174. //////////////////////////////////////////
  175. double CQPoint::Distance(double x1,double y1,double x2,double y2)
  176. {
  177. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  178. }
  179. //////////////////////////////////////////
  180. ///***************CQGIS****************///
  181. ///函数名称:Distance
  182. ///函数返回:double
  183. ///入口参数:CQPoint & pt,double xx,double yy
  184. ///出口参数:无
  185. ///函数思路:两点之间的距离,对象的函数
  186. ///***************CQGIS****************///
  187. //////////////////////////////////////////
  188. double CQPoint::Distance(CQPoint & pt,double xx,double yy)
  189. {
  190. return sqrt((pt.GetX()-xx)*(pt.GetX()-xx)+(pt.GetY()-yy)*(pt.GetY()-yy));
  191. }
  192. //////////////////////////////////////////
  193. ///***************CQGIS****************///
  194. ///函数名称:Distance
  195. ///函数返回:double
  196. ///入口参数:CQPoint & pt,double xx,double yy
  197. ///出口参数:无
  198. ///函数思路:点到直线的距离
  199. ///***************CQGIS****************///
  200. //////////////////////////////////////////
  201. double CQPoint::Distance(CQPoint & pt1,CQPoint & pt2)
  202. {
  203. double fArea = (pt1.GetY()-pt2.GetY())*m_fx + (pt2.GetX()-pt1.GetX())*m_fy + (pt1.GetX()*pt2.GetY()-pt2.GetX()*pt1.GetY());
  204. double fDis = sqrt((pt2.GetX()-pt1.GetX())*(pt2.GetX()-pt1.GetX())+(pt2.GetY()-pt1.GetY())*(pt2.GetY()-pt1.GetY()));
  205. return fArea/fDis;
  206. }
  207. //////////////////////////////////////////
  208. ///***************CQGIS****************///                ///////////////////////
  209. ///函数名称:Distance                                      ///       //        ///
  210. ///函数返回:double                                        ///       //?       ///
  211. ///入口参数:CQPoint & pt,CQPoint & pt1,CQPoint & pt2      ///       //        ///
  212. ///出口参数:无                                            ///////////////////////
  213. ///函数思路:点到直线的距离
  214. ///////////矢量矩形的面积等于底*高,高就是要求的点到直线的距离
  215. ///***************CQGIS****************///
  216. //////////////////////////////////////////
  217. double CQPoint::Distance(CQPoint & pt,CQPoint & pt1,CQPoint & pt2)
  218. {
  219. // 给出矢量坐标值
  220. double xW = pt.GetX() - pt1.GetX();
  221. double yW = pt.GetY() - pt1.GetY();
  222. double xV = pt2.GetX() - pt1.GetX();
  223. double yV = pt2.GetY() - pt1.GetY();
  224. // 先求出平行四边形的面积 VL * W
  225. double fArea = fabs(xW*yV - xV*yW);
  226. //计算出矢量(pt1,pt2)的距离
  227. double fdis = sqrt(xV*xV+yV*yV);
  228. return fArea/fdis;
  229. }
  230. //////////////////////////////////////////
  231. ///***************CQGIS****************///
  232. ///函数名称:PtInLine
  233. ///函数返回:BOOL
  234. ///入口参数:CQPoint & pt1,CQPoint & pt2
  235. ///出口参数:无
  236. ///函数思路:根据矢量叉积及快速排斥法判断点是否在直线上
  237. ////////////在直线上返回TRUE否则返回FALSE
  238. ///***************CQGIS****************///
  239. //////////////////////////////////////////
  240. BOOL CQPoint::PtInLine(CQPoint & pt1,CQPoint & pt2)
  241. {
  242. //进行快速排斥实验
  243. double fMinX = min(pt1.GetX(),pt2.GetX());
  244. double fMaxX = max(pt1.GetX(),pt2.GetX());
  245. double fMinY = min(pt1.GetY(),pt2.GetY());
  246. double fMaxY = max(pt1.GetY(),pt2.GetY());
  247. if(!(m_fx>=fMinX && m_fx<=fMaxX && m_fy>=fMinY && m_fy<=fMaxY))
  248. return FALSE;
  249. //进行矢量叉积运算
  250. //(p1,p) = (p-p1) = (x-x1,y-y1),(p1,p2) = (p2-p1) = (x2-x1,y2-y1)
  251. double xV1 = m_fx - pt1.GetX();
  252. double yV1 = m_fy - pt1.GetY();
  253. double xV2 = pt2.GetX() - pt1.GetX();
  254. double yV2 = pt2.GetY() - pt1.GetY();
  255. double fResult = xV1*yV2 - xV2*yV1;
  256. if(static_cast<double>(fabs(fResult)) <= 1.8)return TRUE;
  257. return FALSE;
  258. }
  259. //////////////////////////////////////////
  260. ///***************CQGIS****************///
  261. ///函数名称:PtInLine
  262. ///函数返回:BOOL
  263. ///入口参数:CQPoint & pt,CQPoint & pt1,CQPoint & pt2
  264. ///出口参数:无
  265. ///函数思路:
  266. ///***************CQGIS****************///
  267. //////////////////////////////////////////
  268. BOOL CQPoint::PtInLine(CQPoint & pt,CQPoint & pt1,CQPoint & pt2)
  269. {
  270. //进行快速排斥实验
  271. double fMinX = min(pt1.GetX(),pt2.GetX());
  272. double fMaxX = max(pt1.GetX(),pt2.GetX());
  273. double fMinY = min(pt1.GetY(),pt2.GetY());
  274. double fMaxY = max(pt1.GetY(),pt2.GetY());
  275. double fx = pt.GetX();
  276. double fy = pt.GetY();
  277. if(!(fx>=fMinX && fx<=fMaxX && fy>=fMinY && fy<=fMaxY))
  278. return FALSE;
  279. //进行矢量叉积运算
  280. //(p1,p) = (p-p1) = (x-x1,y-y1),(p1,p2) = (p2-p1) = (x2-x1,y2-y1)
  281. double xV1 = fx - pt1.GetX();
  282. double yV1 = fy - pt1.GetY();
  283. double xV2 = pt2.GetX() - pt1.GetX();
  284. double yV2 = pt2.GetY() - pt1.GetY();
  285. double fResult = xV1*yV2 - xV2*yV1;
  286. if(fResult == 0.0)return TRUE;
  287. return FALSE;
  288. }
  289. //////////////////////////////////////////
  290. ///***************CQGIS****************///
  291. ///函数名称:OrientationPtToPt
  292. ///函数返回:short
  293. ///入口参数: CQPoint & pt
  294. ///出口参数:无
  295. ///函数思路:两矢量点之间的方向关系 矢量叉积
  296. ///***************CQGIS****************///
  297. //////////////////////////////////////////
  298. short CQPoint::OrientationPtToPt(CQPoint & pt)
  299. {
  300. double fResult = m_fx*pt.GetX() - pt.GetY()*m_fy;
  301. if(fResult>0) return QGIS_RIGHT;
  302. else if(fResult<0) return QGIS_LEFT;
  303. else return QGIS_ONELINE;
  304. }
  305. //////////////////////////////////////////
  306. ///***************CQGIS****************///
  307. ///函数名称:OrientationPtToPt
  308. ///函数返回:short
  309. ///入口参数: CQPoint & pt1, CQPoint & pt2
  310. ///出口参数:无
  311. ///函数思路:两矢量点之间的方向关系 矢量叉积
  312. ///***************CQGIS****************///
  313. //////////////////////////////////////////
  314. short CQPoint::OrientationPtToPt(CQPoint & pt1,CQPoint & pt2)
  315. {
  316. double fResult = pt1.GetX()*pt2.GetY() - pt2.GetX()*pt1.GetY();
  317. if(fResult>0) return QGIS_LEFT;
  318. else if(fResult<0) return QGIS_RIGHT;
  319. else return QGIS_ONELINE;
  320. }
  321. //////////////////////////////////////////
  322. ///***************CQGIS****************///
  323. ///函数名称:SetPoint
  324. ///返回类型:无
  325. ///入口参数:double dx,double dy
  326. ///出口参数:无
  327. ///思路说明:设置点位坐标
  328. ///***************CQGIS****************///
  329. //////////////////////////////////////////
  330. void CQPoint::SetPoint(double dx,double dy)
  331. {
  332. m_fx = dx;
  333. m_fy = dy;
  334. }
  335. IMPLEMENT_SERIAL(CQPoint,CObject,1)
  336. void CQPoint::Serialize(CArchive& ar)
  337. {
  338. float fx,fy;
  339. if(ar.IsStoring())
  340. {
  341. fx = (float)m_fx;
  342. fy = (float)m_fy;
  343. ar.Write(&fx,sizeof(float));
  344. ar.Write(&fy,sizeof(float));
  345. }
  346. else
  347. {
  348. ar.Read(&fx,sizeof(float));
  349. ar.Read(&fy,sizeof(float));
  350. m_fx = fx;
  351. m_fy = fy;
  352. }
  353. }
  354. void CQPoint::WriteToFile(CFile * pfile)
  355. {
  356. float fx = (float)m_fx;
  357. float fy = (float)m_fy;
  358. pfile->Write(&fx,sizeof(float));
  359. pfile->Write(&fy,sizeof(float));
  360. }
  361. void CQPoint::ReadFromFile(CFile * pfile)
  362. {
  363. float fx,fy;
  364. pfile->Read(&fx,sizeof(float));
  365. pfile->Read(&fy,sizeof(float));
  366. m_fx = fx;
  367. m_fy = fy;
  368. }
  369. void CQPoint::Move(double dx,double dy)
  370. {
  371. m_fx += dx;
  372. m_fy += dy;
  373. }
  374. void CQPoint::SetX(double dx)
  375. {
  376. m_fx = dx;
  377. }
  378. void CQPoint::SetY(double dy)
  379. {
  380. m_fy = dy;
  381. }
  382. BOOL CQPoint::operator !=(CQPoint & pt)
  383. {
  384. if(pt.GetX()-m_fx!=0 && pt.GetY()-m_fy!=0)
  385. return TRUE;
  386. else
  387. return FALSE;
  388. }
  389. //返回X方向的坐标差
  390. double CQPoint::XAxisDistance(CQPoint & pt)
  391. {
  392. double dx = pt.GetX();
  393. return m_fx-dx;
  394. }
  395. double CQPoint::YAxisDistance(CQPoint & pt)
  396. {
  397. double dy = pt.GetY();
  398. return m_fy-dy;
  399. }