判断线段覆盖的格子
一个正方形平面被划分成n*n的等大小的正方形部分。
输入一个起点一个终点。
按顺序输出从起点沿直线移动到终点所经过的小正方形部分。
即按顺序输出有向线段所覆盖的正方形部分。(其中覆盖的定义为只要线段上有一个点在正方形内部就称做线段覆盖该正方形部分)。
这个问题有没有什么比较高效率的算法?
直觉上总是觉得应该有比较优的算法的。
[解决办法]
起终点是在小格子的中心吗?这是计算机图形学的题吧?类似于屏幕像素拉直线。
如果
[解决办法]
diff x
[解决办法]
==
[解决办法]
diff y
[解决办法]
或者
[解决办法]
diff x
[解决办法]
*
[解决办法]
diff y
[解决办法]
== 0,则沿45°的倍数方向,直接挨个输出。
否则,可以先算出直线方程,例如ax + by = c
然后沿一个方向,每次移动1,例如x起点是5,终点是9
那么就x从5到9代入方程,分别求y的坐标(求整数就行),如果y的坐标和上一个不同了,则检测漏检的一个方格,因为从一行方格到另一行方格,必然有一列经过了两个(排除45°角的前提下)。
[解决办法]
numofSqure = y/m + 1;
else
numofSqure = y/m;
// 输出小正方形索引
for (j = 0; j<= numofSqure; j++) {
printf("直线跨越了(%d,%d) \n", p_l + 1, q_l + j);
}
// 修改上一次检查点相关坐标
(x_l, y_l) = (x_c, y_c);
(p_l, q_l) = (p_l+1 ,q_l + numofSqure);
}
}