怎样在2D地图上实现A*a星寻路 地图编辑器

&&&&地图跨场景自动寻路
&地图跨场景自动寻路
地图跨场景自动寻路 拓扑图 最优路径算法
若举报审核通过,可奖励20下载分
被举报人:
zhang_mins999
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
网络技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
地图跨场景自动寻路
所需积分:1
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
地图跨场景自动寻路
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员A*地图寻路算法实现
来源:博客园
上一段时间在学习WPF,用到一位前辈讲解的A*地图算法,于是自己根据算法实现了一下,具体代码如下,可供大家使用,代码大家可以再优化,具体用法就不写了,注释很清楚,另外提供源码下载: 具体算法大家可参考深蓝翻译的:
 
Code
2using System.Collections.G
3using System.T
4using System.D
6namespace PathFinder
public class PathFinder
private PathNode startNode, endNode, currentN//开始点、终点、当前节点 11
private byte[,]//矩阵地图0表示可行、1表示障碍物 12
private List&PathNode& closePath, openP//
关闭列表、开启列表 13
private List&Point& bestP//最终保存最佳路径 14
private bool findSuccess = false;//是否寻路成功 15
/**//// &summary& 16
/// 开始寻路 17
/// &/summary& 18
/// &param name="map"&二维地图矩阵&/param& 19
/// &param name="startPoint"&开始坐标点&/param& 20
/// &param name="endPoint"&终点&/param& 21
/// &returns&&/returns& 22
public List&Point& FindBestPaht(byte[,] map, Point startPoint, Point endPoint) 23
closePath = new List&PathNode&(); 25
openPath = new List&PathNode&(); 26
bestPaht = new List&Point&(); 27
this.map = 28
startNode = new PathNode(startPoint.X, startPoint.Y); 29
startNode.ParentPoint = new Point(-<span style="color: #, -<span style="color: #); 30
endNode = new PathNode(endPoint.X, endPoint.Y); 31
currentNode = startN//开始节点设置为默认当前节点 32
currentNode.ParentG = currentNode.G = <span style="color: #; 33
openPath.Add(startNode);//添加到开启列表 34
TryToFindPaht(startNode);//开始寻找路径 35
if (findSuccess) 36
InsertPahtNode(endNode);//如果寻找成功,则从终点开始从关闭列表中把最近路径添加到最佳路径列表 38
return bestP 39
return null; 42
/**//// &summary& 44
/// 尝试寻路 45
/// &/summary& 46
/// &param name="node"&开始节点&/param& 47
private void TryToFindPaht(PathNode node) 48
if (openPath.Count & <span style="color: #) 50
closePath.Add(openPath[<span style="color: #]);//每次从开启列表中取第一个添加到关闭列表,注意这个列表已经是排序后的,第一个既是F值最小的 52
openPath.RemoveAt(<span style="color: #);//把该节点从开启列表中移除 53
AddOpenNode(node);//以这个节点为基准,把它四周的节点添加到开启列表中,排除障碍物、已经在开启列表或关闭列表中的 55
//当目标节点已经在开启列表中时表示寻路成功 56
if (IsInOpenPaht(endNode)) 57
closePath.Add(endNode);//将目标节点添到关闭列表中 59
endNode.ParentPoint = currentNode.P//目标节点的父节点为当前节点 60
findSuccess = true; 61
return; 62
SortPathByF();//按F值从小到大排序 64
if (openPath.Count & <span style="color: #) 65
currentNode = openPath[<span style="color: #];//从开启列表中取F值最小的作为当前节点 67
TryToFindPaht(currentNode);//递归调用,再次寻路 68
/**//// &summary& 71
/// 把当前节点四周的八个节点尝试全部添加到开启列表中 72
/// &/summary& 73
/// &param name="node"&当前节点&/param& 74
private void AddOpenNode(PathNode node) 75
AddOneOpenNode(node.X, node.Y + <span style="color: #, node.Point); 77
AddOneOpenNode(node.X, node.Y - <span style="color: #, node.Point); 78
AddOneOpenNode(node.X + <span style="color: #, node.Y, node.Point); 79
AddOneOpenNode(node.X - <span style="color: #, node.Y, node.Point); 80
AddOneOpenNode(node.X - <span style="color: #, node.Y - <span style="color: #, node.Point); 81
AddOneOpenNode(node.X - <span style="color: #, node.Y + <span style="color: #, node.Point); 82
AddOneOpenNode(node.X + <span style="color: #, node.Y + <span style="color: #, node.Point); 83
AddOneOpenNode(node.X + <span style="color: #, node.Y - <span style="color: #, node.Point); 84
/**//// &summary& 86
/// 添加一个新节点到开启列表中 87
/// &/summary& 88
/// &param name="x"&新节点X坐标&/param& 89
/// &param name="y"&新节点Y坐标&/param& 90
/// &param name="point"&父节点坐标&/param& 91
private void AddOneOpenNode(int x, int y, Point point) 92
PathNode node = new PathNode(x, y); 94
//添加前提是:x、y在当前地图二维矩阵范围内、且是可行路径、不再关闭列表中也不再开启列表中 95
if (x &= <span style="color: # && y &= <span style="color: # && x &= map.GetUpperBound(<span style="color: #) && y &= map.GetUpperBound(<span style="color: #) && map[y, x] == <span style="color: # && !IsInClosePaht(node) && !IsInOpenPaht(node)) 96
node.X = 98
node.Y = 99
node.ParentPoint =// 新节点的父节点为当前节点<span style="color: #0
node.ParentG = currentNode.G;//记录新节点的父节点G值、以便与当前节点做比较<span style="color: #1
node.G = (currentNode.X == node.X || currentNode.Y == node.Y ? <span style="color: # : <span style="color: #) + node.ParentG;//当前节点的G值为父节点G值+10(非对角线)或14 (对角线)<span style="color: #2
node.H = <span style="color: # * (Math.Abs(endNode.X - node.X) + Math.Abs(endNode.Y - node.Y));//更新H值<span style="color: #3
openPath.Add(node);<span style="color: #4
}<span style="color: #5
}<span style="color: #6
/**//// &summary&<span style="color: #7
/// 从关闭列表中,从目标点开始倒着查找所有父节点并将其添加到最佳路径中<span style="color: #8
/// &/summary&<span style="color: #9
/// &param name="node"&&/param&<span style="color: #0
private void InsertPahtNode(PathNode node)<span style="color: #1
{<span style="color: #2
bestPaht.Insert(<span style="color: #, node.Point);<span style="color: #3
foreach (PathNode item in closePath)<span style="color: #4
{<span style="color: #5
if (item.Point == node.ParentPoint)<span style="color: #6
InsertPahtNode(item);<span style="color: #7
}<span style="color: #8
}<span style="color: #9
/**//// &summary&<span style="color: #0
/// 按F值从小到大排序<span style="color: #1
/// &/summary&<span style="color: #2
private void SortPathByF()<span style="color: #3
{<span style="color: #4
for (int i = <span style="color: #; i & openPath.C i++)<span style="color: #5
{<span style="color: #6
for (int j = <span style="color: #; j & openPath.Count - i - <span style="color: #; j++)<span style="color: #7
{<span style="color: #8
if (openPath[j].F & openPath[j + <span style="color: #].F)<span style="color: #9
{<span style="color: #0
PathNode temp = openPath[j + <span style="color: #];<span style="color: #1
openPath[j + <span style="color: #] = openPath[j];<span style="color: #2
openPath[j] =<span style="color: #3
}<span style="color: #4
}<span style="color: #5
}<span style="color: #6
}<span style="color: #7
/**//// &summary&<span style="color: #8
/// 判断某个阶段是否在关闭列表中<span style="color: #9
/// &/summary&<span style="color: #0
/// &param name="node"&&/param&<span style="color: #1
/// &returns&&/returns&<span style="color: #2
private bool IsInClosePaht(PathNode node)<span style="color: #3
{<span style="color: #4
foreach (PathNode item in closePath)<span style="color: #5
{<span style="color: #6
if (item.X == node.X && item.Y == node.Y)<span style="color: #7
return true;<span style="color: #8
}<span style="color: #9
return false;<span style="color: #0
}<span style="color: #1
/**//// &summary&<span style="color: #2
/// 判断某个节点是否在开启列表中<span style="color: #3
/// &/summary&<span style="color: #4
/// &param name="node"&&/param&<span style="color: #5
/// &returns&&/returns&<span style="color: #6
private bool IsInOpenPaht(PathNode node)<span style="color: #7
{<span style="color: #8
foreach (PathNode item in openPath)<span style="color: #9
{<span style="color: #0
if (item.X == node.X && item.Y == node.Y)<span style="color: #1
return true;<span style="color: #2
}<span style="color: #3
return false;<span style="color: #4
}<span style="color: #5
}<span style="color: #6
/**//// &summary&<span style="color: #7
/// 定义节点类<span style="color: #8
/// &/summary&<span style="color: #9
public class PathNode<span style="color: #0
{<span style="color: #1
public PathNode(int x, int y)<span style="color: #2
{<span style="color: #3
this.X =<span style="color: #4
this.Y =<span style="color: #5
}<span style="color: #6
/**//// &summary&<span style="color: #7
/// 节点坐标<span style="color: #8
/// &/summary&<span style="color: #9
public Point Point { get { return new Point(X,Y); } }<span style="color: #0
/**//// &summary&<span style="color: #1
父节点坐标<span style="color: #2
/// &/summary&<span style="color: #3
public Point ParentPoint { get; set; }<span style="color: #4
/**//// &summary&<span style="color: #5
/// X坐标点<span style="color: #6
/// &/summary&<span style="color: #7
public int X { get; set; }<span style="color: #8
/**//// &summary&<span style="color: #9
/// Y坐标点<span style="color: #0
/// &/summary&<span style="color: #1
public int Y { get; set; }<span style="color: #2
/**//// &summary&<span style="color: #3
/// F值=G+H<span style="color: #4
/// &/summary&<span style="color: #5
public int F { get { return G + H; } }<span style="color: #6
/**//// &summary&<span style="color: #7
/// G值,即从起始节点到当前节点的距离,直线规定为10,对角线规定为14<span style="color: #8
/// &/summary&<span style="color: #9
public int G { get; set; }<span style="color: #0
/**//// &summary&<span style="color: #1
/// 从当前节点到目标节点纵向坐标距离和横向坐标距离之和<span style="color: #2
/// &/summary&<span style="color: #3
public int H { get; set; }<span style="color: #4
/**//// &summary&<span style="color: #5
/// 该节点父节点的G值<span style="color: #6
/// &/summary&<span style="color: #7
public int ParentG { get; set; }<span style="color: #8
}<span style="color: #9}<span style="color: #0&#13;
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动2D游戏地图的寻路实现_论文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。
2D游戏地图的寻路实现
||文档简介
中国最大最早的专业内容网站|
总评分0.0|
&&对2D游戏领域的地图寻路算法进行了研究。阐述了A*寻路算法和D*寻路算法,并在BlitzBasic2D游戏开发平台仿真实现了2种路径搜索算法。实验结果表明:A*算法适合在静态地图中搜索路径,而D*算法在动态地图中搜索路径更迅速、有效,且随着结点数量的增加,D*算法优于A*算法。
试读已结束,如果需要继续阅读或下载,敬请购买
定制HR最喜欢的简历
你可能喜欢2229人阅读
高德地图(3)
#import &ViewController.h&
#import &MAMapKit/MAMapKit.h&
#import &CustomAnnotationView.h&
#import &CustomCalloutView.h&
@interface
ViewController ()&MAMapViewDelegate&
@property(nonatomic,
strong)MAMapView *mapV
@implementation ViewController
-(void)viewDidAppear:(BOOL)animated
& & [super viewDidAppear:animated];
&& & *cocoapods导入高德地图包
&& & *更改plist配置
&& & *为了能正常调起高德地图App的功能plist里增加:
& & & & & & & & & & &key&LSApplicationQueriesSchemes&/key&
& & & & & & & & & & &array&
& & & & & & & & & & &string&iosamap&/string&
& & & & & & & & & & &/array&
&& & 字段.
#warning 1.首先声明MAPointAnnotation
来确定大头针位置及点击大头针弹出气泡的内容(默认只有title和subtitle)
&& & 每一个大头针里面都自带一个calloutView
点击就显示出来,我们设置MApointAnnotation实质上是在设置callout内容和大头针的位置,不过自定义了气泡的话则需要从新给气泡的其他属性赋&#20540;,在customAnnotationview里有写到
//间接制作弹出气泡(相当于
给cell赋&#20540;的Model) ,如果自定义气泡则需要单独给定义的气泡写其他赋&#20540;的属性(除这两个之外的)
& & MAPointAnnotation *pointAnnotation = [[MAPointAnnotation
alloc]init];
& & pointAnnotation.coordinate =
CLLocationCoordinate2DMake(39.989631,
116.481018);
& & pointAnnotation.title =
& & pointAnnotation.subtitle =
& & MAPointAnnotation *pointAnnotation1 = [[MAPointAnnotation
alloc]init];
& & pointAnnotation1.coordinate =
CLLocationCoordinate2DMake(40.389631,
116.481018);
& & pointAnnotation1.title =
& & pointAnnotation1.subtitle =
& & MAPointAnnotation *pointAnnotation2 = [[MAPointAnnotation
alloc]init];
& & pointAnnotation2.coordinate =
CLLocationCoordinate2DMake(36.989631,
116.481018);
& & pointAnnotation2.title =
& & pointAnnotation2.subtitle =
& & MAPointAnnotation *pointAnnotation3 = [[MAPointAnnotation
alloc]init];
& & pointAnnotation3.coordinate =
CLLocationCoordinate2DMake(39.989631,
116.081018);
& & pointAnnotation3.title =
& & pointAnnotation3.subtitle =
@&&#21564;&#21564;&;
& & //添加给mapView
& & [_mapView addAnnotations:@[pointAnnotation, pointAnnotation1,pointAnnotation2,pointAnnotation3]];
- (void)viewDidLoad {
& & [super
viewDidLoad];
#warning 2.初始化
添加到View
& & //初始化一个地图View(可以理解成是一个tableView)
& & _mapView = [[MAMapView
alloc]initWithFrame:self.view.frame];
//代理千万别忘了签
& & _mapView.delegate =
//& & _mapView.language = MAMapLanguageEn;//可以设置语言!
& & //添加到View上
& & [self.view
addSubview:_mapView];
& & //地图logo
& & _mapView.logoCenter =
_mapView.logoCenter =
CGPointMake(CGRectGetWidth(self.view.bounds)-55,
& & //指南针
& & _mapView.showsCompass=
// 设置成NO表示关闭指南针;YES表示显示指南针
& & _mapView.compassOrigin=
CGPointMake(_mapView.compassOrigin.x,
//设置指南针位置
& & //比例尺
& & _mapView.showsScale =
YES;//设置成NO表示不显示比例尺;YES表示显示比例尺
& & _mapView.scaleOrigin=
CGPointMake(_mapView.scaleOrigin.x,
//设置比例尺位置
& & //可以添加手势
&& & iOS SDK支持对选定的屏幕地图区域(CGRect)进行截屏,截取的内容包括:地图、地图覆盖物、弹出气泡。
&& & 说明:地图截屏功能依赖于地图显示,即:只有内容先显示在地图上,才能进行截屏。
&& & 使用 MAMapView
中的 takeSnapshotInRect
方法进行截屏,该方法返回UIImage对象
& & CGRect inRect =
CGRectMake(80,142,160,284);
& & UIImage *screenshotImage = [_mapView
takeSnapshotInRect:inRect];
& & //实时交通图
//& & _mapView.showTraffic = YES;
//构造折线数据对象
& & CLLocationCoordinate2D commonPolylineCoords[4];
& & commonPolylineCoords[0].latitude =
39.832136;
& & commonPolylineCoords[0].longitude =
116.34095;
& & commonPolylineCoords[1].latitude =
39.832136;
& & commonPolylineCoords[1].longitude =
116.42095;
& & commonPolylineCoords[2].latitude =
39.902136;
& & commonPolylineCoords[2].longitude =
116.42095;
& & commonPolylineCoords[3].latitude =
39.902136;
& & commonPolylineCoords[3].longitude =
116.44095;
& & //构造折线对象
& & MAPolyline *commonPolyline = [MAPolyline
polylineWithCoordinates:commonPolylineCoords
//在地图上添加折线对象,然后去实现代理方法2
& & [_mapView addOverlay: commonPolyline];
//还可构造多边形
圆 大地曲线
图片覆盖物
//还可设置自定义图层
这些都在开发指南上有详细的例子
#warning 3.添加大头针
#pragma mark - 添加视图内的大头针
-(MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id&MAAnnotation&)annotation
{//相当于tableView的cellForRow方法,可以实现重用的
& & if ([annotation
isKindOfClass:[MAPointAnnotation
class]]) {
& & & & static NSString *pointReuseIndentifier =
@&pointReuseIndentifier&;
制作一个大头针,相当于cell&还可以自定义,具体实现参考开发指南&
//& & & & MAPinAnnotationView *annotationView = (MAPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
//& & & & if (annotationView == nil) {
//& & & & & & annotationView = [[MAPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
//& & & & }
#warning 4.自定义气泡
需要自定义大头针继承MAAnnotationView或MAPinAnnotationView。若继承MAAnnotationView,则需要设置标注图标;若继承MAPinAnnotationView,使用默认的大头针标注。
& & & & /**
& & & & 因为继承了AnnotationView所以会有annotation这个属性,第1
步设置会把&#20540;传给annotation(推测),所以把我们自定义的title和subtitle等于annotation.title和subtitle就行了,自定义的其他属性单独赋&#20540;就好
& & & & */
//& & & & 自定义制作一个大头针,相当于cell&还可以自定义,具体实现参考开发指南&
& & & & CustomAnnotationView *annotationView = (CustomAnnotationView *)[_mapView
dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
& & & & if (annotationView ==
& & & & & & annotationView = [[CustomAnnotationView
alloc]initWithAnnotation:annotation
reuseIdentifier:pointReuseIndentifier];
& & & & //默认
设置大头针属性
//& & & & annotationView.canShowCallout = YES;//能弹出气泡
//& & & & annotationView.animatesDrop = YES;//动画效果
//& & & & annotationView.draggable = YES;//可移动
//& & & & annotationView.pinColor = MAPinAnnotationColorP
& & & & //默认
把大头针变图片
//& & & & annotationView.image = [UIImage imageNamed:@&IMG_7476.jpg&];//设置图片的
//设置中心点偏移,使得标注底部中间点成为经纬度对应点
//& & & & annotationView.centerOffset = CGPointMake(0, -18);
& & & & //自定义的大头针
& & & & annotationView.draggable =
& & & & annotationView.canShowCallout =
NO;//如果自定义了callout就要关掉自带的
& & & & annotationView.image1 = [UIImage
imageNamed:@&IMG_7476.jpg&];
& & & & return annotationV
& & return
#pragma mark - 协议中的mapView:viewForOverlay:回调函数,设置折线的样式
-(MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id&MAOverlay&)overlay
& & if ([overlay isKindOfClass:[MAPolyline
& & & & MAPolylineView *polylineView = [[MAPolylineView
alloc] initWithPolyline:overlay];
& & & & polylineView.lineWidth =
& & & & polylineView.strokeColor = [UIColor
colorWithRed:0
blue:1 alpha:0.6];
& & & & return polylineV
& & return
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31786次
排名:千里之外
原创:32篇
转载:17篇
(2)(4)(2)(1)(3)(5)(6)(2)(4)(14)(7)

我要回帖

更多关于 unity2d寻路 的文章

 

随机推荐