有关路径搜索的一个算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有关路径搜索的一个算法
由各个直线组成的路网,求一点到另一点的所有路径:
FindRateWay.h文件代码如下:
#include
#include
#include
#include "GELNSG3D.h"
typedef std::vector
//死胡同点记录
struct DeadList
{
AcGePoint3d ptOri; //参照点
AcGePoint3dArray ptDeadAry; //死胡同点(即从参照点出发的不能走的下一点)
};
typedef std::vector
class CFindRateWay
{
public:
CFindRateWay(std::list
//寻找所有路径(排除回路),没找到返回FALSE
BOOL FindWay(std::vector
private:
//检查路径点是否可继续向下走,如果可走则返回TRUE并返回一个可走的邻接点ptNext BOOL IsValid(AcGePoint3d pt, std::stack
//查找某点的所有邻接点
void FindPtNear(AcGePoint3d pt,AcGePoint3dArray& PtAry);
//从栈中寻找指定点,找到返回TRUE
BOOL FindPtFromStack(AcGePoint3d pt, IN std::stack
//通过栈中轨迹记录到路径组中
void SaveRate(std::stack
//通过两点从m_lstRate中获得AcGeLineSeg3d
BOOL FindLineSegFromList(AcGePoint3d pt1, AcGePoint3d pt2, AcGeLineSeg3d& Line);
//将栈中点记录到点数组中
void SaveStaPt2PtAry(std::stack
//判断从起点到pt整个路径是否已经属于成功路径结果的一部分,条件:pt不在栈中BOOL IsPartOfSuccRate(AcGePoint3d pt, std::stack
//判断一个点pt1是否为另一个点pt2的死胡同点
BOOL IsDeadPt(AcGePoint3d pt1, AcGePoint3d pt2,IN vecDeadPt& vecDead);
std::list
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
ptStart,AcGePoint3d ptEnd)
{
m_lstRate = lstRate;
m_ptStart = ptStart;
m_ptEnd = ptEnd;
}
CFindRateWay::~CFindRateWay()
{
}
//寻找所有路径(排除回路),没找到返回FALSE
BOOL CFindRateWay::FindWay(std::vector
//排除出发点和目标点相同的情况
if (m_ptStart.isEqualTo(m_ptEnd))
return FALSE;
//从起点出发
AcGePoint3d ptCur = m_ptStart;
vecDeadPt vecDead;
std::stack
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
{
//当前点不能继续往下走,回退