在游戏中,一般使用正方形网格管理二维场景中的各种物体,这种网格简单快速,但缺点就是相邻网格的间距是不均匀的,因为对角相邻的网格的间距要比左右相邻的间距要大。

一个解决方法是使用蜂窝状的六边形网格代替正方形网格,六边形相邻网格之间的距离是固定的,这个特性带来的好处显而易见,当我们需要通过网格广播消息时,六边形网格所覆盖的范围更加接近均匀。事实上,六边形网格的实际应用范围很广,比如无线通讯在塔台的覆盖范围计算上,就是使用的六边形网格,这也是手机也被被称为“蜂窝式移动电话”的原因。

六边形网格的间距是一致的

与正方形相比,六边形网格的计算要复杂一些,首先要解决的就是定位算法,也就是给出一个点的坐标,需要定位该点所在网格。如果使用正方形网格,一个除法就可以解决,但在六边形网格中,则要麻烦一些,我从网上搜了一些相关的文章,比如这里、这里和这里。而下面则是我给出的一个比较快速的算法。

首先是定义一下在一个场景中如何表达六边形网格系统中的“坐标”,如下图所示,在六边形网格中,仍然使用二维的x,y坐标定位一个网格,而且假设左上角第一个六边形为(0,0),中心点位于原点上。

然后按照下图所示,将网格划分成一个个矩形,可以看出,这些矩形有两种类型,分别是A和B。

开始计算式,先确定某点所在的矩形网格,这非常容易,但每个矩形跨越了两个相邻的六边形,如何确定该点所属的六边形呢?其实仔细观察一下可以发现一个窍门

以A类型为例,不难发现,中间的分割线恰好就是两个六边形中心连接线的垂直分割线,所以对于点P来说,如果PA

// 六边形网格定位//@param xPos 输入,所需查询的点的x坐标//@param yPos 输入,所需查询的点的y坐标//@param cell_x 输出,改点所在网格的x坐标//@param cell_y 输出,改点所在网格的y坐标voidgetHotCell(intxPos,intyPos,int&cell_x,int&cell_y){#defineCELL_BORDER(40)//六边形边长#defineGRID_WIDTH(CELL_BORDER*1.5f)#defineGRID_HEIGHT(CELL_BORDER*0.8660254f)// sqr(3)/2=0.8660254#defineTEMP_1((GRID_WIDTH*GRID_WIDTH–GRID_HEIGHT*GRID_HEIGHT)/2.f)#defineTEMP_2((GRID_WIDTH*GRID_WIDTH+GRID_HEIGHT*GRID_HEIGHT)/2.f)cell_y=(int)(yPos/GRID_HEIGHT);floaty=yPos-cell_y*GRID_HEIGHT;cell_x=(int)(xPos/GRID_WIDTH);floatx=xPos-cell_x*GRID_WIDTH;if((cell_x+cell_y)&1){if(x*GRID_WIDTH-y*GRID_HEIGHT>TEMP_1)cell_x++;}else{if(x*GRID_WIDTH+y*GRID_HEIGHT>TEMP_2)cell_x++;}cell_x=(cell_x+(1-(cell_y&1)))/2;}

代码中的计算并不复杂,稍微推导一下就能出来,下面是我写的一个用javascript的实现,可以直接用鼠标查询(使用Reader看不到的同学请点这里)

这篇文章发布于 2011年04月11日,星期一,00:07,归类于 未分类。 您可以跟踪这篇文章的评论通过 RSS

2.0 feed。 您可以留下评论,或者从您的站点trackback。

