这是最近在项目中遇到的,本来想着很简单的,但是结果并不是那样的,首先根据直线的斜率划分
前提条件是每个单元格的单位为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
//这两个格子都是直线所经过的格子
}
}
//有的同学肯定会很疑惑,为什么在一次循环里面会一下子计算两个格子索引呢,这个问题我先不回答,你可以自己先试试当上面的循环体进行第二次循环的时候
//会是什么情况
今天有点累了,先写到这里吧,明天接着把后面的给写完。虽然说这个也算不上什么很牛逼的技术点吧,但是记录了我的一个脚印,也希望给大家一点帮助!