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算法


  • 相关阅读:
    Python 集合
    Python sorted()
    CodeForces 508C Anya and Ghosts
    CodeForces 496B Secret Combination
    CodeForces 483B Friends and Presents
    CodeForces 490C Hacking Cypher
    CodeForces 483C Diverse Permutation
    CodeForces 478C Table Decorations
    CodeForces 454C Little Pony and Expected Maximum
    CodeForces 313C Ilya and Matrix
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212251.html
Copyright © 2011-2022 走看看