gis 六边形网格_六边形网格快速定位相关推荐

  1. mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?

    概述 如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下... 主要是了解如何定位的思路,具体看官网 ...

  2. java如何实现系统定位_如何快速定位到系统中某一功能的具体实现

    需求描述 我们有时候需要阅读查询某个系统功能是怎么实现的,以达到更了解这个系统某一操作的具体实现原理,帮助我们快速理解程序和快速调试. 系统是采用传统的架构Struts2+Spring+ hibern ...

  3. mysql怎么定位错误信息_如何快速定位MySQL 的错误日志(Error Log)?

    日志文件是MySQL数据库的重要组成部分,包括有6种不同的日志文件: 错误日志: -log-err 查询日志: -log 慢查询日志: -log-slow-queries 更新日志: -log-upd ...

  4. 定位插件_微创新 | 开发PL/SQL插件,快速定位所需字段

    点击上方蓝字?加入我们吧!成果ID:96749项目简介 PL/SQL Developer是公司数据支撑人员常年使用的数据库操作软件,提供了众多便利的功能.但同时还有一些地方可以优化,使其更适合我们的使 ...

  5. python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

    在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲 ...

  6. sql server datetime取年月_快速定位数据库性能问题,RDS推出慢SQL统计分析

    在使用云的过程中,哪些指标最重要,是安全.弹性,还是计算能力? 其实这些都很关键.除此之外,云最重要的就是数据库了.数据库的性能直接关系到系统执行的效率和稳定性,更与业务紧密相关.如果数据库出现性能问 ...

  7. xtragrid 某个值 查找_二分查找(下):如何快速定位IP对应的省份地址?

    通过IP地址来查找IP归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个IP地址,就会看到它的归属地. 这个功能并不复杂,它是通过维护一个很大的IP地址库来实现 ...

  8. pycharm 最上面的快速定位标签_受用一生的高效 PyCharm 使用技巧(四)

    原标题:受用一生的高效 PyCharm 使用技巧(四) 大家好,距离最近一篇 PyCharm 使用技巧的文章已经过去一月有余,最近虽然也比较忙,但是一直没忘记录下一些我觉得值得分享的小tip.这个系列 ...

  9. Swift之实现表格UITableView数据首字母顺序排列展示并添加“索引”快速定位查找功能

    整理数据 获取汉字拼音的首字母 /**获取汉字拼音的首字母, 返回的字母是大写形式, 例如: @"俺妹", 返回 @"A".*如果字符串开头不是汉字, 而是字母 ...

  10. 推荐一个快速定位深度学习代码bug的炼丹神器!

    文 | McGL 源 | 知乎 写深度学习网络代码,最大的挑战之一,尤其对新手来说,就是把所有的张量维度正确对齐.如果以前就有TensorSensor这个工具,相信我的头发一定比现在更浓密茂盛! Te ...

最新文章

  1. 解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法
  2. 汇编指令mrs_汇编指令 - Mrs.kang - 博客园
  3. Apache Commons组件集合
  4. 【机器学习算法-python实现】svm支持向量机(2)—简化版SMO算法
  5. shell自动安装mysql_RPM包安装mysql,采用shell脚本实现自动安装、配置与卸载
  6. 课堂练习——最大联通之数组
  7. redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
  8. nacos使用_使用Nacos的CMDB实现微服务的就近访问!
  9. python基础(正则表达式)
  10. 不要学习代码,要学会思考(转)
  11. Hanlp中自定义词典的配置、引用以及问题解决
  12. 称重管理系统如何修改重量_无人值守称重系统硬件配置和作用
  13. .html好 还是.asp好,各位说说在ASP.net里 用静态函数的好 还是实例函数出处HTML好???...
  14. gulp-notify处理报错----gulp系列(二)
  15. MFC在其他类中访问主窗体的成员
  16. html5 职工入职后台管理系统_丽水微信社群裂变营销管理系统公司
  17. 配置交叉编译工具链(imx6ull pro)
  18. QT界面主题风格设置
  19. AppFuse 2.1的安装运行步骤------利用Maven构建appfuse
  20. 软考高级证书考试--信息系统项目管理师--计算题(更新中)

热门文章

  1. MT8173芯片资料,MT8173处理器参数介绍
  2. 2015年第四届C/C++ A组蓝桥杯省赛真题
  3. 基于Kotlin、ViewModel、LiveData和LifeCycle开发的Readhub客户端
  4. java实现日历打印项目
  5. JS日历插件 - My97 DatePicker用法详解
  6. 酷炫暗黑个人主页简历HTML5模板
  7. 一个简单的音乐播放器(实现上一曲下一曲,和自动播放)
  8. 云之家定位拍照怎么破解
  9. 1024程序员节活动继续:购书优惠劵,折后再折,赶紧来抢啊
  10. Keil_MDK 中绝对地址定位问题