当前位置: 首页 > news >正文

建设银行温州支行官方网站windows优化大师是官方的吗

建设银行温州支行官方网站,windows优化大师是官方的吗,九江建设局网站,岚山区建设局网站文章目录AStar算法简介实现Node节点节点间的估价算法核心邻节点的搜索方式地图编辑器简介实现绘制地图网格障碍/可行走区域地图数据存储AStar算法 简介 Unity中提供了NavMesh导航寻路的AI功能,如果项目不涉及服务端它应该能满足大部分需求,但如果涉及服…

文章目录

  • AStar算法
    • 简介
    • 实现
      • Node节点
      • 节点间的估价
      • 算法核心
      • 邻节点的搜索方式
  • 地图编辑器
    • 简介
    • 实现
      • 绘制地图网格
      • 障碍/可行走区域
      • 地图数据存储


AStar算法

AStar 寻路

简介

Unity中提供了NavMesh导航寻路的AI功能,如果项目不涉及服务端它应该能满足大部分需求,但如果涉及服务端且使用状态同步技术,可能需要服务端同时实现寻路功能,这时就需要考虑其它实现思路,而AStar寻路算法则是常使用的一种。

AStar算法是一种静态路网中求解最短路径最有效的直接搜索方法,基于广度优先搜索(BFS)Dijkstra算法,通过不断维护节点的代价来寻求代价最小的路径,代价的估价公式:F(N)=G(N) + H(N)

  • G:理解为起始节点到当前节点的代价;
  • H:理解为当前节点到终节点的代价。

其它概念:

  • 开放集合:记录所有被考虑用来寻找最短路径的节点集合;
  • 封闭集合:记录不会被考虑用来寻找最短路径的节点集合。

算法思路:

  • 将起始节点放入开放集合;
  • While循环重复以下步骤,直到结束条件满足:
    • 在开放集合中寻找代价最小的节点,并把寻找到的节点作为Current当前节点;
    • 将获取到的当前节点从开放集合移除放入封闭集合;
    • 若当前节点已经是终节点,寻路结束,跳出While循环,否则继续执行以下操作;
    • 获取当前节点的邻节点,并对每个邻节点执行以下步骤:
      • 若邻节点为不可行走区域(障碍)或者邻节点已经在封闭集合中,不执行任何操作,Continue继续遍历下一个邻节点;
      • 若邻节点不在开放集合中,将其放入开放集合,并将Current当前节点赋值给该邻节点的父节点,计算、记录该邻节点的G、H代价;
      • 若邻节点在开放集合中,判断经Current当前节点到达该邻节点的G值是否小于原来的G值,若小于则将该邻节点的父节点设为当前节点,并重新计算该邻节点的G、H代价。
  • 从终节点开始依次获取父节点放入一个列表,最终将列表做倒序操作就是最终寻路的路径。

实现

Node节点

地图网格由x * y个Node节点组成,定义节点类,变量包含节点的x、y索引值、父节点信息、G、H、F代价值以及是否为可行走区域的标识信息,代码如下:

