找到由线段相交的所有瓷砖

时间:2012-04-27 12:01:26

标签: c++ math optimization

我必须找到与线段相交的所有瓷砖,但Bresenham的线算法不符合我的要求。我需要找到所有细胞。我不需要知道交叉点,只需要交叉点的事实。谢谢你的帮助。

我想找到线的方向向量,并逐步找到按照区块大小划分的单元格。但我不知道如何选择正确的步长。我认为1 px步骤很糟糕。

3 个答案:

答案 0 :(得分:6)

Amanatides和Woo的“Here is article用于2D和3D情况的”用于光线跟踪的快速体素遍历算法“。 Practical implementation.

答案 1 :(得分:1)

您可以使用以下网址中找到的众多线方程之一:http://www.cut-the-knot.org/Curriculum/Calculus/StraightLine.shtmlhttp://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           
    }
}