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