QPoint.cpp
资源名称:QGIS.rar [点击查看]
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:12k
源码类别:
GDI/图象编程
开发平台:
Visual C++
- #include "..stdafx.h"
- #include "..includeResource.h"
- #include "..includeQBaseObj.h"
- #include "math.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //CQPoint函数定义部分
- //////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:CQPoint
- ///函数返回:无
- ///入口参数:无
- ///出口参数:无
- ///函数思路:构造函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint::CQPoint()
- {
- m_fx = m_fy = 0.0;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:CQPoint
- ///函数返回:无
- ///入口参数:double dx,double dy
- ///出口参数:无
- ///函数思路:重载构造函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint::CQPoint(double dx,double dy)
- {
- m_fx = dx;
- m_fy = dy;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:CQPoint
- ///函数返回:无
- ///入口参数:const CQPoint & pt
- ///出口参数:无
- ///函数思路:拷贝构造函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint::CQPoint(const CQPoint & pt)
- {
- m_fx = pt.GetX();
- m_fy = pt.GetY();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetX
- ///函数返回:double
- ///入口参数:无
- ///出口参数:double
- ///函数思路:返回点的X坐标值
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline double CQPoint::GetX() const
- {
- return m_fx;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:GetY
- ///函数返回:double
- ///入口参数:无
- ///出口参数:double
- ///函数思路:返回点的Y坐标值
- ///***************CQGIS****************///
- //////////////////////////////////////////
- inline double CQPoint::GetY() const
- {
- return m_fy;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Copy
- ///函数返回:无
- ///入口参数:CQPoint & pt
- ///出口参数:无
- ///函数思路:点位坐标的拷贝
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPoint::Copy(const CQPoint & pt)
- {
- m_fx = pt.GetX();
- m_fy = pt.GetY();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:operator =
- ///函数返回:CQPoint & pt
- ///入口参数: CQPoint & pt
- ///出口参数:
- ///函数思路:重载=运算符,对坐标对象进行赋值操作
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint & CQPoint::operator = (CQPoint & pt)
- {
- m_fx = pt.GetX();
- m_fy = pt.GetY();
- return (*this);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:operator ==
- ///函数返回:BOOL
- ///入口参数: CQPoint & pt
- ///出口参数:无
- ///函数思路:重载==运算符,判断两坐标是否相等
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQPoint::operator == (CQPoint & pt)
- {
- if(fabs(pt.GetX()-m_fx)<SMALL_NUMBER&&fabs(pt.GetY()-m_fy)<SMALL_NUMBER)
- return TRUE;
- else
- return FALSE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:operator ==
- ///函数返回:BOOL
- ///入口参数: CQPoint & pt
- ///出口参数:无
- ///函数思路:重载==运算符,判断两坐标是否相等
- ///***************CQGIS****************///
- //////////////////////////////////////////
- //BOOL CQPoint::operator == (CQPoint & pt1,CQPoint & pt2)
- //{
- // if(fabs(pt1.GetX()-pt2.GetX())<SMALL_NUMBER&&(pt1.GetY()-pt2.GetY())<SMALL_NUMBER)
- // return TRUE;
- // else
- // return FALSE;
- //}
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Distance
- ///函数返回:double
- ///入口参数: CQPoint & pt
- ///出口参数:无
- ///函数思路:两点之间的距离,对象的函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(CQPoint & pt)
- {
- return sqrt((pt.GetX()-m_fx)*(pt.GetX()-m_fx)+(pt.GetY()-m_fy)*(pt.GetY()-m_fy));
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Distance
- ///函数返回:double
- ///入口参数:double dx,double dy
- ///出口参数:无
- ///函数思路:两点之间的距离,对象的函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(double dx,double dy)
- {
- return sqrt((m_fx-dx)*(m_fx-dx)+(m_fy-dy)*(m_fy-dy));
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Distance
- ///函数返回:double
- ///入口参数:double x1,double y1,double x2,double y2
- ///出口参数:无
- ///函数思路:两点之间的距离,对象的函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(double x1,double y1,double x2,double y2)
- {
- return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Distance
- ///函数返回:double
- ///入口参数:CQPoint & pt,double xx,double yy
- ///出口参数:无
- ///函数思路:两点之间的距离,对象的函数
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(CQPoint & pt,double xx,double yy)
- {
- return sqrt((pt.GetX()-xx)*(pt.GetX()-xx)+(pt.GetY()-yy)*(pt.GetY()-yy));
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:Distance
- ///函数返回:double
- ///入口参数:CQPoint & pt,double xx,double yy
- ///出口参数:无
- ///函数思路:点到直线的距离
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(CQPoint & pt1,CQPoint & pt2)
- {
- double fArea = (pt1.GetY()-pt2.GetY())*m_fx + (pt2.GetX()-pt1.GetX())*m_fy + (pt1.GetX()*pt2.GetY()-pt2.GetX()*pt1.GetY());
- double fDis = sqrt((pt2.GetX()-pt1.GetX())*(pt2.GetX()-pt1.GetX())+(pt2.GetY()-pt1.GetY())*(pt2.GetY()-pt1.GetY()));
- return fArea/fDis;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************/// ///////////////////////
- ///函数名称:Distance /// // ///
- ///函数返回:double /// //? ///
- ///入口参数:CQPoint & pt,CQPoint & pt1,CQPoint & pt2 /// // ///
- ///出口参数:无 ///////////////////////
- ///函数思路:点到直线的距离
- ///////////矢量矩形的面积等于底*高,高就是要求的点到直线的距离
- ///***************CQGIS****************///
- //////////////////////////////////////////
- double CQPoint::Distance(CQPoint & pt,CQPoint & pt1,CQPoint & pt2)
- {
- // 给出矢量坐标值
- double xW = pt.GetX() - pt1.GetX();
- double yW = pt.GetY() - pt1.GetY();
- double xV = pt2.GetX() - pt1.GetX();
- double yV = pt2.GetY() - pt1.GetY();
- // 先求出平行四边形的面积 VL * W
- double fArea = fabs(xW*yV - xV*yW);
- //计算出矢量(pt1,pt2)的距离
- double fdis = sqrt(xV*xV+yV*yV);
- return fArea/fdis;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:PtInLine
- ///函数返回:BOOL
- ///入口参数:CQPoint & pt1,CQPoint & pt2
- ///出口参数:无
- ///函数思路:根据矢量叉积及快速排斥法判断点是否在直线上
- ////////////在直线上返回TRUE否则返回FALSE
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQPoint::PtInLine(CQPoint & pt1,CQPoint & pt2)
- {
- //进行快速排斥实验
- double fMinX = min(pt1.GetX(),pt2.GetX());
- double fMaxX = max(pt1.GetX(),pt2.GetX());
- double fMinY = min(pt1.GetY(),pt2.GetY());
- double fMaxY = max(pt1.GetY(),pt2.GetY());
- if(!(m_fx>=fMinX && m_fx<=fMaxX && m_fy>=fMinY && m_fy<=fMaxY))
- return FALSE;
- //进行矢量叉积运算
- //(p1,p) = (p-p1) = (x-x1,y-y1),(p1,p2) = (p2-p1) = (x2-x1,y2-y1)
- double xV1 = m_fx - pt1.GetX();
- double yV1 = m_fy - pt1.GetY();
- double xV2 = pt2.GetX() - pt1.GetX();
- double yV2 = pt2.GetY() - pt1.GetY();
- double fResult = xV1*yV2 - xV2*yV1;
- if(static_cast<double>(fabs(fResult)) <= 1.8)return TRUE;
- return FALSE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:PtInLine
- ///函数返回:BOOL
- ///入口参数:CQPoint & pt,CQPoint & pt1,CQPoint & pt2
- ///出口参数:无
- ///函数思路:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- BOOL CQPoint::PtInLine(CQPoint & pt,CQPoint & pt1,CQPoint & pt2)
- {
- //进行快速排斥实验
- double fMinX = min(pt1.GetX(),pt2.GetX());
- double fMaxX = max(pt1.GetX(),pt2.GetX());
- double fMinY = min(pt1.GetY(),pt2.GetY());
- double fMaxY = max(pt1.GetY(),pt2.GetY());
- double fx = pt.GetX();
- double fy = pt.GetY();
- if(!(fx>=fMinX && fx<=fMaxX && fy>=fMinY && fy<=fMaxY))
- return FALSE;
- //进行矢量叉积运算
- //(p1,p) = (p-p1) = (x-x1,y-y1),(p1,p2) = (p2-p1) = (x2-x1,y2-y1)
- double xV1 = fx - pt1.GetX();
- double yV1 = fy - pt1.GetY();
- double xV2 = pt2.GetX() - pt1.GetX();
- double yV2 = pt2.GetY() - pt1.GetY();
- double fResult = xV1*yV2 - xV2*yV1;
- if(fResult == 0.0)return TRUE;
- return FALSE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:OrientationPtToPt
- ///函数返回:short
- ///入口参数: CQPoint & pt
- ///出口参数:无
- ///函数思路:两矢量点之间的方向关系 矢量叉积
- ///***************CQGIS****************///
- //////////////////////////////////////////
- short CQPoint::OrientationPtToPt(CQPoint & pt)
- {
- double fResult = m_fx*pt.GetX() - pt.GetY()*m_fy;
- if(fResult>0) return QGIS_RIGHT;
- else if(fResult<0) return QGIS_LEFT;
- else return QGIS_ONELINE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:OrientationPtToPt
- ///函数返回:short
- ///入口参数: CQPoint & pt1, CQPoint & pt2
- ///出口参数:无
- ///函数思路:两矢量点之间的方向关系 矢量叉积
- ///***************CQGIS****************///
- //////////////////////////////////////////
- short CQPoint::OrientationPtToPt(CQPoint & pt1,CQPoint & pt2)
- {
- double fResult = pt1.GetX()*pt2.GetY() - pt2.GetX()*pt1.GetY();
- if(fResult>0) return QGIS_LEFT;
- else if(fResult<0) return QGIS_RIGHT;
- else return QGIS_ONELINE;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:SetPoint
- ///返回类型:无
- ///入口参数:double dx,double dy
- ///出口参数:无
- ///思路说明:设置点位坐标
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPoint::SetPoint(double dx,double dy)
- {
- m_fx = dx;
- m_fy = dy;
- }
- IMPLEMENT_SERIAL(CQPoint,CObject,1)
- void CQPoint::Serialize(CArchive& ar)
- {
- float fx,fy;
- if(ar.IsStoring())
- {
- fx = (float)m_fx;
- fy = (float)m_fy;
- ar.Write(&fx,sizeof(float));
- ar.Write(&fy,sizeof(float));
- }
- else
- {
- ar.Read(&fx,sizeof(float));
- ar.Read(&fy,sizeof(float));
- m_fx = fx;
- m_fy = fy;
- }
- }
- void CQPoint::WriteToFile(CFile * pfile)
- {
- float fx = (float)m_fx;
- float fy = (float)m_fy;
- pfile->Write(&fx,sizeof(float));
- pfile->Write(&fy,sizeof(float));
- }
- void CQPoint::ReadFromFile(CFile * pfile)
- {
- float fx,fy;
- pfile->Read(&fx,sizeof(float));
- pfile->Read(&fy,sizeof(float));
- m_fx = fx;
- m_fy = fy;
- }
- void CQPoint::Move(double dx,double dy)
- {
- m_fx += dx;
- m_fy += dy;
- }
- void CQPoint::SetX(double dx)
- {
- m_fx = dx;
- }
- void CQPoint::SetY(double dy)
- {
- m_fy = dy;
- }
- BOOL CQPoint::operator !=(CQPoint & pt)
- {
- if(pt.GetX()-m_fx!=0 && pt.GetY()-m_fy!=0)
- return TRUE;
- else
- return FALSE;
- }
- //返回X方向的坐标差
- double CQPoint::XAxisDistance(CQPoint & pt)
- {
- double dx = pt.GetX();
- return m_fx-dx;
- }
- double CQPoint::YAxisDistance(CQPoint & pt)
- {
- double dy = pt.GetY();
- return m_fy-dy;
- }