zoukankan      html  css  js  c++  java
  • 六边形网格快速定位

    转载自:http://www.thecodeway.com/blog/?p=1811&cpage=1#comment-4012

        在游戏中,一般使用正方形网格管理二维场景中的各种物体,这种网格简单快速,但缺点就是相邻网格的间距是不均匀的,因为对角相邻的网格的间距要比左右相邻的间距要大。
        一个解决方法是使用蜂窝状的六边形网格代替正方形网格,六边形相邻网格之间的距离是固定的,这个特性带来的好处显而易见,当我们需要通过网格广播消息时,六边形网格所覆盖的范围更加接近均匀。事实上,六边形网格的实际应用范围很广,比如无线通讯在塔台的覆盖范围计算上,就是使用的六边形网格,这也是手机也被被称为“蜂窝式移动电话”的原因。

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


        与正方形相比,六边形网格的计算要复杂一些,首先要解决的就是定位算法,也就是给出一个点的坐标,需要定位该点所在网格。如果使用正方形网格,一个除法就可以解决,但在六边形网格中,则要麻烦一些,我从网上搜了一些相关的文章,比如这里这里这里。而下面则是我给出的一个比较快速的算法。
        首先是定义一下在一个场景中如何表达六边形网格系统中的“坐标”,如下图所示,在六边形网格中,仍然使用二维的x,y坐标定位一个网格,而且假设左上角第一个六边形为(0,0),中心点位于原点上。

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


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

        以A类型为例,不难发现,中间的分割线恰好就是两个六边形中心连接线的垂直分割线,所以对于点P来说,如果PA<PB,则表示点在A一侧,反之则在B测,根据这个原理,可以写出代码如下

    // 六边形网格定位
    //@param xPos 输入,所需查询的点的x坐标
    //@param yPos 输入,所需查询的点的y坐标
    //@param cell_x 输出,改点所在网格的x坐标
    //@param cell_y 输出,改点所在网格的y坐标
    void getHotCell(int xPosint yPosintcell_xintcell_y)
    {
        #define CELL_BORDER        (40) //六边形边长
        #define GRID_WIDTH        (CELL_BORDER*1.5f)
        #define GRID_HEIGHT        (CELL_BORDER*0.8660254f)    // sqr(3)/2=0.8660254
        #define TEMP_1            ((GRID_WIDTH*GRID_WIDTH – GRID_HEIGHT*GRID_HEIGHT)/2.f)
        #define TEMP_2            ((GRID_WIDTH*GRID_WIDTH + GRID_HEIGHT*GRID_HEIGHT)/2.f)
     
        
    cell_y = (int)(yPos/GRID_HEIGHT);
        
    float y = yPos-cell_y*GRID_HEIGHT;
     
        
    cell_x = (int)(xPos/GRID_WIDTH);
        
    float x = 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看不到的同学请点这里)

    标签: HTML5算法


  • 相关阅读:
    蓝桥杯训练 | 枚举,模拟与排序 | 04
    linux全套 | Linux模板机器安装 | 18
    linux全套 | Shell编程 | 16
    MySQL主从复制延迟解决方案
    MySQL异地备份方案
    MYSQL必知必会-where语句
    MySQL常见面试题-概念题
    入门-MySQL查询语句的45道练习
    20145234黄斐《信息安全系统设计基础》第0周学习总结
    OpenGL代码学习(2)
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212251.html
Copyright © 2011-2022 走看看