- 浏览: 49199 次
- 性别:
- 来自: 广州
最新评论
%%%------------------------------------------------------------------- %%% Module : astar_trace %%% Author : %%% Description : A星寻路算法 %%%------------------------------------------------------------------- -module(astar_trace). -export([generate_route/8,generate_route/7,generate_route/5])。 -define(EXPAND_POINTS(X,Y),[{X-1,Y},{X-1,Y-1},{X ,Y-1},{X+1,Y-1},{X+1,Y},{X+1,Y+1},{X,Y+1},{X-1,Y+1}]). %% 扩展查找的点 -record(point, {x = 0, y = 0, g = 0, h = 0, f = 0, p_x = 0, p_y = 0}). generate_route(StartX,StartY,TargetX,TargetY,SceneId) -> generate_route(StartX,StartY,TargetX,TargetY,SceneId,50,50). generate_route(StartX,StartY,TargetX,TargetY,SceneId,MaxTraceRangeX,MaxTraceRangeY) -> generate_route(StartX,StartY,TargetX,TargetY,SceneId,MaxTraceRangeX,MaxTraceRangeY,0). generate_route(StartX,StartY,TargetX,TargetY,SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying) -> %% 初始化开始点坐标 CostH = calculate_cost(StartX,StartY,TargetX,TargetY), CostG = 0, OpenPoints = [#point{x=StartX, y=StartY, g=CostG,h=CostH,f = CostG + CostH}], %% 目标点坐标 case search(OpenPoints,[],#point{x = TargetX, y = TargetY},SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying) of false -> false; {Point,ResultOpenPoints,ResultClosePoints} -> PosList = [{P#point.x, P#point.y}||P <- generate_solution(Point,[],ResultClosePoints ++ ResultOpenPoints)], PosList end. %% 查找目标点 %% param: OpenPoints 扩充列表,closePoints 已遍历列表,TargetPoint 目标点 search([],_ClosePoints,_TargetPoint,_SceneId,_MaxTraceRangeX,_MaxTraceRangeY,_Flying)-> false; search(OpenPoints,ClosePoints,TargetPoint,SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying)-> [Point | NewOpenPoints] = lists:keysort(#point.f, OpenPoints), NewClosePoints = [Point | ClosePoints], case is_target(Point,TargetPoint) of true-> {Point,NewOpenPoints,NewClosePoints}; false -> %% 未找到, AddOpenPoints = expand(NewOpenPoints,NewClosePoints,Point,TargetPoint,SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying), %% 坐标点扩充 search(AddOpenPoints ++ NewOpenPoints,NewClosePoints,TargetPoint,SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying) end. %% 坐标点扩充 expand(OpenPoints,ClosePoints,#point{x=X, y=Y, g=G},#point{x = TargetX,y = TargetY},SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying) -> CostG = G + 1, F = fun({X1,Y1},AccIn) -> case is_blocked(X1,Y1,TargetX,TargetY,SceneId,MaxTraceRangeX,MaxTraceRangeY,Flying) of true -> AccIn; false -> case [true || #point{x = OpentX,y = OpentY} <- OpenPoints,OpentX == X1, OpentY == Y1] of [] -> case [true || #point{x = CloseX,y = CloseY} <- ClosePoints , CloseX == X1, CloseY == Y1] of [] -> CostH = calculate_cost(X1,Y1,TargetX,TargetY), [#point{x = X1,y = Y1,g = CostG,h = CostH,f = CostH + CostG,p_x = X,p_y = Y} | AccIn]; _ -> %% 已在 close 列表 中不加 AccIn end; _ -> %% 已在 opent 列表 中不加 AccIn end end end, lists:foldl(F,[],?EXPAND_POINTS(X,Y)). %% 生成结果列表 generate_solution(#point{p_x = X,p_y = Y} = Point,SolutionPoints,Points)-> case [Info || #point{x = X2,y = Y2} = Info <- Points, X2 == X, Y2 == Y] of [] -> SolutionPoints; [NewPoint | _] -> generate_solution(NewPoint,[Point | SolutionPoints],lists:delete(NewPoint,Points)) end. %% 权重计算 calculate_cost(X1,Y1,X2,Y2) -> ((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)). %% 是否到达目标点了,到达目标周围点就可以了 is_target(#point{x = StartX,y = StartY}, #point{x = TargetX, y = TargetY}) -> StartX == TargetX andalso StartY == TargetY. %% abs(StartX - TargetX) =< 1 andalso abs(StartY - TargetY) =<1. %% check is block is_blocked(X,Y,TargetX,TargetY,SceneId,MaxTraceRangeX,MaxTraceRangeY,_Flying)-> case abs(TargetX - X) > MaxTraceRangeX orelse abs(TargetY - Y) > MaxTraceRangeY of true -> %% 在查找范围外,作为阻档处理 true; false -> %% 在查找范围内 not is_block(SceneId, X, Y) end. is_block(_SceneId, _X, _Y) -> false.
发表评论
文章已被作者锁定,不允许评论。
-
erlang--常用内建函数收录
2016-07-15 15:43 4691:gen_event:which_handlers(Even ... -
erlang异常--try...catch
2016-07-13 19:48 886触发异常 throw(Term) exit(Reason ... -
erlang-退出信号捕捉trap_exit
2016-07-12 09:54 999进程链接的工作: A进程意外退出时,会产生一个退出信号。所 ... -
排序算法(六)---快速排序(交换排序)
2016-06-01 11:25 712直接排序属于交换排序 基本思想: 1:选1个基准元素(通常是 ... -
排序算法(五)---冒泡排序(交换排序)
2016-05-31 17:05 659冒泡排序属于交换排序 基本思想: 在待排序数列中,自上而 ... -
排序算法(四)---堆排序(选择排序)
2016-05-31 16:40 570堆排序:heap sort属于选择排序 堆的定义:有n个元素 ... -
排序算法(三)---直接选择排序
2016-05-27 16:34 622选择排序 基本思想: 从待排数列中,选取一个最小(或最大 ... -
排序算法(二)--希尔排序(插入排序)
2016-05-27 10:37 605希尔排序属于插入排序的一种,也称为缩小增量排序 基本思想 ... -
排序算法(一)---快速插入排序
2016-05-26 17:13 1063因为对算法这一项实在是弱爆了,对自己从零开始学习,慢慢记录过程 ... -
Erlang--随机数
2016-04-25 10:26 19331、普通随机 random:uniform(N) 2、以时间 ... -
Erlang--性能分析工具之eprof
2016-04-12 18:22 650eprof是erlang自带的一个性能分析工具,可以帮助我 ... -
Erlang监控工具(二)etop
2016-04-07 17:46 1717file:///D:/Program%20Files/er ... -
Erlang监控工具(一)observer
2016-04-05 15:17 1205Erlang系统本身携带一个图形化监控工具,它可以监控:系 ... -
Erlang--epmd
2016-03-30 14:13 561epmd Erlang Port Mapper Daemo ... -
Erlang--节点
2016-03-30 11:25 703Erlang节点 file:///D:/Program%20F ... -
小技巧收录----唯一ID
2016-03-08 14:34 869在游戏开发中,角色id或者公会id等都需要做唯一设计, ... -
Erlang--TCP学习(五)总结篇
2015-07-15 19:55 1714一、erlang socket的消息流的三种控制方式: 1 ... -
Erlang--TCP学习(四)并行web server篇
2015-07-14 20:09 609-module(tcp_parallel_server). ... -
Erlang--TCP学习(三)串行web server篇
2015-07-14 19:35 464简单web sever改进版:串行服务器,一次只接受一个连 ... -
Erlang--TCP学习(二)简单web_Server篇
2015-07-14 16:39 1000现在来写个简单的web服务器,要实现的功能是:只接受一个s ...
相关推荐
rabbitmq-server-3.8.17-1.el8.noarch.rpm可用的erlang
erlang-24.3.3-1.el9.x86_64.rpm centos
erlang-asn1-19.3.6.4-1.el7.x86_64.rpm
erlang-19.3.2
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
包括erlang-23.3.4.3-1.el7.x86_64.rpm和rabbitmq-server-3.8.17-1.el7.noarch.rpm以及安装步骤
erlang-21.3-1.el7.x86_64.rpm rabbitmq基础语言环境。
该软件版本是erlang-19.0.4-1.el6.x86_64,收藏与此,希望能帮助到有用的人.
erlang-xmerl-22.2.3-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...
erlang-19.0.4-1.el7.centos.x86_64.rpm ,官网的正式包
erlang-23.1-1.el8.x86_ ,erlang官网下载很慢,所以提供该下载链接。
https://github.com/rabbitmq/erlang-rpm.git源码在centos6.8x64系统下编译的rpm文件
erlang-21.3.7.1-1.el7.x86_64.rpm rabbitmq基础语言环境。
在CentOS7上能满足RabbitMQ版本需要的erlang安装包。 安装命令: sudo yum install erlang-20.3-1.el7.centos.x86_64.rpm
erlang-xmerl-22.2.2-1.el7.x86_64.rpm 免费下载0积分镜像下载。rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和...
rabbitMQ安装需要依赖erlang环境,这里提供centOS erlang21.3.1版本免费下载,适用于rabbitMQ对应版本
erlang-22.1.4-1.el7.x86_64.rpm rabbitmq基础语言环境。
erlang 安装包。 rabbitmq 安装所需要的
erlang-21.3.8.15-1.el7.x86_64.rpm
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模...文件(erlang-23.1.1-1.el7.x86_64.rpm)是Erlang语言是安装包,rpm包可直接在CentOS上安装。