亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bestfirst.cpp

?? 路徑探索算法
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// BestFirst.cpp: implementation of the BestFirst class.
//
//////////////////////////////////////////////////////////////////////

/*
BestFirst using heaps. 

  Creating using A* heap v3.
  
*/
#include "stdafx.h"
#include "BestFirst.h"

#include "math.h" //sqrt
#include "stdio.h" //for sprintf

//#pragma optimize( "yawgt", on )

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

BestFirst::BestFirst()
{
	vSetup=NULL;
	airoute=NULL;
}

BestFirst::BestFirst(Setup *vSetup, AIROUTE *airoute)
{
	this->vSetup=vSetup;
	this->airoute=airoute;
	
	GetOptions();
	UpdateSettings();
	UpdateWorld();
	Reset(airoute);
	
	// empty node
	nodes[0].yx=0;
	nodes[0].h=0.0f;
	
	// make the routing lookup table
	DXY[0].yx=-WIDTH;	DXY[0].route=2;
	DXY[1].yx=1;		DXY[1].route=3;
	DXY[2].yx=WIDTH;	DXY[2].route=0;
	DXY[3].yx=-1;		DXY[3].route=1;
	
	DXY[4].yx=-WIDTH+1;	DXY[4].route=6;
	DXY[5].yx=WIDTH+1;	DXY[5].route=7;
	DXY[6].yx=WIDTH-1;	DXY[6].route=4;
	DXY[7].yx=-WIDTH-1;	DXY[7].route=5;
	
	//in case a NO_ROUTE accidentally is passed for lookup
	DXY[8].yx=0;		DXY[8].route=0;
}

BestFirst::~BestFirst()
{
	
}

void BestFirst::Reset(AIROUTE *airoute)
{
	//
	bigtick.QuadPart=0;
	LARGE_INTEGER tmp1;
	QueryPerformanceCounter(&tmp1);
	
	this->airoute=airoute;
	airoute->count=0;
	
	// opt me
	_WORLD * pworld=world;
	int n=WIDTH*HEIGHT;
	do {
		pworld->state=(pworld->terrain_cost==IMPASSABLE_TERRAIN_COST);
		pworld++;
	} while(--n>0);
	
	//
	frame=0;
	
	pathing_state=FINDING;
	path_found=false;
	no_path=false;
	
	//
	open_nodes=1;
	closed_nodes=0;
	
	// open node see
	best_node=1;
	nodes[best_node].yx=startyx;
	nodes[best_node].h=distance(startyx);
	world[startyx].route=NO_ROUTE;
	
	//closed node seed
	closed_node=0;
	
	free_node=1;
	
	//
	heap[0]=EMPTY_NODE;
	last_heap_leaf=1;
	heap[last_heap_leaf]=best_node;
	
	//
	LARGE_INTEGER tmp2;
	QueryPerformanceCounter(&tmp2);
	bigtick.QuadPart += tmp2.QuadPart - tmp1.QuadPart;
}






