中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

花都營銷型網(wǎng)站高效統(tǒng)籌疫情防控和經(jīng)濟社會發(fā)展

花都營銷型網(wǎng)站,高效統(tǒng)籌疫情防控和經(jīng)濟社會發(fā)展,廣東購物網(wǎng)站建設(shè)報價,重慶公司網(wǎng)站搭建公司推薦注意: 本文是對基于下方文章鏈接的理論,并最終代碼實現(xiàn),感謝作者大大的描述,非常詳細(xì),流程稍微做了些改動,文末有工程網(wǎng)盤鏈接,感興趣的可以下載。 A*算法詳解(個人認(rèn)為最詳細(xì),最通俗易懂的一…

注意:

本文是對基于下方文章鏈接的理論,并最終代碼實現(xiàn),感謝作者大大的描述,非常詳細(xì),流程稍微做了些改動,文末有工程網(wǎng)盤鏈接,感興趣的可以下載。

A*算法詳解(個人認(rèn)為最詳細(xì),最通俗易懂的一個版本)-CSDN博客

1、效果演示:

2、A*算法流程:

(1)? ? ? ? ?把起點加入?open list?。

(2)? ? ? ? ?重復(fù)如下過程:

? ? ? ? ? ? ? ? ? ? ? ? a.?????????遍歷?open list?,查找?F?值最小的節(jié)點,把它作為當(dāng)前要處理的節(jié)點。

? ? ? ? ? ? ? ? ? ? ? ? b.?????????對當(dāng)前方格的?8連通的每一個方格? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?◆?????如果它是不可抵達的或者它在?close list?中,忽略它。否則,做如下操作。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?◆?????如果它不在?open list?中,把它加入?open list?,并且把當(dāng)前方格設(shè)置為它的父親,記錄該方格的?F?,?G?和?H?值。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?◆?????如果它已經(jīng)在?open list?中,檢查這條路徑?(?即經(jīng)由當(dāng)前方格到達它那里?)?是否更好,用?G?值作參考。更小的?G?值表示這是更好的路徑。如果是這樣,把它的父親設(shè)置為當(dāng)前方格,并重新計算它的?G?和?F?值。

? ? ? ? ? ? ? ? ? ? ? ? ?c.?????????把這個節(jié)點移到?close list?。

? ? ? ? ? ? ? ? ? ? ? ? ?d.?????????停止,當(dāng)你

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?◆?????把終點加入到了?open list?中,此時路徑已經(jīng)找到了,或者

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?◆?????查找終點失敗,并且?open list?是空的,此時沒有路徑。

(3)? ? ? ? ?保存路徑。從終點開始,每個方格沿著父節(jié)點移動直至起點,這就是你的路徑。

3、代碼:

邏輯層Node結(jié)點定義:
using UnityEngine;public enum GridState
{Empty,Block,
}
public class Node
{public GridState curState;public int X;public int Y;public int F;public int G;public int H;public Node parentNode;public Node(int x, int y){X = x;Y = y;ResetNode();}public void ResetNode(){curState = GridState.Empty;F = 0;G = 0;H = 0;parentNode = null;}public void CalculateValue(Node endNode){if (parentNode == null) return;//計算GG = GetPredictGValue(parentNode);//曼哈頓距離計算HH = Mathf.Abs(endNode.X - X) + Mathf.Abs(endNode.Y - Y);F = G + H;}public int GetPredictGValue(Node targetNode){int predictG = 0;//四連通if (targetNode.X == X || targetNode.Y == Y){predictG = targetNode.G + 10;}//八連通else{predictG = targetNode.G + 14;}return predictG;}}
尋路算法:
using System.Collections.Generic;public partial class PathFind
{private List<Node> openList;private List<Node> closeList;private Node[,] allNodeList;public void AStarInit(Node[,] allNodes){openList = new List<Node>();closeList = new List<Node>();allNodeList = allNodes;}public void FindRoad(Node startNode, Node endNode){openList.Add(startNode);LoopFindRoad(endNode);}private void LoopFindRoad(Node endNode){//找到終點或者不存在路徑if (openList.Count == 0||openList.Contains(endNode)){return;}//找到F值最小的Node smallestFNode = null;for (int i = 0; i < openList.Count; i++){if (smallestFNode == null){smallestFNode = openList[i];continue;}if (openList[i].F<=smallestFNode.F){smallestFNode = openList[i];}}//獲得八連通格子List<Node> eightAdjacent = GetRoundNode(smallestFNode);//更新代價for (int i = 0; i < eightAdjacent.Count; i++){//不在openList里面if (!openList.Contains(eightAdjacent[i])){eightAdjacent[i].parentNode = smallestFNode;eightAdjacent[i].CalculateValue(endNode);openList.Add(eightAdjacent[i]);}else{//判斷是否需要更新F,G,Hif (eightAdjacent[i].GetPredictGValue(smallestFNode) <= eightAdjacent[i].G){eightAdjacent[i].parentNode = smallestFNode;eightAdjacent[i].CalculateValue(endNode);}}}//轉(zhuǎn)移結(jié)點openList.Remove(smallestFNode);closeList.Add(smallestFNode);LoopFindRoad(endNode);}/// <summary>/// 獲得八連通格子中可達到并且不在closeList中的格子/// </summary>/// <returns></returns>private List<Node> GetRoundNode(Node targetNode){int x = targetNode.X;int y = targetNode.Y;List<Node> tempList = new List<Node>();if (IsReachableNode(x, y + 1)) tempList.Add(allNodeList[x, y + 1]);if (IsReachableNode(x + 1, y + 1)) tempList.Add(allNodeList[x + 1, y + 1]);if (IsReachableNode(x + 1, y)) tempList.Add(allNodeList[x + 1, y]);if (IsReachableNode(x + 1, y - 1)) tempList.Add(allNodeList[x + 1, y - 1]);if (IsReachableNode(x, y - 1)) tempList.Add(allNodeList[x, y - 1]);if (IsReachableNode(x - 1, y - 1)) tempList.Add(allNodeList[x - 1, y - 1]);if (IsReachableNode(x - 1, y)) tempList.Add(allNodeList[x - 1, y]);if (IsReachableNode(x - 1, y + 1)) tempList.Add(allNodeList[x - 1, y + 1]);return tempList;}/// <summary>/// 判斷格子是否可到達/// </summary>/// <param name="x"></param>/// <param name="y"></param>/// <returns></returns>private bool IsReachableNode(int x, int y){if (x >= allNodeList.GetLength(0) || x <= 0){return false;}if (y >= allNodeList.GetLength(1) || y <= 0){return false;}if (allNodeList[x, y].curState == GridState.Block){return false;}if (closeList.Contains(allNodeList[x, y])){return false;}return true;}
}

4、補充:

如果希望過障礙時,不允許他斜向過障礙,可以額外加個判斷,原理很簡單,對于8連通的角落點,判斷角落點的4連通是否有障礙,如果有障礙就不算入可到達格子。

代碼如下:

演示:

5、工程網(wǎng)盤鏈接:

通過網(wǎng)盤分享的文件:AStarDemo.unitypackage
鏈接: https://pan.baidu.com/s/1L_f1DIkqe9Oqm_dnFSSVew 提取碼: 1212

http://www.risenshineclean.com/news/10896.html

相關(guān)文章:

  • 中國十大搜索引擎網(wǎng)站網(wǎng)站推廣工具有哪些
  • python做網(wǎng)站的案例微信朋友圈推廣平臺
  • 網(wǎng)站建設(shè) 驗收意見成人廚師短期培訓(xùn)班
  • 四川城鄉(xiāng)建設(shè)部網(wǎng)站首頁百度app推廣
  • seo網(wǎng)站編輯什么是搜索引擎銷售
  • 怎么制作公司自己網(wǎng)站黃頁網(wǎng)絡(luò)的推廣網(wǎng)站有哪些
  • 利用社交網(wǎng)站做淘寶客國內(nèi)看不到的中文新聞網(wǎng)站
  • 手機產(chǎn)品展示網(wǎng)站模板百度推廣案例及效果
  • 江蘇建設(shè)教育協(xié)會網(wǎng)站免費輿情網(wǎng)站下載大全最新版
  • 廣州專業(yè)做網(wǎng)站建設(shè)淘寶運營培訓(xùn)班
  • 怎樣建立自己網(wǎng)站視頻網(wǎng)站小紅書如何引流推廣
  • 做網(wǎng)站推廣有前景嗎站內(nèi)推廣和站外推廣的區(qū)別
  • 免費網(wǎng)頁設(shè)計生成器關(guān)于進一步優(yōu)化
  • 網(wǎng)站規(guī)劃書 確定網(wǎng)站建設(shè)目的新聞?wù)?022最新20篇
  • 怎樣給自己的網(wǎng)站做優(yōu)化湖南百度推廣
  • 淳安縣建設(shè)局網(wǎng)站網(wǎng)站優(yōu)化方案案例
  • 網(wǎng)站開發(fā)移動app寧波seo怎么推廣
  • 廣告網(wǎng)站建設(shè)網(wǎng)站排名優(yōu)化自己建網(wǎng)站怎么建
  • 微信公眾官方平臺入口seo快速排名首頁
  • 白城市住房建設(shè)局網(wǎng)站東莞百度seo電話
  • 安徽建設(shè)官網(wǎng)長春seo外包
  • 微信公眾平臺 網(wǎng)站開發(fā)seo產(chǎn)品是什么意思
  • 化妝品網(wǎng)站建設(shè)規(guī)模設(shè)想免費頂級域名注冊網(wǎng)站
  • 重慶做網(wǎng)站推廣的抖音網(wǎng)絡(luò)營銷案例分析
  • 專門做兒童的店鋪網(wǎng)站自動app優(yōu)化下載
  • 公司企業(yè)郵箱申請win優(yōu)化大師官網(wǎng)
  • 臨沂羅莊做網(wǎng)站公司店鋪如何運營和推廣
  • 網(wǎng)站建設(shè)國內(nèi)現(xiàn)狀seo推廣多少錢
  • 教做網(wǎng)站天津百度快照優(yōu)化公司
  • 做政府網(wǎng)站服務(wù)重慶森林講的什么內(nèi)容