• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 在多个网格A寻路

在多个网格A寻路

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了导航网格寻路算法,导航网格寻路效率,导航网格寻路,网格寻路,unity网格寻路等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:在多个网格A寻路
描述:

我正尝试着在一个cube周围执行A*寻路,这个cube是由6个网格组成的,为了保持简单,我用了四个函数:GetXPlus, GetXMinus, GetYPlus, GetYMinus。每个函数检查下一个砖块是否在最近的网格空间之内,如果不是就切换到相应的网格。
我遇到的问题是:当试图从当前网格翻转到其他方式的网格获得砖块时,返回的砖块是在相对的一侧。是否有方法让我避免为每个单个原有网格和方向写特定逻辑?
为了阐明我的问题,下图源自网格(紫色),使用GetXPlus函数:
三角形网格寻路算法,导航网格寻路,导航网格寻路算法,寻路,上古世纪自动寻路,寻路电视剧全集,寻路电视剧在线观看,寻路中国,寻路者,寻路电视剧全集优酷,书山寻路,一条蛇的寻妻路,电视剧寻路,寻路下

目前执行的snippit (每格64*64):

public Tile GetXPlus( int currentX, int currentY )
{
    var newX = currentX + 1;
    var tile = GetTile( newX , currentY );

    if( newX > 64 ) //Get adjacent XPlus Grid 
    { 
        currentGrid = SetCurrentGrid( XPlusGridIndex );
        tile = GetTile( newX - 64, currentY );
    }

    return tile;
}

背景
这个实现源自于另一个问题的回答:
http://gamedev.stackexchange.com/questions/53866/pathfinding-on-a-uneven-planetary-surface

原文:A* Pathfinding over multiple grids


解决方案1:

来自@Corniel Nobel 的回答:

我建议你可以比先前的答案走的更远。创建一个cube代表所有的砖块,你要缓存每个砖块周围的东西。砖块之间的关系是固定的,这能给你节省不少时间。
之后亦可以用double[,,] 或者int[,,,] 跟踪你处理的砖块,并在此基础上添加邻近物到Queue.
如果需要你也可以执行GetDirection(Tile tile)。那个函数只需要在方向dictionary上搜寻。

public class Cube { private Tile[,,] tiles;
    public Cube(int size)
    {
        tiles = new Tile[size, size, 6];

        // initialize.
        for (var side = 0; side < 6; side++)
        {
            for (var x = 0; x < size; x++)
            {
                for (var y = 0; y < size; y++)
                {
                    tiles[x, y, side] = new Tile(x, y, side);
                }
            }
        }

        // set directions & neighbors
        for (var side = 0; side < 6; side++)
        {
            for (var x = 0; x < size; x++)
            {
                for (var y = 0; y < size; y++)
                {
                    // todo: implement.
                }
            }
        }
    }

    public Tile this[int x, int y, int side]
    {
        get
        {
            return tiles[x, y, side];
        }
    }
}

public class Tile
{
    private Dictionary<DirectionType, Tile> directions = new Dictionary<DirectionType, Tile>();

    private Tile[] neighbors = new Tile[4];

    public Tile(int x, int y, int side)
    {
        this.X = x;
        this.Y = y;
        this.Side = side;
    }

    public int X { get; private set; }
    public int Y { get; private set; }
    public int Side { get; private set; }

    public Tile this[DirectionType dir]
    {
        get
        {
            return directions[dir];
        }
    }



    public Tile[] Neighbors { get { return neighbors; } }
}

public enum DirectionType
{
    // delta: +1, 0
    e,
    // delta: 0, +1
    n,
    // delta: -1, 0
    w,
    // delta: 0, -1
    s,
    // delta: 0, 0
    X
}

来自@Tilo 的回答:

你可以使用函数映射,从X Y Z坐标以及砖块组成的3D空间到另一个。
执行个命令:

enum TileBorder
{
    Left   = 0,
    Top    = 1,
    Right  = 2,
    Bottom = 3
}

你可以在Tile class数组里存储这些改变:

class Tile
{
    public Tile[] Neighbors { get; set; }
    public Func<int, int, int>[] XTransitions { get; set; }
    public Func<int, int, int>[] YTransitions { get; set; }

    public void GetXPlus(int x, int y, out int newX, out int newY, out Tile newTile)
    {
        x++;
        if (x <= 64)
        {
            newX = x;
            newY = y;
            newTile = this;
        }
        else
        {
            newX = XTransitions[(int)TileBorder.Right](x, y);
            newY = YTransitions[(int)TileBorder.Right](x, y);
            newTile = Neighbors[(int)TileBorder.Right];
        }
    }
    // ...
}

接下来你只需要在建立结构的时候注意一下就可以了。例如:这是你设置绿色砖块的方法,假设坐标包含1到64.

Tile pink   = new Tile();
Tile green  = new Tile();
Tile orange = new Tile();
Tile purple = new Tile();
Tile blue   = new Tile();

green.Neighbors = new Tile[] 
{ 
    /* left */   orange, 
    /* top */    pink,
    /* right */  blue,
    /* bottom */ purple 
};

green.XTransitions = new Func<int, int, int>[] 
{
    /* left */   (x, y) => 1, 
    /* top */    (x, y) => x,
    /* right */  (x, y) => 64,
    /* bottom */ (x, y) => x 
};

green.YTransitions = new Func<int, int, int>[] 
{
    /* left */   (x, y) => 65 - y, 
    /* top */    (x, y) => 64,
    /* right */  (x, y) => 65 - y,
    /* bottom */ (x, y) => 1
};

注意砖块转变函数只是一个查找,为了充分灵活你也可以使用下面这些类型的函数:

  • X轴:Func<int, int, Tile, int>
  • Y轴:Func<int, int, Tile, int>
  • Z轴:Func<int, int, Tile, Tile>


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 在多个网格A寻路

相关文章

  • 2017-06-07 如何理解javascript正则“反向引用”
  • 2017-06-07 百度地图移动apiPC端API和移动端API有什么不同吗?
  • 2017-06-07 七牛云存储使用流程android上传完视频或者图片会返回地址吗,网站怎么调用这些资源
  • 2017-06-07 python协程练习部分代码的理解?
  • 2017-06-07 关于jquerysizzle中正则表达式的问题
  • 2017-06-07 七牛云存储七牛云存储绑定自定义HTTPS域名费用如何计算?
  • 2017-06-07 sublime接收python输入命令
  • 2017-06-07 关于win10系统运行Debug
  • 2017-06-07 投一颗炸弹,要炸中地图上尽可能多坐标,有什么高效的算法
  • 2017-06-07 python值相同,列分别相加?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请教一个Python爬虫信息提取问题
    • 感觉tiger这个项目很好,我也很喜欢强一致性的东西~问几个急需的问题
    • (laravel)如何理解servicelocator和dependenceinject
    • 可以用wxchooseImage上传到第三方CDN吗?
    • python爬虫多线程queue,如何使用生产者队列,使需要用循环获取的url持续放入?
    • 管理后台的内容管理出了问题
    • 七牛上传视频文件,用vsample接口生成多张缩略图,视频文件小的时候成功,视频文件较大时候无法生产缩略图
    • Mac下golang编译出错
    • 求一个Python监控脚本!
    • Flaskweb开发中的关于在服务器上处理富文本的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有