///////////////////////////////////////////////////////////////////////////
// heap priority queue code
// note: make non-recursive
inline int BestFirst::LEFT(int k)
{
	return k<<1; //k*2;
}
inline int BestFirst::RIGHT(int k)
{
	return (k<<1)+1; //k*2+1;
}
inline int BestFirst::PARENT(int k)
{
	return (k>>1); //k/2;
}
inline bool BestFirst::NOTEMPTY_UP(int k)
{
	return k!=0;
}
inline bool BestFirst::NOTEMPTY_DOWN(int k)
{
	return k<=last_heap_leaf;
}
inline void BestFirst::swap_heap(const int k1, const int k2)
{
	WORD tmp=heap[k1];
	heap[k1]=heap[k2];
	heap[k2]=tmp;
}
//
void BestFirst::remove_root_from_heap()
{
	// move last leaf to the root and delte the last leaf
	heap[ROOT_HEAP]=heap[last_heap_leaf--];
	
	//move transposed k back down level to appropriate place
	int k=ROOT_HEAP;
	while(NOTEMPTY_DOWN(k))
	{
		int leftk=LEFT(k);
		int rightk=RIGHT(k);
		int bestk;
		if(NOTEMPTY_DOWN(leftk) && NOTEMPTY_DOWN(rightk) )
		{
			if(nodes[heap[leftk]].h < nodes[heap[rightk]].h)
				bestk=leftk;
			else
				bestk=rightk;
		}
		else if(NOTEMPTY_DOWN(leftk))
			bestk=leftk;
		else
			break;
		
		if(nodes[heap[bestk]].h < nodes[heap[k]].h)
		{
			swap_heap(k,bestk);
			k=bestk;
		}
		else
			break;
	}
}
//
void BestFirst::insert_node_to_heap(WORD node)
{
	// add new leaf unless the tree is full.
	// in that case prune worst leaf
	//(ie, remove the very last leaf before adding another).
	if(last_heap_leaf<MAX_HEAP_LEAFS)
		last_heap_leaf++;
	
	//
	heap[last_heap_leaf]=node;
	
	// move new k up through heap to closest level
	int k=last_heap_leaf;
	while(NOTEMPTY_UP(k))
	{
		int parentk=PARENT(k);
		if(NOTEMPTY_UP(parentk))
		{
			if(nodes[heap[k]].h < nodes[heap[parentk]].h)
			{
				swap_heap(k,parentk);
				k=parentk;
			}
			else
				break;
		}
		else
			break;
	}
}




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

//
void BestFirst::FindPath()
{
	if(pathing_state)
		return;
	if(
		(vSetup->presearch_toggle && vSetup->world[startyx>>YSHIFT][startyx&XMASK].group!=vSetup->world[endyx>>YSHIFT][endyx&XMASK].group) ||
		world[startyx].terrain_cost==IMPASSABLE_TERRAIN_COST ||
		world[endyx].terrain_cost==IMPASSABLE_TERRAIN_COST
		)
		pathing_state=NO_PATH;
	else
	{
		//
		LARGE_INTEGER tmp1;
		QueryPerformanceCounter(&tmp1);
		
		
		// ///////
		int count=iterations_per_frame;
		do
		{
			closed_node=best_node=heap[ROOT_HEAP]; //parent_node
			
			// PART A close node
			_NODES *pparent_node=nodes+best_node;
			if(pparent_node->yx==endyx) pathing_state|=PATH_FOUND; // did we find the goal?
			world[ pparent_node->yx ].state=CLOSED; // map the world map with closed state
			remove_root_from_heap(); //
			
			// PART B open nodes
			for(BYTE d=0;d<directions;d++)
			{
				// figure the [y][x] offset into the world map
				WORD yx=pparent_node->yx+DXY[d].yx;
				_WORLD *pworld=world+yx;
				
				if(pworld->state==UNKNOWN) //if we've never visited this [y][x] before...
				{
					pworld->state=OPEN; //mark [y][x] of world map as part of an open node
					pworld->route=d; //store routing info for use later in packroute...
					
					free_node++; //cycle up to the next unused slot for a node
					// since we don't actually delete nodes when we close them there's no need to
					// search unused nodes out.
					
					_NODES *pfree_node=nodes+free_node;
					
					pfree_node->yx=yx; // mark the [y][x] position of this node for the world map
					pfree_node->h=distance(yx); //
					
					// insert this new node into the binary heap
					insert_node_to_heap(free_node);
				}
			}
			
			if(last_heap_leaf<=0) pathing_state|=NO_PATH;
		} while(--count>0 && !pathing_state);
		
		//
		frame+=(iterations_per_frame-count); //
		// ///////
		
		
		//
		if(pathing_state) PackRoute();
		
		//
		LARGE_INTEGER tmp2;
		QueryPerformanceCounter(&tmp2);
		bigtick.QuadPart += tmp2.QuadPart - tmp1.QuadPart;
		
		vSetup->frame=frame;
		vSetup->bigtick.QuadPart=bigtick.QuadPart;
	}
	
	//
	path_found=(pathing_state&PATH_FOUND)==PATH_FOUND;
	no_path=(pathing_state&NO_PATH)==NO_PATH;
	open_nodes=last_heap_leaf;
	closed_nodes=(WORD)(free_node-last_heap_leaf);
}




