一条直线上经过的格子

来源:互联网 发布:阿里云产品设计理念 编辑:程序博客网 时间:2024/04/20 09:58

   

   这是最近在项目中遇到的,本来想着很简单的,但是结果并不是那样的,首先根据直线的斜率划分

   前提条件是每个单元格的单位为1。.

      第一种情况是,斜率的绝对值小于1的情况

      第二种情况是,斜率的绝对值大于1的情况


     首先让我来说说第一种情况

     这条线段的两个点分别在两种不同颜色的格子中

     我先把在紫色格子中(左边的格子)的点定义为firstPoint,线段的另一个点定义为secondPoint     

     首先计算一下firstPoint所在格子的索引

     我把格子的索引分为行索引和列索引:

    

     //计算firstPoint所在格子的行列索引

      firstPoint_index_x = (int)firstPoint.x ; 

      firstPoint_index_y = (int)firstPoint.y ;

    //计算secondPoint所在格子的行列索引

     secondPoint_index_x = (int)secondPoint.x;

     secondPoint_index_y = (int)secondPoint.y;

    

     //接下来就是计算firstPoint和secondPoint所在格子的索引

   

     firstPoint_grid_index = firstPoint_index_y * mapWidth + firstPoint_index_x;

     secondPoint_grid_index = secondPoint_index_y * mapWidth + secondPoint_index_x;

 

     //计算该线段所在直线的斜率

      deltaX = fabs( firstPoint.x - secondPoint.x);

      deltaY = fabs( firstPoint.y - secondPoint.y);

    

     //当线段的斜率的绝对值小于1的情况

     if( deltaX > deltaY)

      {

        float k = deltaY/deltaX;

         for(int x = firstPoint_index_x + girdSize; x <= second_index_x ; x += gridSize)

        {

           int y = (x - firstPoint.x) * k + firstPoint.y;

            //第一次执行完了循环之后,x,y即为所求紫色格子右边第一个格子的行列索引

            

             int nextGridndex = y * mapWidth + x;

             //第一次循环后nextGridIndex 左边的格子索引(紫色格子索引)为

             int frontGridIndex =  y * mapWidth + x - 1 

           //这两个格子都是直线所经过的格子

       

          }

 

      }

 

    //有的同学肯定会很疑惑,为什么在一次循环里面会一下子计算两个格子索引呢,这个问题我先不回答,你可以自己先试试当上面的循环体进行第二次循环的时候

    //会是什么情况

   

 

   今天有点累了,先写到这里吧,明天接着把后面的给写完。虽然说这个也算不上什么很牛逼的技术点吧,但是记录了我的一个脚印,也希望给大家一点帮助!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击