161 lines
3.4 KiB
C++
161 lines
3.4 KiB
C++
#include "stdafx.h"
|
|
#include "commonRoad.h"
|
|
#include "FilroadConnectGroup.h"
|
|
|
|
|
|
double CFilroadConnectGroup::m_dDis = 0.0;
|
|
CFilroadConnectGroup::CFilroadConnectGroup(void)
|
|
{
|
|
}
|
|
|
|
CFilroadConnectGroup::CFilroadConnectGroup(CFilroadConnect *pConnect, BOOL bMid)
|
|
{
|
|
ASSERT(pConnect != NULL);
|
|
|
|
if (bMid)
|
|
m_arMidConnect.append(pConnect);
|
|
else
|
|
m_arConnect.append(pConnect);
|
|
}
|
|
|
|
CFilroadConnectGroup::~CFilroadConnectGroup(void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
// 添加一个connect到组内。
|
|
void CFilroadConnectGroup::AddConnect(CFilroadConnect *pConnect)
|
|
{
|
|
ASSERT(pConnect != NULL);
|
|
m_arConnect.append(pConnect);
|
|
}
|
|
|
|
// 合并另一个组connect到组内。
|
|
void CFilroadConnectGroup::AddGroup(CFilroadConnectGroup &otherGroup)
|
|
{
|
|
m_arConnect.append(otherGroup.m_arConnect);
|
|
m_arMidConnect.append(otherGroup.m_arMidConnect);
|
|
}
|
|
|
|
// 检测一个点是否能够添加到组内。
|
|
BOOL CFilroadConnectGroup::CheckAConnect(CFilroadConnect *pConnect)
|
|
{
|
|
for (int i = 0; i < (int)m_arConnect.length(); i++)
|
|
{
|
|
if (m_arConnect[i]->DistanceTo(*pConnect) < DisLimit())
|
|
break;
|
|
}
|
|
|
|
if (i < (int)m_arConnect.length())
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CFilroadConnectGroup::Draw(double dRaidus, AcAryCircArc2d &arEdgeArc, AcAryCircArc2d &arMidArc)
|
|
{
|
|
BOOL bSameCenter = FALSE;
|
|
BOOL bSameCenterMid = FALSE;
|
|
AcGeCircArc2d cirArcDump;
|
|
BOOL bRet = TRUE;
|
|
|
|
CFilroadConnect *pConnectIn, *pConnectOut;
|
|
if (TestCornerRoad(pConnectOut, pConnectIn))
|
|
{ //
|
|
bSameCenter = TRUE;
|
|
|
|
if (pConnectOut->Filroad(*pConnectIn, dRaidus, cirArcDump))
|
|
arEdgeArc.append(cirArcDump);
|
|
else
|
|
bRet = FALSE;
|
|
if (pConnectIn->Filroad(dRaidus, cirArcDump))
|
|
arEdgeArc.append(cirArcDump);
|
|
else
|
|
bRet = FALSE;
|
|
|
|
if (m_arMidConnect.length() == 1)
|
|
{ // 只有一个中心线
|
|
bSameCenterMid = TRUE;
|
|
if (m_arMidConnect[0]->Filroad(*pConnectIn, dRaidus, cirArcDump))
|
|
arMidArc.append(cirArcDump);
|
|
else
|
|
bRet = FALSE;
|
|
}
|
|
else
|
|
{
|
|
bSameCenterMid = FALSE;
|
|
}
|
|
}
|
|
|
|
if (!bSameCenter)
|
|
{
|
|
for (int i = 0; i < (int)m_arConnect.length(); i++)
|
|
{
|
|
if (m_arConnect[i]->Filroad(dRaidus, cirArcDump))
|
|
arEdgeArc.append(cirArcDump);
|
|
else
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
|
|
if (!bSameCenterMid)
|
|
{
|
|
for (int i = 0; i < (int)m_arMidConnect.length(); i++)
|
|
{
|
|
if (m_arMidConnect[i]->Filroad(dRaidus, cirArcDump))
|
|
arMidArc.append(cirArcDump);
|
|
else
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
// 检测某connect是否是拐角道路的中线。
|
|
// 如果该group不是拐角,直接返回false;
|
|
BOOL CFilroadConnectGroup::CheckInsideMidConnect(CFilroadConnect *pConnect)
|
|
{
|
|
CFilroadConnect *pConnectIn, *pConnectOut;
|
|
if (!TestCornerRoad(pConnectOut, pConnectIn))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if ((pConnect->CornerTo(*pConnectOut) == CFilroadConnect::eInCorner) &&
|
|
(pConnect->CornerTo(*pConnectIn) == CFilroadConnect::eOutCorner))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
// 添加一个中线connect到组内。
|
|
void CFilroadConnectGroup::AddMidConnect(CFilroadConnect *pConnect)
|
|
{
|
|
m_arMidConnect.append(pConnect);
|
|
}
|
|
|
|
|
|
BOOL CFilroadConnectGroup::TestCornerRoad(CFilroadConnect *&pConnectOut, CFilroadConnect *& pConnectIn) const
|
|
{
|
|
if (m_arConnect.length() != 2)
|
|
return FALSE;
|
|
|
|
CFilroadConnect *pConnect1 = m_arConnect[0];
|
|
CFilroadConnect *pConnect2 = m_arConnect[1];
|
|
|
|
CFilroadConnect::ECornerRelation eCorner = pConnect1->CornerTo(*pConnect2);
|
|
if (eCorner == CFilroadConnect::eOther)
|
|
return FALSE;
|
|
else
|
|
{
|
|
if (eCorner == CFilroadConnect::eInCorner)
|
|
SWAP(pConnect1, pConnect2);
|
|
|
|
pConnectOut = pConnect1;
|
|
pConnectIn = pConnect2;
|
|
|
|
return TRUE;
|
|
}
|
|
} |