namespace SK.Framework.AStar
{public class Node{public int x;public int y;/// <summary>/// 父节点/// </summary>public Node parent;/// <summary>/// 是否为可行走区域/// </summary>public bool IsWalkable { get; private set; }/// <summary>/// 起始节点到当前节点的代价/// </summary>public int gCost;/// <summary>/// 当前节点到终节点的代价/// </summary>public int hCost;/// <summary>/// 代价/// </summary>public int Cost { get { return gCost + hCost; } }public Node(int x, int y, bool isWalkable){this.x = x;this.y = y;IsWalkable = isWalkable;}}
}

节点间的估价

每向正上、下、左右方向走一步代价为1,根据勾股定理,每向斜方向走一步代价为2\sqrt{2}2,近似1.414,而为了便于计算、节省性能,我们将正方向移动一步的代价记为10,斜方向移动一步的代价记为14,都取int整数。

估价方式

//计算两节点之间的代价
private int CalculateCost(Node n1, Node n2)
{//绝对值int deltaX = n1.x - n2.x;if (deltaX < 0) deltaX = -deltaX;int deltaY = n1.y - n2.y;if (deltaY < 0) deltaY = -deltaY;int delta = deltaX - deltaY;if (delta < 0) delta = -delta;//每向正上、下、左、右方向走一步代价增加10//每斜向走一步代价增加14(勾股定理,精确来说是近似14.14~)return 14 * (deltaX > deltaY ? deltaY : deltaX) + 10 * delta;
}

算法核心

/// <summary>
/// 根据起始节点和终节点获取路径
/// </summary>
/// <param name="startNode">起始节点</param>
/// <param name="endNode">终节点</param>
/// <returns>路径节点集合</returns>
public List<Node> GetPath(Node startNode, Node endNode)
{//开放集合List<Node> openCollection = new List<Node>();//封闭集合HashSet<Node> closeCollection = new HashSet<Node>();//起始节点放入开放集合openCollection.Add(startNode);//开放集合中数量为0时 寻路结束while (openCollection.Count > 0){//当前节点Node currentNode = openCollection[0];//遍历查找是否有代价更小的节点//若代价相同,选择移动到终点代价更小的节点for (int i = 1; i < openCollection.Count; i++){currentNode = (currentNode.Cost > openCollection[i].Cost|| (currentNode.Cost == openCollection[i].Cost&& currentNode.hCost > openCollection[i].hCost))? openCollection[i] : currentNode;}//将获取到的当前节点从开放集合移除放入封闭集合openCollection.Remove(currentNode);closeCollection.Add(currentNode);//当前节点已经是终节点 寻路结束if (currentNode == endNode)break;//获取邻节点List<Node> neighbourNodes = GetNeighbouringNodes(currentNode, SearchMode.Link8);//在当前节点向邻节点继续搜索for (int i = 0; i < neighbourNodes.Count; i++){Node neighbourNode = neighbourNodes[i];//判断邻节点是否为不可行走区域(障碍)或者邻节点已经在封闭集合中if (!neighbourNode.IsWalkable || closeCollection.Contains(neighbourNode))continue;//经当前节点到达该邻节点的G值是否小于原来的G值//或者该邻节点还没有放入开放集合,将其放入开放集合int cost = currentNode.gCost + CalculateCost(currentNode, neighbourNode);if (cost < neighbourNode.gCost || !openCollection.Contains(neighbourNode)){neighbourNode.gCost = cost;neighbourNode.hCost = CalculateCost(neighbourNode, endNode);neighbourNode.parent = currentNode;if (!openCollection.Contains(neighbourNode))openCollection.Add(neighbourNode);}}}//倒序获取父节点List<Node> path = new List<Node>();Node currNode = endNode;while (currNode != startNode){path.Add(currNode);currNode = currNode.parent;}//再次倒序后得到完整路径path.Reverse();return path;
}

邻节点的搜索方式

搜索邻节点时有两种搜索方式,四连通和八连通:

  • 四连通:又称四邻域,是指对应节点的上、下、左、右四个方向为邻节点:

四连通

  • 八连通:又称八邻域,是指对应节点的上、下、左、右、左上、右上、左下、右下八个方向为邻节点:

八连通

/// <summary>
/// 获取指定节点的邻节点
/// </summary>
/// <param name="node">指定节点</param>
/// <param name="searchMode">搜索方式 四连通/八连通</param>
/// <returns>邻节点列表</returns>
public List<Node> GetNeighbouringNodes(Node node, SearchMode searchMode)
{List<Node> neighbours = new List<Node>();switch (searchMode){case SearchMode.Link4:for (int i = -1; i <= 1; i++){if (i == 0) continue;int x = node.x + i;if (x >= 0 && x < this.x)neighbours.Add(nodesDic[x * this.x + node.y]);int y = node.y + i;if (y >= 0 && y < this.y)neighbours.Add(nodesDic[node.x * this.x + y]);}break;case SearchMode.Link8:for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){if (i == 0 && j == 0) continue;int x = node.x + i;int y = node.y + j;if (x >= 0 && x < this.x && y >= 0 && y < this.y)neighbours.Add(nodesDic[x * this.x + y]);}}break;}return neighbours;
}

地图编辑器

简介

Map Editor

按住Ctrl + 鼠标左键绘制地图障碍区域(如图所示,红色框区域即为障碍区域):

绘制障碍区域

按住Alt + 鼠标左键绘制地图可行走区域(清除障碍区域):

绘制可行走区域

实现

绘制地图网格

  • Grid X、Y组成地图网格(x * y);
  • Grid Size指定每个网格(节点)的大小:
