有关路径搜索的一个算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

有关路径搜索的一个算法

由各个直线组成的路网,求一点到另一点的所有路径:

FindRateWay.h文件代码如下:

#include

#include

#include

#include "GELNSG3D.h"

typedef std::vector vecLineSeg;

//死胡同点记录

struct DeadList

{

AcGePoint3d ptOri; //参照点

AcGePoint3dArray ptDeadAry; //死胡同点(即从参照点出发的不能走的下一点)

};

typedef std::vector vecDeadPt;

class CFindRateWay

{

public:

CFindRateWay(std::list& lstRate,AcGePoint3d ptStart,AcGePoint3d ptEnd); virtual ~CFindRateWay();

//寻找所有路径(排除回路),没找到返回FALSE

BOOL FindWay(std::vector& vecWay);

private:

//检查路径点是否可继续向下走,如果可走则返回TRUE并返回一个可走的邻接点ptNext BOOL IsValid(AcGePoint3d pt, std::stack& staRatePt,std::vector& vecWay, IN vecDeadPt& vecDead, OUT AcGePoint3d& ptNext);

//查找某点的所有邻接点

void FindPtNear(AcGePoint3d pt,AcGePoint3dArray& PtAry);

//从栈中寻找指定点,找到返回TRUE

BOOL FindPtFromStack(AcGePoint3d pt, IN std::stack& staPt);

//通过栈中轨迹记录到路径组中

void SaveRate(std::stack& staPt,std::vector& vecWay);

//通过两点从m_lstRate中获得AcGeLineSeg3d

BOOL FindLineSegFromList(AcGePoint3d pt1, AcGePoint3d pt2, AcGeLineSeg3d& Line);

//将栈中点记录到点数组中

void SaveStaPt2PtAry(std::stack& staPt,AcGePoint3dArray& ptAry);

//判断从起点到pt整个路径是否已经属于成功路径结果的一部分,条件:pt不在栈中BOOL IsPartOfSuccRate(AcGePoint3d pt, std::stack& staRatePt, std::vector& vecWay);

//判断一个点pt1是否为另一个点pt2的死胡同点

BOOL IsDeadPt(AcGePoint3d pt1, AcGePoint3d pt2,IN vecDeadPt& vecDead);

std::list m_lstRate;

AcGePoint3d m_ptStart; //出发点

AcGePoint3d m_ptEnd; //目的点

};

------------------------------------------------------------

FindRateWay.cpp文件代码如下:

// FindRateWay.cpp: implementation of the CFindRateWay class.

//

//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "resource.h"

#include "FindRateWay.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CFindRateWay::CFindRateWay(std::list& lstRate,AcGePoint3d

ptStart,AcGePoint3d ptEnd)

{

m_lstRate = lstRate;

m_ptStart = ptStart;

m_ptEnd = ptEnd;

}

CFindRateWay::~CFindRateWay()

{

}

//寻找所有路径(排除回路),没找到返回FALSE

BOOL CFindRateWay::FindWay(std::vector& vecWay) {

//排除出发点和目标点相同的情况

if (m_ptStart.isEqualTo(m_ptEnd))

return FALSE;

//从起点出发

AcGePoint3d ptCur = m_ptStart;

vecDeadPt vecDead;

std::stack staPt;

do

{

if (ptCur.isEqualTo(m_ptEnd))

{

//找到一条通路,记下所有路径

SaveRate(staPt, vecWay);

//清除死胡同点组

vecDead.clear();

//回退当前点

ptCur = staPt.top();

staPt.pop();

}

AcGePoint3d ptNext;

if (IsValid(ptCur,staPt,vecWay,vecDead,ptNext))

{

staPt.push(ptCur);

ptCur = ptNext;

}

else

{

//当前点不能继续往下走,回退

相关文档
最新文档