QPointArray.cpp
资源名称:QGIS.rar [点击查看]
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:13k
源码类别:
GDI/图象编程
开发平台:
Visual C++
- // QPointArray.cpp: implementation of the CQPointArray class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "..stdafx.h"
- #include "..includeQPointArray.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CQPointArray::CQPointArray(int nSize)
- {
- // if(nSize == 0)
- // {
- // CQPoint * pPt = new CQPoint;
- // m_PtArray.Add(pPt);
- // }
- // else
- // {
- // for(int i=0;i<nSize;i++)
- // {
- // CQPoint * pPt = new CQPoint;
- // m_PtArray.Add(pPt);
- // }
- // }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::Copy(CQPointArray & ptArray)
- {
- if(&ptArray == this)
- return;
- int nSize = ptArray.GetSize();
- if(nSize == 0)return;
- else
- {
- DeleteAll();
- }
- for(int i=0;i<nSize;i++)
- {
- CQPoint * pPt = new CQPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
- m_PtArray.Add(pPt);
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPointArray::CQPointArray(CQPointArray & ptArray)
- {
- int nSize = ptArray.GetSize();
- if(nSize == 0)return;
- for(int i=0;i<nSize;i++)
- {
- CQPoint * pPt = new CQPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
- m_PtArray.Add(pPt);
- }
- }
- CQPointArray::~CQPointArray()
- {
- DeleteAll();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:XSort
- ///返回类型:无
- ///入口参数:int nSortType
- ///出口参数:无
- ///思路说明:冒泡排序nSortType == 0 升序 nSortType == 1降序
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::XSort(int nSortType)
- {
- int nSize = m_PtArray.GetSize();
- if(nSortType == 0) //升序
- {
- for(int i=0;i<nSize-1;i++)
- {
- for(int j=i+1;j<nSize;j++)
- {
- CQPoint pPt = *(m_PtArray[i]);
- if(m_PtArray[j]->GetX()<m_PtArray[i]->GetX())
- {
- *(m_PtArray[i]) = *(m_PtArray[j]);
- *(m_PtArray[j]) = pPt;
- }
- }
- }
- }
- else //降序
- {
- for(int i=0;i<nSize-1;i++)
- for(int j=i+1;j<nSize;j++)
- {
- CQPoint pPt = *(m_PtArray[i]);
- if(m_PtArray[j]->GetX()> m_PtArray[i]->GetX())
- {
- *(m_PtArray[i]) = *(m_PtArray[j]);
- *(m_PtArray[j]) = pPt;
- }
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:YSort
- ///返回类型:无
- ///入口参数:int nSortType
- ///出口参数:无
- ///思路说明:冒泡排序nSortType == 0 升序 nSortType == 1降序
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::YSort(int nSortType)
- {
- int nSize = m_PtArray.GetSize();
- if(nSortType == 0) // 升序
- {
- for(int i=0;i<nSize-1;i++)
- for(int j=i+1;j<nSize;j++)
- {
- CQPoint pPt = *(m_PtArray[i]);
- if(m_PtArray[j]->GetY() < m_PtArray[i]->GetY())
- {
- *m_PtArray[i] = *m_PtArray[j];
- *m_PtArray[j] = pPt;
- }
- }
- }
- else // 降序
- {
- for(int i=0;i<nSize-1;i++)
- for(int j=i+1;j<nSize;j++)
- {
- CQPoint pPt = *m_PtArray[i];
- if(m_PtArray[j]->GetY()>m_PtArray[i]->GetY())
- {
- *m_PtArray[i] = *m_PtArray[j];
- *m_PtArray[j] = pPt;
- }
- }
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::AddPoint(CQPoint * pPt)
- {
- if(pPt)
- {
- double dx = pPt->GetX(),dy = pPt->GetY();
- AddPoint(dx,dy);
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::AddPoint(double x,double y)
- {
- CQPoint * pPt = new CQPoint(x,y);
- m_PtArray.Add(pPt);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint * CQPointArray::RemoveAt(int nIndex)
- {
- if(nIndex<0 || nIndex>m_PtArray.GetSize())
- return 0;
- CQPoint * pPt = m_PtArray.GetAt(nIndex);
- m_PtArray.RemoveAt(nIndex);
- return pPt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::RemoveAll()
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0) return;
- for(int i=0;i<nSize;i++)
- {
- m_PtArray.RemoveAt(i);
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::DeleteAll()
- {
- int nSize = m_PtArray.GetSize();
- CQPoint * pPt = NULL;
- for(int i=0;i<nSize;i++)
- {
- pPt = m_PtArray.GetAt(i);
- if(pPt)
- delete pPt;
- }
- m_PtArray.RemoveAll();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::Delete(int nIndex)
- {
- if(nIndex<0 || nIndex>=m_PtArray.GetSize())return;
- CQPoint * ppt = 0;
- ppt = RemoveAt(nIndex);
- if(ppt != 0)
- delete ppt;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::InsertAt(int nIndex,CQPoint * pt)
- {
- if(nIndex<0 || !pt)return;
- m_PtArray.InsertAt(nIndex,pt);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::InsertAt(int nIndex,double x,double y)
- {
- if(nIndex<0) return;
- CQPoint * pPt = new CQPoint(x,y);
- m_PtArray.InsertAt(nIndex,pPt);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::InsertAfter(int nIndex,CQPoint * pt)
- {
- if(nIndex<=-1 || !pt)return;
- m_PtArray.InsertAt(nIndex+1,pt);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::InsertAfter(int nIndex,double x,double y)
- {
- if(nIndex<=-1)return;
- CQPoint * pPt = new CQPoint(x,y);
- m_PtArray.InsertAt(nIndex+1,pPt);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:MakeArrayInverse
- ///返回类型:CQPointArray
- ///入口参数:无
- ///出口参数:无
- ///思路说明:数组元素倒置
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPointArray CQPointArray::MakeArrayInverse()
- {
- int nSize = m_PtArray.GetSize();
- CQPointArray pa;
- for(int i=nSize-1;i>=0;i--)
- {
- pa.AddPoint(m_PtArray[i]->GetX(),m_PtArray[i]->GetY());
- }
- return pa;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::ArrayInverseCopy(CQPointArray & ptArray)
- {
- int nSize = ptArray.GetSize();
- if(nSize == 0) return;
- DeleteAll();
- for(int i=nSize-1;i>=0;i--)
- {
- AddPoint(ptArray.GetPoint(i)->GetX(),ptArray.GetPoint(i)->GetY());
- }
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint * CQPointArray::GetPoint(int nIndex)
- {
- if(nIndex<0 || nIndex>=m_PtArray.GetSize()) return NULL;
- return m_PtArray.GetAt(nIndex);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- CQPoint * CQPointArray::operator [](int nIndex)
- {
- if(nIndex<0 || nIndex>=m_PtArray.GetSize() || m_PtArray.GetSize() == 0) return NULL;
- return m_PtArray.GetAt(nIndex);
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- int CQPointArray::FindPtIndex(CQPoint & pt)
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0)return -1;
- for(int i=0;i<nSize;i++)
- {
- if(pt == *(m_PtArray[i]))
- return i;
- }
- return -1;
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- int CQPointArray::GetSize()
- {
- return m_PtArray.GetSize();
- }
- //////////////////////////////////////////
- ///***************CQGIS****************///
- ///函数名称:
- ///返回类型:
- ///入口参数:
- ///出口参数:
- ///思路说明:
- ///***************CQGIS****************///
- //////////////////////////////////////////
- void CQPointArray::GetBoundRect(CBoundaryRect * pRect)
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0) return;
- pRect->m_fMinX = m_PtArray[0]->GetX();
- pRect->m_fMinY = m_PtArray[0]->GetY();
- pRect->m_fMaxX = m_PtArray[0]->GetX();
- pRect->m_fMaxY = m_PtArray[0]->GetY();
- for(int i=1;i<nSize;i++)
- {
- pRect->m_fMinX = min(pRect->m_fMinX,m_PtArray[i]->GetX());
- pRect->m_fMinY = min(pRect->m_fMinY,m_PtArray[i]->GetY());
- pRect->m_fMaxX = max(pRect->m_fMaxX,m_PtArray[i]->GetX());
- pRect->m_fMaxY = max(pRect->m_fMaxY,m_PtArray[i]->GetY());
- }
- }
- void CQPointArray::Serialize(CArchive & ar)
- {
- if(ar.IsStoring()) // 存
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0)return;
- ar.Write(&nSize,sizeof(int));
- for(int i=0;i<nSize;i++)
- {
- CQPoint * ppt = 0;
- ppt = m_PtArray.GetAt(i);
- if(ppt == 0) continue;
- ppt->Serialize(ar);
- }
- }
- else
- {
- int nSize = 0;
- ar.Read(&nSize,(sizeof(int)));
- if(nSize == 0)return;
- for(int i=0;i<nSize;i++)
- {
- CQPoint * ppt = new CQPoint;
- ppt->Serialize(ar);
- m_PtArray.Add(ppt);
- }
- }
- }
- void CQPointArray::WritetoFile(CFile * pFile)
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0)return;
- pFile->Write(&nSize,sizeof(int));
- for(int i=0;i<nSize;i++)
- {
- CQPoint * ppt = 0;
- ppt = m_PtArray.GetAt(i);
- if(ppt == 0)continue;
- ppt->WriteToFile(pFile);
- }
- }
- void CQPointArray::ReadFromFile(CFile * pFile)
- {
- int nSize = 0;
- DeleteAll();
- pFile->Read(&nSize,sizeof(int));
- for(int i=0;i<nSize;i++)
- {
- CQPoint * ppt = new CQPoint;
- ppt->ReadFromFile(pFile);
- m_PtArray.Add(ppt);
- }
- }
- BOOL CQPointArray::ExchangePoint(int i,int j)
- {
- if(i<0 || i>=m_PtArray.GetSize() || j<0 || j>=m_PtArray.GetSize())
- return FALSE;
- CQPoint pt = *m_PtArray[i];
- *m_PtArray[i] = *m_PtArray[j];
- *m_PtArray[j] = pt;
- return TRUE;
- }
- CQPoint * CQPointArray::GetCenterPoint()
- {
- int nSize = m_PtArray.GetSize();
- if(nSize == 0)return NULL;
- if(nSize == 1)
- return m_PtArray[0];
- else if(nSize == 2) // 返回中点
- {
- double fx = (m_PtArray[0]->GetX() + m_PtArray[1]->GetX())/2;
- double fy = (m_PtArray[0]->GetY() + m_PtArray[1]->GetY())/2;
- return new CQPoint(fx,fy);
- }
- else
- {
- return m_PtArray[int(nSize/2)];
- }
- }