?? netlayer.h
字號:
#pragma once
#include "MoMapLayer.h"
//-----------------------------------------------------------------------------------------
// 定義網絡上的一節點
class NetPoint
{
public:
double x; // X坐標
double y; // Y坐標
public:
NetPoint()
{
x = 0;
y = 0;
}
NetPoint( double X, double Y)
{
x = X;
y = Y;
}
};
//-----------------------------------------------------------------------------------------
// 定義網絡上的一條線
class NetLine
{
// 屬性
public :
CList<NetPoint, NetPoint&> m_pCoords; // 線段包含的節點的坐標
private:
CMoMapLayer m_layer; // 圖層對象
// 構造函數
public:
NetLine(CMoMapLayer layer);
~NetLine();
// 計算線的幾何長度
double CalcLength();
// 通過線的id得到線數據
BOOL GetLineData(int id);
// 得到距離某點最近的線段,返回該線段的id
int GetNearestLineData( double x, double y);
// 判斷兩點是否重合
BOOL IsPtCoincide( NetPoint ptFirst, NetPoint ptSecond );
// 得到最鄰近的點
void GetNearestPoint(NetPoint ptP, NetPoint ptA, NetPoint ptB,
NetPoint* ptNearest, double* dDistance );
void GetNearestPoint(NetPoint point, NetPoint* ptNearestPoint,
int* nSegmentIndex, double* dLeastDistance);
// 獲得根據給定點分裂線得到的兩個部分的比例
BOOL GetSplitRatioByNearestPoint(NetPoint point, NetPoint* ptNearest,
double* dRatio );
};
//-----------------------------------------------------------------------------------------
// 定義網絡上的一條邊
class NetEdge
{
public:
int nLink; // 連接的弧段索引(數組下標索引)
float fAngle; // 水平夾角
public:
NetEdge()
{
nLink = -1;
fAngle = 0;
}
};
//-----------------------------------------------------------------------------------------
// 定義網絡上的一節點,包含了與該節點相連的弧段信息
class NetNode : public NetPoint
{
public:
// 與該點連接的弧段數組, 弧段按角度排序
CList<NetEdge, NetEdge&> m_arrLinks;
public:
NetNode()
{
x = 0;
y = 0;
}
NetNode(double X, double Y)
{
x = X;
y = Y;
}
void operator=(const NetNode& netNode)
{
x = netNode.x;
y = netNode.y;
for(int i=0; i<netNode.m_arrLinks.GetCount(); i++)
{
NetEdge neg = netNode.m_arrLinks.GetAt(
netNode.m_arrLinks.FindIndex(i));
m_arrLinks.AddTail(neg);
}
}
// 加入一個連接的弧段(調用前需確定弧段是連接在該點上的)
BOOL Add( int nLink, double dAngle );
// 刪除一個已連接的弧段
BOOL Remove( int nLink );
// 得到一個連接弧段的角度
double GetLinkAngle( int nLink );
};
//-----------------------------------------------------------------------------------------
// 網絡弧段(鏈)類
class NetLink
{
public:
int m_GeoID; // 弧段ID(GeoID)
int m_nFNode; // 起始結點(數組下標索引)
int m_nTNode; // 終止結點(數組下標索引)
double m_fLength; // 長度
double m_fFromImp; // 正向阻力(阻力系數*長度 或 (1+阻力系數)*長度)
double m_fToImp; // 逆向阻力
public:
NetLink();
void Copy( NetLink link ); // 拷貝操作
BOOL IsEqual( NetLink link ); // 判斷是否相等
};
//-----------------------------------------------------------------------------------------
// 用于分裂操作的結構
struct NetLinkSeg
{
int nSegID; // 分裂點后面的部分的弧段索引(數組下標索引)
double dRatio; // 分裂點前面的到起始結點部分的比例
};
//-----------------------------------------------------------------------------------------
// 用于備份弧段的類
class NetLinkBackup
{
public:
int m_nIndex; // 弧段的索引
NetLink m_Link; // 備份的弧段對象
CList<NetLinkSeg, NetLinkSeg&> m_arrSegs; // 該弧段被多次分割的比例列表
public:
NetLinkBackup()
{
m_nIndex = -1;
}
void operator=(const NetLinkBackup& netLink)
{
m_nIndex = netLink.m_nIndex;
m_Link = netLink.m_Link;
for(int i=0; i<netLink.m_arrSegs.GetCount(); i++)
{
NetLinkSeg nLS = netLink.m_arrSegs.GetAt(
netLink.m_arrSegs.FindIndex(i));
m_arrSegs.AddTail(nLS);
}
}
BOOL Add( int nSeg, double dRatio );
};
//-----------------------------------------------------------------------------------------
// 定義網絡上的一條路徑
class NetPath
{
public:
double m_dLength; // 該點到給定點的最短路徑長度, -1表示不連通
int m_nPreNode; // 該點在該路徑上的前趨結點
public:
NetPath()
{
m_dLength = -1;
m_nPreNode = -1;
}
};
//-----------------------------------------------------------------------------------------
class CNetLayer
{
private:
CList<NetLink, NetLink&> m_arrLinks; // 弧段表
CList<NetNode, NetNode&> m_arrNodes; // 節點表
CList<NetLinkBackup, NetLinkBackup&> m_arrLinkBackups; // 弧段備份表
int m_nLinkNum; // 原始弧段數目(網絡拓撲建立完成后)
int m_nNodeNum; // 原始結點數目(網絡拓撲建立完成后)
NetPath* m_pPath; // 某一個點到所有點的最短路徑
CMoMapLayer m_layer; // 圖層對象
public:
CNetLayer(CMoMapLayer layer);
~CNetLayer(void);
BOOL ReadNetTable();
BOOL PathAnalysis(double x1, double y1, double x2, double y2, CList<double, double&>* path );
BOOL LoadStops(CList<NetPoint, NetPoint&>* pPoints, CList<int, int&>* pNodes);
BOOL UpdateLinkNodeTable( int nLineID, NetPoint ptNearest, double dRatio, int* nNewNode );
int GetNode(int nLineID, int* nFNode, int* nTNode );
double Path(int nBeginNode, int nEndNode, CList<int, int&>* pNodes, BOOL bWeight);
BOOL CalcPath( int nNode, int nEndNode , BOOL bWeight );
double GetConnectedDistance( int nNode1, int nNode2, BOOL bWeight );
BOOL CreateResultPath(CList<int, int&>* pNodes, NetLine* line, BOOL bWeight);
int IsConnectedDirectly(int nNode1, int nNode2, int* nLink, double* dDistance, BOOL bWeight);
BOOL UnloadStops();
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -