如何在一条线上找到所有网格方块?

时间:2010-07-21 21:16:50

标签: algorithm geometry

我正在尝试在二维网格上实现视线算法。我知道它在概念上需要如何工作,但我想不出如何将其作为算法来实现。

基本想法非常简单。在伪代码中:

function LineOfSight(point1, point2): boolean
  squares = GetListOfSquaresOnLine(point1, point2)
  for each square in squares
    if square.IsOpaque then return false
  return true

GetListOfSquaresOnLine将(在概念上)从点1处的网格正方形的中心到点2处的网格正方形的中心绘制一条直线,并返回该线经过的所有正方形的列表。但那是我不知道如何实施的部分。有人知道怎么做吗?首选Delphi或C示例,但不是必需的。

4 个答案:

答案 0 :(得分:34)

到目前为止,这两个答案都指向维基百科关于Bresenhams算法的文章。这是文章给出的全尺寸图示。请注意,该线穿过未突出显示的网格方块,因此Bresenham的算法仅提供您想要的子集。

alt text

由于你提到“视线”,听起来你想要一个算法来枚举线经过的所有网格方块。这个集合有时被称为超级封面(行)和one algorithm is described here

还有一些其他方法,在this question的答案中给出。

更新: Here's another reference

答案 1 :(得分:8)

不是Bresenham's Algorithm你在寻找什么?

答案 2 :(得分:7)

答案 3 :(得分:1)