Files
envi-code/SourceCode/Code2026/tg_shs/shs_siteplan/FilroadConnectGroup.cpp
T
2026-09-28 15:28:50 +08:00

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;
}
}