我必须找到与线段相交的所有瓷砖,但Bresenham的线算法不符合我的要求。我需要找到所有细胞。我不需要知道交叉点,只需要交叉点的事实。谢谢你的帮助。
我想找到线的方向向量,并逐步找到按照区块大小划分的单元格。但我不知道如何选择正确的步长。我认为1 px步骤很糟糕。
答案 0 :(得分:6)
答案 1 :(得分:1)
您可以使用以下网址中找到的众多线方程之一:http://www.cut-the-knot.org/Curriculum/Calculus/StraightLine.shtml或http://mathworld.wolfram.com/Line.html
据说你的坐标系中你的线经过两个点,你推导出y=mx+n
方程,只是匹配你的瓷砖,看看它们是否在你以任何方向以坐标系为单位移动x时相交喜欢从最小的x到你的瓷砖,直到最大的。如果你的坐标系是屏幕,那么1个像素就足够了。
这是我可以提示的关闭,而不了解您所遇到的问题的确切性质。
答案 2 :(得分:0)
很容易修改Bresenham的算法,以便跟踪您的需求。这是算法的相关片段:
plot(x,y);
error = error + deltaerr;
if (error >= 0.5)
{
y = y + ystep;
error = error - 1.0;
}
为了跟踪所有细胞,我们需要另一个变量。请注意,我没有严格检查过这个。
plot(x,y);
olderror = error.
error = error + deltaerr;
if (error >= 0.5)
{
y = y + ystep;
error = error - 1.0;
extra = error+olderror;
if (extra > 0)
{
plot (x,y); /* not plot (x-1,y); */
}
else if (extra < 0)
{
plot (x+1,y-1); /* not plot (x+1,y); */
}
else
{
// the line goes right through the cell corner
// either do nothing, or do both plot (x-1,y) and plot (x+1,y)
// depending on your definition of intersection
}
}