// note: removing switchs and just using manhattan saves a grand total of .5ms on
// the test machine. :)
inline float BestFirst::distance(const WORD yx)
{
	switch(distance_method)
	{
	case MANHATTAN_DISTANCE:
		{
			return (float)(abs((yx&XMASK)-endx) + abs((yx>>YSHIFT)-endy));
		}
		break;
		
	case PYTHAGORAS_DISTANCE: //aka STRAIGHT LINE, pythagoras
		{
			int xpart=(yx&XMASK)-endx;
			int ypart=(yx>>YSHIFT)-endy;
			return (float)sqrt(xpart*xpart + ypart*ypart);
		}
		break;
		
	case DIAGONAL_DISTANCE:
		{
			float a=(float)abs((yx&XMASK)-endx);
			float b=(float)abs((yx>>YSHIFT)-endy);
			return (a>b)?a:b;
		}
		break;
		
	case SIMPLE_PYTHAGORAS_DISTANCE:
		{
			int xpart=(yx&XMASK)-endx;
			int ypart=(yx>>YSHIFT)-endy;
			return (float)(xpart*xpart + ypart*ypart);
		}
		break;
	default: return 0.0f;
	}
}







///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// to make it easier to add many new Setups to patherfinder.cpp we use Setup.cpp 
// class as a holder for all general settings and world info.