//绘制地图网格
Handles.color = Color.cyan;
for (int i = 0; i <= x; i++)
{Vector3 start = i * size * Vector3.right;Vector3 end = start + y * size * Vector3.forward;Handles.DrawLine(start, end);
}
for (int i = 0; i <= y; i++)
{Vector3 start = i * size * Vector3.forward;Vector3 end = start + x * size * Vector3.right;Handles.DrawLine(start, end);
}

障碍/可行走区域

使用二维数组bool[,] map存储各节点网格是否为可行走区域

  • Ctrl + 鼠标左键 标识障碍区域;
  • Alt + 鼠标左键 标识可行走区域:
HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
//Ctrl + 鼠标左键 绘制障碍区域
//Alt + 鼠标左键 绘制可行走区域
var e = Event.current;
if (e != null && (e.control || e.alt) && (e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && e.button == 0)
{Ray ray = HandleUtility.GUIPointToWorldRay(e.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){int targetX = Mathf.CeilToInt(hit.point.x / size);int targetY = Mathf.CeilToInt(hit.point.z / size);if (targetX <= x && targetX > 0 && targetY <= y && targetY > 0){map[targetX - 1, targetY - 1] = !e.control;}}e.Use();
}//红色框绘制障碍区域
Handles.color = Color.red;
for (int m = 0; m < x; m++)
{for (int n = 0; n < y; n++){if (!map[m, n])Handles.DrawWireCube(new Vector3(m * size, 0f, n * size) + .5f * size * (Vector3.forward + Vector3.right), .9f * size * (Vector3.forward + Vector3.right));}
}

地图数据存储

由于地图数据存储于bool[,] map二维数组中,不支持序列化,因此将其转化为存储于Texture2D类型资产中,实现方式如下:

//生成地图
if (GUILayout.Button("Generate Map Data"))
{//选择保存路径string filePath = EditorUtility.SaveFilePanel("Save Map Data", Application.dataPath, "New Map Data", "asset");if (!string.IsNullOrEmpty(filePath)){//转化为Asset路径filePath = filePath.Substring(filePath.IndexOf("Assets"));//创建地图TexTexture2D bitmap = new Texture2D(x, y, TextureFormat.Alpha8, false);byte[] bytes = bitmap.GetRawTextureData();//默认全部为可行走区域for (int i = 0; i < bytes.Length; i++)bytes[i] = 0;for (int m = 0; m < x; m++){for (int n = 0; n < y; n++){//黑色存储障碍区域 白色存储可行走区域bytes[m * x + n] = (byte)(map[m, n] ? 255 : 0);}}bitmap.LoadRawTextureData(bytes);//创建、保存资产AssetDatabase.CreateAsset(bitmap, filePath);AssetDatabase.SaveAssets();AssetDatabase.Refresh();//选中EditorGUIUtility.PingObject(bitmap);}
}

地图数据存储

源码以上传至SKFramework框架Package Manager中:

SKFramework PackageManager


文章转载自:
http://dinncononmiscible.stkw.cn
http://dinncoamtrak.stkw.cn
http://dinncojcc.stkw.cn
http://dinncopalpebrate.stkw.cn
http://dinncopolyrhythm.stkw.cn
http://dinncogimp.stkw.cn
http://dinncogadid.stkw.cn
http://dinncolongawaited.stkw.cn
http://dinncoseacopter.stkw.cn
http://dinncodelimitation.stkw.cn
http://dinncopacificate.stkw.cn
http://dinncodissolvable.stkw.cn
http://dinncofido.stkw.cn
http://dinncocreditor.stkw.cn
http://dinnconormalizer.stkw.cn
http://dinncospoliate.stkw.cn
http://dinncomultilocular.stkw.cn
http://dinncopsilophyte.stkw.cn
http://dinncozontian.stkw.cn
http://dinncopaleontology.stkw.cn
http://dinncodogdom.stkw.cn
http://dinncocompotator.stkw.cn
http://dinncocontentious.stkw.cn
http://dinncotinctorial.stkw.cn
http://dinncomatriarch.stkw.cn
http://dinncoshintoism.stkw.cn
http://dinncolinked.stkw.cn
http://dinncocodeine.stkw.cn
http://dinncombps.stkw.cn
http://dinncoragbag.stkw.cn
http://dinncoswivet.stkw.cn
http://dinncoclock.stkw.cn
http://dinncoultralight.stkw.cn
http://dinncothorium.stkw.cn
http://dinncoketone.stkw.cn
http://dinncobuncombe.stkw.cn
http://dinncoshoulder.stkw.cn
http://dinncoptyalin.stkw.cn
http://dinncoflounderingly.stkw.cn
http://dinncosorrel.stkw.cn
http://dinncoreceptionist.stkw.cn
http://dinncoemp.stkw.cn
http://dinncopolyphagy.stkw.cn
http://dinncofelicitator.stkw.cn
http://dinncoassyriology.stkw.cn
http://dinncocaesarean.stkw.cn
http://dinncochinkapin.stkw.cn
http://dinncopainkiller.stkw.cn
http://dinncobuttercup.stkw.cn
http://dinncocem.stkw.cn
http://dinncoprepreerence.stkw.cn
http://dinncoagarose.stkw.cn
http://dinncoxenotropic.stkw.cn
http://dinncobilharzia.stkw.cn
http://dinncodisulfuram.stkw.cn
http://dinncoreynosa.stkw.cn
http://dinncocopular.stkw.cn
http://dinncobrothel.stkw.cn
http://dinncomacropterous.stkw.cn
http://dinncolinnet.stkw.cn
http://dinncoctol.stkw.cn
http://dinncoastrakhan.stkw.cn
http://dinncorecife.stkw.cn
http://dinncorimation.stkw.cn
http://dinncobetting.stkw.cn
http://dinncodefinition.stkw.cn
http://dinncoantiphon.stkw.cn
http://dinncoanzam.stkw.cn
http://dinncopolygonum.stkw.cn
http://dinncolegwork.stkw.cn
http://dinncostereoscopic.stkw.cn
http://dinncogayest.stkw.cn
http://dinncosymphonious.stkw.cn
http://dinncosecondhand.stkw.cn
http://dinncopleurectomy.stkw.cn
http://dinncotryma.stkw.cn
http://dinncoisogony.stkw.cn
http://dinncoinflexible.stkw.cn
http://dinncopyrheliometer.stkw.cn
http://dinncovelamen.stkw.cn
http://dinncocasimire.stkw.cn
http://dinncopriming.stkw.cn
http://dinnconival.stkw.cn
http://dinncoextractable.stkw.cn
http://dinncounholiness.stkw.cn
http://dinncoketen.stkw.cn
http://dinncoclaviform.stkw.cn
http://dinncocerite.stkw.cn
http://dinncotsk.stkw.cn
http://dinncozetland.stkw.cn
http://dinncofurthermore.stkw.cn
http://dinncofoehn.stkw.cn
http://dinncofrederic.stkw.cn
http://dinncothalami.stkw.cn
http://dinncorackety.stkw.cn
http://dinncodieresis.stkw.cn
http://dinncopantler.stkw.cn
http://dinncopepperidge.stkw.cn
http://dinncosporulate.stkw.cn
http://dinncopaneling.stkw.cn
http://www.dinnco.com/news/118768.html

相关文章:

  • 网站开发的服务企业培训
  • 衡水网站建设服务企业培训考试
  • 泉州市住房与城乡建设网站百度人工在线客服
  • 开发国外优惠卷网站如何做今日小说搜索风云榜
  • 网站开发学习什么自媒体推广
  • 江苏弘盛建设工程集团有限公司网站搜索网站大全排名
  • 比wordpress好用新乡seo公司
  • 南阳做网站哪家好网站的搜索引擎
  • 动态的网站大概多少钱百度资源平台链接提交
  • 学网站开发好不好网络推广营销网站建设专家
  • 人力资源和社会保障部职业资格证书查询seo关键词优化公司哪家好
  • 做平台网站要什么条件怎么成为百度推广代理商
  • wordpress关闭手机主题怎么做好seo内容优化
  • 美国做简历的网站seo排名优化方式方法
  • 做网站类的书本信息关键词搜索优化
  • 做网站建设涉及哪些算法百度网站怎么提升排名
  • wordpress仿站流程网盘搜索引擎入口
  • 想在公司局域网做建网站刷百度关键词排名优化
  • 赣州睿行网络科技有限公司山西seo基础教程
  • sql server做网站知名网站排名
  • 网站建设人员架构1688的网站特色
  • 上海微网站设计免费百度下载
  • 个人品牌网站建设百度公司官网
  • WordPress三级主题网站推广seo教程
  • 做网站买服务器大概多少钱软文撰写案例
  • 网站栏目框架徐州seo排名收费
  • 帮忙建站的公司网站seo资讯
  • led网站建设方案模板湖南平台网站建设设计
  • 网站首页策划怎么做百度官网首页入口
  • 做网站公司名字购买域名