?? mappolygon.cpp
字號(hào):
#include "stdafx.h"
#include "global.h"
#include "MapPolygon.h"
IMPLEMENT_DYNAMIC(CMapPolygon,CObject)
CMapPolygon::CMapPolygon()
{
}
CMapPolygon::CMapPolygon(CMapPolygon& mappolygon )
{
int i,iCount;
CMapParts *pParts;
iCount = m_Polygon.GetSize() - 1;
for ( i = 0 ; i <= iCount ; i++ )
{
pParts = new CMapParts(*mappolygon.GetParts(i));
m_Polygon.Add(pParts);
}
}
CMapPolygon::~CMapPolygon()
{
Clear();
}
long CMapPolygon::GetCount()
{
return m_Polygon.GetSize();
}
CMapRectangle CMapPolygon::GetExtent()
{
return m_Extent;
}
void CMapPolygon::SetExtent(CMapRectangle& extent)
{
m_Extent.SetLeft( extent.GetLeft());
m_Extent.SetRight( extent.GetRight());
m_Extent.SetTop(extent.GetTop());
m_Extent.SetBottom(extent.GetBottom());
}
CMapParts* CMapPolygon::GetParts(long lIndex)
{
int iCount;
CMapParts *pParts;
iCount = m_Polygon.GetSize()-1;
if ( lIndex < 0 || lIndex > iCount )
return NULL;
pParts = m_Polygon.GetAt(lIndex);
return pParts;
}
double CMapPolygon::GetArea()
{
return 0;
}
void CMapPolygon::Add(CMapParts* pParts)
{
if ( pParts == NULL )
return;
m_Polygon.Add( pParts );
}
void CMapPolygon::Set(long lIndex , CMapParts* pParts)
{
int iCount;
CMapParts *pOldParts;
if ( pParts == NULL )
return;
iCount = m_Polygon.GetSize()-1;
if ( lIndex < 0 || lIndex > iCount )
return ;
pOldParts = m_Polygon.GetAt( lIndex );
m_Polygon.SetAt(lIndex,pParts);
delete pOldParts;
}
void CMapPolygon::Remove(long lIndex)
{
int iCount;
CMapParts *pParts;
iCount = m_Polygon.GetSize()-1;
if ( lIndex < 0 || lIndex > iCount )
return ;
pParts = m_Polygon.GetAt( lIndex );
m_Polygon.RemoveAt(lIndex,1);
delete pParts;
}
void CMapPolygon::Insert(long lIndex , CMapParts* pParts)
{
int iCount;
iCount = m_Polygon.GetSize()-1;
if ( lIndex < 0 || lIndex > iCount )
return ;
m_Polygon.InsertAt(lIndex,pParts);
}
void CMapPolygon::Clear()
{
int i,iCount;
CMapParts *pParts;
iCount = m_Polygon.GetSize() - 1;
for ( i = iCount ; i >= 0 ; i-- )
{
pParts = m_Polygon.GetAt(i);
delete pParts;
}
m_Polygon.RemoveAll();
}
/*************************************************
描述: 判斷點(diǎn)是否在多邊形內(nèi)
輸入: 點(diǎn)對(duì)象
輸出: 在返回TRUE 不在返回FALSE
*************************************************/
BOOL CMapPolygon::IsPointIn(CMapPoint& pt )
{
int i,j,k,iNumber;
double dblTemp;
CMapParts* pParts;
CMapPoints* pPoints;
CMapPoint *ptFirst,*ptSecond;
CMapPoint ptInfint;
iNumber = 0;
//不在矩形范圍內(nèi)直接返回
if ( !m_Extent.IsPointIn(pt) )
return FALSE;
//做一條通過(guò)pt點(diǎn)的射線
dblTemp = pt.GetY();
ptInfint.SetY( dblTemp );
dblTemp = infinity;
ptInfint.SetX(dblTemp);
//獲得復(fù)合多邊形的每一個(gè)多邊形
for ( i = 0 ; i < m_Polygon.GetSize() ; i++ )
{
pParts = (CMapParts*)m_Polygon.GetAt(i);
//獲得一個(gè)多邊形的點(diǎn)集合
for ( j = 0 ; j < pParts->GetCount() ; j++ )
{
pPoints = (CMapPoints*)pParts->Get(j);
//獲得每個(gè)點(diǎn)集合的頂點(diǎn)坐標(biāo)
for ( k = 0 ; k < pPoints->GetCount() - 1 ; k++ )
{
ptFirst = (CMapPoint*)pPoints->Get(k);
ptSecond = (CMapPoint*)pPoints->Get(k+1);
if (pt.IsPointInLine(*ptFirst,*ptSecond) )
return TRUE; //該點(diǎn)在多邊形邊上
if ( ptSecond->GetY() == ptFirst->GetY() )
continue; //略過(guò)水平邊
if ( ptFirst->IsPointInLine( pt , ptInfint ))
{
//邊與射線相交于邊第一個(gè)頂點(diǎn)
if ( ptFirst->GetY() > ptSecond->GetY() )
iNumber++;
}
else if( ptSecond->IsPointInLine( pt , ptInfint ))
{
//邊與射線相交于邊的第二個(gè)頂點(diǎn)
if ( ptFirst->GetY() > ptSecond->GetY() )
iNumber++;
} //判斷是否有公共交點(diǎn)
else if ( isIntersect(pt,ptInfint,*ptFirst,*ptSecond) )
iNumber++ ;
}
}
}
if ( iNumber % 2 )
return TRUE;
else
return FALSE;
}
/*****************************************************************************
描述: 判斷兩條直線是否相交 且交點(diǎn)不是頂點(diǎn)
參數(shù): p1 --- 線段起點(diǎn) p2 ---線段終點(diǎn) p3 --- 線段起點(diǎn) p4 --- 線段終點(diǎn)
返回值 在直線上 返回TRUE 否則返回FALSE
******************************************************************************/
BOOL CMapPolygon::isIntersect(CMapPoint& p1 , CMapPoint& p2 , CMapPoint& p3 , CMapPoint& p4 )
{
double dblMulti,dblTmp1,dblTmp2;
//頂點(diǎn)相交
if ( p1.IsEqual(p3) || p1.IsEqual(p4) || p2.IsEqual(p3) || p2.IsEqual(p4) )
return FALSE;
//判斷兩條線段外接矩形是否相交
if ( min(p1.GetX(),p2.GetX()) > max(p3.GetX(),p4.GetX()) || max(p1.GetX(),p2.GetX())
< min(p3.GetX(),p4.GetX()) || min(p1.GetY(),p2.GetY()) > max(p3.GetY(),p4.GetY())
|| max(p1.GetY(),p2.GetY()) < min(p3.GetY(),p4.GetY()))
return FALSE;
//計(jì)算叉積
dblTmp1 = (double)((p1.GetX() - p3.GetX())*(p4.GetY()-p3.GetY()) - (p4.GetX()-p3.GetX())*(p1.GetY() - p3.GetY()));
dblTmp2 = (double)((p4.GetX() -p3.GetX())*(p2.GetY() - p3.GetY()) - (p2.GetX()-p3.GetX())*(p4.GetY()-p3.GetY())); ;
dblMulti = dblTmp1 * dblTmp2;
if ( dblMulti >= 0 )
return TRUE;
else
return FALSE;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -