亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美mv和日韩mv的网站| 色婷婷一区二区| av男人天堂一区| 色噜噜久久综合| 欧美日韩卡一卡二| 久久免费电影网| 亚洲狠狠丁香婷婷综合久久久| 亚洲综合激情另类小说区| 青青草97国产精品免费观看| 国产精品中文字幕欧美| 欧美日韩一区二区在线视频| 欧美另类z0zxhd电影| 久久精品视频网| 亚洲精品视频在线观看网站| 精品一区二区三区香蕉蜜桃| 色一区在线观看| 久久久久久久久97黄色工厂| 亚洲高清一区二区三区| 成人av免费网站| 精品国产91亚洲一区二区三区婷婷| 国产精品私人自拍| 日本视频一区二区三区| 欧美日韩一区二区电影| 亚洲最大成人综合| 91网站最新网址| 亚洲欧洲av色图| 99久久er热在这里只有精品66| 国产农村妇女精品| 国产精品影视在线观看| 久久久午夜电影| 国产精品一二三四五| 久久久久久久久久久久久女国产乱| 久久成人免费网| 精品不卡在线视频| 国产精品一二三四| 国产精品人成在线观看免费 | 91麻豆精品91久久久久同性| 日日摸夜夜添夜夜添精品视频 | 成人在线视频一区| 国产精品久99| 欧美在线不卡一区| 久久国内精品视频| 精品嫩草影院久久| 国产福利一区二区| 国产精品成人免费精品自在线观看 | 91精品国产综合久久小美女| 欧美aⅴ一区二区三区视频| 91精品国产欧美日韩| 免费人成在线不卡| 国产婷婷一区二区| 91免费视频观看| 亚洲第一二三四区| 欧美成人三级在线| 白白色 亚洲乱淫| 亚洲动漫第一页| 欧美成人官网二区| av电影在线观看不卡| 一区二区高清在线| 欧美va日韩va| 色综合中文字幕| 视频一区在线视频| 久久久亚洲综合| 欧美午夜视频网站| 国产精品综合一区二区三区| 亚洲精品乱码久久久久久黑人| 欧美一区二区三区系列电影| 懂色av一区二区三区免费观看| 亚洲国产精品久久人人爱 | 国产美女视频91| 国产精品伦理一区二区| 欧美精品在线观看一区二区| 高清不卡在线观看av| 婷婷开心久久网| 国产精品三级电影| 制服丝袜在线91| 色呦呦一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 有码一区二区三区| 国产亚洲一二三区| 在线播放/欧美激情| av毛片久久久久**hd| 六月丁香综合在线视频| 有坂深雪av一区二区精品| 精品国产露脸精彩对白| 欧美午夜精品一区二区三区| 国产成人精品综合在线观看| 免费成人你懂的| 亚洲制服欧美中文字幕中文字幕| 久久亚洲精品小早川怜子| 欧美日韩国产首页| 99久久免费国产| 国产精品一区在线| 蜜臀久久99精品久久久画质超高清| 亚洲欧美经典视频| 国产精品久久网站| 久久亚洲一区二区三区明星换脸| 欧美美女网站色| 欧美日韩亚洲不卡| 93久久精品日日躁夜夜躁欧美| 色婷婷综合久久久| 粉嫩av一区二区三区| 久久精品国产一区二区三| 亚洲国产精品欧美一二99| 亚洲欧美区自拍先锋| 亚洲欧美在线视频| 亚洲欧美在线aaa| 国产精品久久久久久久久搜平片 | 色狠狠色噜噜噜综合网| 成人av午夜影院| 成人黄色在线看| 成人开心网精品视频| 国产激情精品久久久第一区二区| 国产一区二区三区四区五区入口| 韩国在线一区二区| 国产在线精品一区二区| 国产一区二区三区四区五区入口| 国内精品视频一区二区三区八戒| 男女男精品网站| 久久精品理论片| 国产裸体歌舞团一区二区| 国产精品91xxx| 99re热这里只有精品视频| 99精品视频免费在线观看| 色婷婷综合久久久久中文一区二区 | 色88888久久久久久影院按摩| 色呦呦日韩精品| 欧美日韩五月天| 91精品在线一区二区| 91精品国产美女浴室洗澡无遮挡| 777欧美精品| 精品三级在线看| 日本一区二区三级电影在线观看| 国产精品免费aⅴ片在线观看| 亚洲私人黄色宅男| 天天综合日日夜夜精品| 韩国欧美国产1区| 99久久精品国产一区二区三区 | 成人激情免费网站| 色哟哟一区二区在线观看| 欧美美女黄视频| 久久综合九色综合97婷婷女人| 国产精品久久久久久妇女6080 | 豆国产96在线|亚洲| 色伊人久久综合中文字幕| 在线91免费看| 国产精品日产欧美久久久久| 亚洲国产精品一区二区www在线| 喷白浆一区二区| 成人一级片网址| 欧美日韩一区三区四区| 国产网站一区二区三区| 亚洲国产精品久久人人爱| 国产一区二区三区电影在线观看 | 久久综合久久久久88| 亚洲视频一区二区在线观看| 免费在线观看精品| 欧美一区二区三区在线视频 | 成人黄动漫网站免费app| 欧美日本国产一区| 国产精品三级电影| 免费日本视频一区| 91久久精品国产91性色tv| 久久这里只精品最新地址| 亚洲一区在线播放| 国产91对白在线观看九色| 欧美日本在线看| 亚洲免费av在线| 成人免费精品视频| 精品国产三级电影在线观看| 一区二区三区四区五区视频在线观看| 老司机精品视频在线| 欧美天堂一区二区三区| 欧美激情一区二区三区在线| 日本欧美一区二区在线观看| 色8久久人人97超碰香蕉987| 国产日韩精品一区| 国产在线视频精品一区| 欧美色精品在线视频| 综合自拍亚洲综合图不卡区| 国产电影一区在线| 精品日韩欧美在线| 美女视频黄免费的久久| 欧美探花视频资源| 一区二区三区欧美亚洲| 粉嫩绯色av一区二区在线观看| 精品国产精品网麻豆系列| 人禽交欧美网站| 日韩一区二区免费高清| 五月天中文字幕一区二区| 欧美又粗又大又爽| 亚洲精品国产一区二区三区四区在线| 成人综合日日夜夜| 国产精品狼人久久影院观看方式| 国产一区二区三区在线观看免费视频| 日韩视频在线永久播放| 麻豆91小视频| 精品欧美久久久| 国产一区二区三区免费| 久久久精品国产免费观看同学| 国产自产2019最新不卡|