- 浏览: 51919 次
- 性别:
- 来自: 广州
最新评论
%%%------------------------------------------------------------------- %%% 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 5391:gen_event:which_handlers(Even ... -
erlang异常--try...catch
2016-07-13 19:48 947触发异常 throw(Term) exit(Reason ... -
erlang-退出信号捕捉trap_exit
2016-07-12 09:54 1040进程链接的工作: A进程意外退出时,会产生一个退出信号。所 ... -
排序算法(六)---快速排序(交换排序)
2016-06-01 11:25 754直接排序属于交换排序 基本思想: 1:选1个基准元素(通常是 ... -
排序算法(五)---冒泡排序(交换排序)
2016-05-31 17:05 701冒泡排序属于交换排序 基本思想: 在待排序数列中,自上而 ... -
排序算法(四)---堆排序(选择排序)
2016-05-31 16:40 612堆排序:heap sort属于选择排序 堆的定义:有n个元素 ... -
排序算法(三)---直接选择排序
2016-05-27 16:34 667选择排序 基本思想: 从待排数列中,选取一个最小(或最大 ... -
排序算法(二)--希尔排序(插入排序)
2016-05-27 10:37 653希尔排序属于插入排序的一种,也称为缩小增量排序 基本思想 ... -
排序算法(一)---快速插入排序
2016-05-26 17:13 1108因为对算法这一项实在是弱爆了,对自己从零开始学习,慢慢记录过程 ... -
Erlang--随机数
2016-04-25 10:26 19791、普通随机 random:uniform(N) 2、以时间 ... -
Erlang--性能分析工具之eprof
2016-04-12 18:22 688eprof是erlang自带的一个性能分析工具,可以帮助我 ... -
Erlang监控工具(二)etop
2016-04-07 17:46 1788file:///D:/Program%20Files/er ... -
Erlang监控工具(一)observer
2016-04-05 15:17 1279Erlang系统本身携带一个图形化监控工具,它可以监控:系 ... -
Erlang--epmd
2016-03-30 14:13 614epmd Erlang Port Mapper Daemo ... -
Erlang--节点
2016-03-30 11:25 735Erlang节点 file:///D:/Program%20F ... -
小技巧收录----唯一ID
2016-03-08 14:34 923在游戏开发中,角色id或者公会id等都需要做唯一设计, ... -
Erlang--TCP学习(五)总结篇
2015-07-15 19:55 1756一、erlang socket的消息流的三种控制方式: 1 ... -
Erlang--TCP学习(四)并行web server篇
2015-07-14 20:09 683-module(tcp_parallel_server). ... -
Erlang--TCP学习(三)串行web server篇
2015-07-14 19:35 510简单web sever改进版:串行服务器,一次只接受一个连 ... -
Erlang--TCP学习(二)简单web_Server篇
2015-07-14 16:39 1031现在来写个简单的web服务器,要实现的功能是:只接受一个s ...
相关推荐
标题中的"erlang-23.2.3-1.el7.x86_64.rpm"和"erlang-23.2.1-1.el7.x86_64.rpm.rar"代表了两个不同的Erlang版本。`.rpm`文件是用于Red Hat Enterprise Linux (RHEL) 和其衍生发行版如CentOS的软件包管理格式,而`....
在标题"erlang-22.3-1.el7.x86_64.rpm"中,我们可以解读出几个关键信息: 1. **版本号**:22.3-1表示这是Erlang的一个特定版本,22.3是主版本号和次版本号,而-1可能代表修订或更新次数。 2. **操作系统兼容性**:...
erlang-24.3.3-1.el9.x86_64.rpm centos
"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...
erlang-21.3-1.el7.x86_64.rpm rabbitmq基础语言环境。
在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的安装包。这个版本的Erlang包含了必要的组件和服务,使得它能够在CentOS 7上稳定...
erlang-20.3-1.el7.centos.x86_64.rpm
erlang-24.0.3-1.el8.x86_64.rpm资源
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-erts-19.3.6.4-1.el7.x86_64.rpm
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-20.3.8.17-1.el7.centos.x86_64
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...
标题中的"erlang-19.0.4-1.el7.centos.x86_64.zip"揭示了我们讨论的是Erlang的一个特定版本——19.0.4,该版本针对的是Linux发行版CentOS 7的64位架构。Erlang的版本号通常包括主要版本号、次要版本号和补丁版本号,...
erlang-21.3.1-1.el7.x86_64.rpm
erlang-19.0.4-1.el7.centos.x86_64.rpm ,官网的正式包
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-23.1-1.el8.x86_ ,erlang官网下载很慢,所以提供该下载链接。
https://github.com/rabbitmq/erlang-rpm.git源码在centos6.8x64系统下编译的rpm文件