// tells Setup.cpp what menu options should be enabled/disabled for this alg.
void BestFirst::GetOptions()
{
	vSetup->options.uniform_cost=false;
	vSetup->options.terrain_cost=false;
	vSetup->options.distance=true;
	vSetup->options.search_directions=true;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线精品不卡| 国产三级精品三级在线专区| 中日韩免费视频中文字幕| 国产剧情一区在线| 亚洲欧美自拍偷拍色图| 色综合天天综合网天天看片| 亚洲日本在线天堂| 91 com成人网| 国模少妇一区二区三区| 中文字幕一区二区在线观看 | 91麻豆自制传媒国产之光| 亚洲欧美日本韩国| 精品久久久影院| 日本道精品一区二区三区 | 制服丝袜亚洲精品中文字幕| 精品视频在线免费| 国产风韵犹存在线视精品| 亚洲一区二区av电影| 51精品视频一区二区三区| 日韩精品中文字幕一区二区三区| 91在线看国产| 久久99精品一区二区三区| 亚洲黄色片在线观看| 国产亚洲视频系列| 欧美一区二区视频在线观看| 91美女精品福利| 91麻豆精品国产无毒不卡在线观看 | 色吧成人激情小说| 欧美剧情片在线观看| 91麻豆国产福利精品| 欧美中文字幕一区| 91麻豆国产在线观看| 欧美精品日韩一区| 国产午夜精品一区二区三区四区| 亚洲女人的天堂| 韩日精品视频一区| 欧美又粗又大又爽| 成人黄色一级视频| 国内精品嫩模私拍在线| 91丨九色丨黑人外教| 欧美成va人片在线观看| 亚洲免费成人av| 国产精品综合网| 欧美理论片在线| 亚洲欧洲综合另类在线| 国内外成人在线| 欧美人与禽zozo性伦| 色老综合老女人久久久| 日韩欧美国产三级| 亚洲男人电影天堂| 国产不卡视频一区| 99这里都是精品| 色狠狠色狠狠综合| 国产午夜精品美女毛片视频| 天天操天天干天天综合网| 亚洲图片欧美一区| 免费日韩伦理电影| 免费日本视频一区| 欧美人牲a欧美精品| 国产精品国产三级国产三级人妇 | 一个色妞综合视频在线观看| 亚洲第一福利一区| 久久福利视频一区二区| 国产综合色在线视频区| 91精品国产综合久久精品 | 久久精品国产色蜜蜜麻豆| 欧美系列亚洲系列| 亚洲最新视频在线观看| 成人午夜激情片| 欧美亚洲一区二区在线观看| 综合分类小说区另类春色亚洲小说欧美| 麻豆精品久久精品色综合| 国产成人一级电影| 国产日产欧美精品一区二区三区| 美国十次了思思久久精品导航| 欧美日韩激情一区二区三区| 亚洲自拍偷拍av| 在线观看国产精品网站| 亚洲成av人片| 91麻豆精品91久久久久同性| 亚洲成人777| 日韩一级二级三级精品视频| 欧美韩日一区二区三区| 亚洲va欧美va人人爽| 欧美性xxxxxx少妇| 日本不卡在线视频| 色88888久久久久久影院野外| 亚洲欧美一区二区视频| 91豆麻精品91久久久久久| 一区二区三区四区五区视频在线观看 | 91美女片黄在线观看91美女| 亚洲自拍与偷拍| 欧美日韩一区高清| 免费成人在线网站| 国产日韩v精品一区二区| 成人黄色一级视频| 午夜精品免费在线| 久久午夜色播影院免费高清| 午夜精品一区二区三区电影天堂| 91精品国产一区二区三区| 精品一区二区在线观看| 国产精品高清亚洲| 欧美日韩美少妇| 久久精品av麻豆的观看方式| 欧美经典三级视频一区二区三区| 日本精品一级二级| 蜜桃av一区二区| 亚洲三级视频在线观看| 欧美一区二区三区不卡| bt7086福利一区国产| 日本成人在线电影网| 国产精品女上位| 6080国产精品一区二区| 大桥未久av一区二区三区中文| 亚洲精品va在线观看| 亚洲精品一区二区三区香蕉| 久久超碰97中文字幕| 1024亚洲合集| 欧美精品一区男女天堂| 欧美最新大片在线看| 国产成人一级电影| 蜜乳av一区二区| 亚洲一区二区视频在线观看| 久久精品亚洲一区二区三区浴池| 在线观看欧美日本| 成人性生交大片免费看视频在线| 午夜精品一区在线观看| 亚洲一区在线视频| 国产精品麻豆视频| 欧美精品一区二区三区蜜臀 | 日韩女优电影在线观看| 91官网在线免费观看| va亚洲va日韩不卡在线观看| 国产一区激情在线| 日本sm残虐另类| 亚洲第一狼人社区| 一个色在线综合| 亚洲免费高清视频在线| 国产精品久久久久久久岛一牛影视| 欧美一区二区三区影视| 欧美美女一区二区三区| 欧美亚洲综合另类| 91亚洲男人天堂| 成人av资源站| 国产一区二区视频在线播放| 男人操女人的视频在线观看欧美| 亚洲午夜电影网| 亚洲免费视频成人| 亚洲人精品一区| 亚洲激情一二三区| 亚洲免费在线观看| 亚洲精品你懂的| 亚洲精品国产a久久久久久| 亚洲日本丝袜连裤袜办公室| 国产欧美日韩亚州综合 | 99精品在线观看视频| 国产成人免费网站| 成人黄色网址在线观看| 国产福利一区二区三区视频在线| 国产高清亚洲一区| www.激情成人| 91丨九色丨尤物| 欧美日韩日本视频| 91精品在线观看入口| 欧美成人三级电影在线| 久久久www成人免费无遮挡大片| 一本一道波多野结衣一区二区| 亚洲第一主播视频| 老司机免费视频一区二区| 狠狠久久亚洲欧美| 成人国产免费视频| 欧洲国内综合视频| 欧美一区二区啪啪| 久久久久久久久蜜桃| 日韩一区在线播放| 三级久久三级久久| 中文字幕一区在线观看| 亚洲视频在线一区观看| 亚洲国产精品久久人人爱蜜臀| 日韩av在线免费观看不卡| 国产高清成人在线| 欧美日韩高清一区二区不卡| 日韩你懂的在线播放| 亚洲三级在线看| 久久精品国产99国产精品| 99精品在线观看视频| 日韩一区二区在线免费观看| 国产精品久久久久影院| 亚洲bt欧美bt精品| 波多野结衣中文一区| 91精品午夜视频| 亚洲天堂网中文字| 韩国精品主播一区二区在线观看| 一本色道久久综合狠狠躁的推荐| 日韩欧美一区二区在线视频| 亚洲婷婷国产精品电影人久久| 国产一区啦啦啦在线观看| 欧美色偷偷大香| 亚洲欧洲一区二区三区| 狠狠久久亚洲欧美|