递增数组中一行上的单元格

时间:2011-05-12 01:04:47

标签: php arrays algorithm

假设我有一个100x100阵列,我希望将所有将落在连接阵列中两个点的线上的单元格增加1。

是否有人有算法或知道可以实现此目的的库?

我在PHP工作,但伪代码也可以。

5 个答案:

答案 0 :(得分:3)

我现在最好的答案是找到起点和终点的边界框,然后检查边界框中的每个单元格,并检查右上角和左下角,看它们是在上面还是下面。线。

如果它们都高于或低于该值,则该线不会通过该单元格。

如果一个在上面而另一个在下面,则该线穿过该单元。

我还必须在左上角和右下角进行相同的检查。

这个算法看起来好听吗?

答案 1 :(得分:0)

好吧,如果你有一个边界,比如在迷宫的上下文中,加上一个起点和终点,你可以通过几种方法编写算法。一些好的包括:

1)Flood Fill,然后从Start节点找到Destination节点的Shortest Path。 2)深度优先从开始到目的地搜索。

这些是迷宫探索和有界网格探索中常用的一些。

希望有所帮助:)

答案 2 :(得分:0)

如果你的'线'是实际线(两点之间的最短距离),而不是随机线段的集合,也许你可以使用广度优先搜索,就像我here一样。 This有助于解释更多内容。这仅在整个区域开放时才适用。如果对角线没问题,您可能需要修改它,并且您希望使用PHP而不是ActionScript。这些概念可能对你有帮助。

但是,如果你的线不是一条线,而是一个在一个点上开始和结束的波浪形图,那么你可能需要像你建议的那样对你的方块做一个交叉测试。

我不确定你实际上是否会有多条最短的路径与对角线...我仍然认为你的边界框解决方案,优化,可能会更好,但我不确定这是否真的会错任何计数(对角线好,没有障碍物。)

祝你好运!

答案 3 :(得分:0)

我有一个更像数学方法的解决方案。

<强>假设:

  • 100X100阵列的尺寸为100 x 100单位,每个单元占1 x 1单位。
  • 此外,每个点可以用十进制后的最大单个有效数字绘制,例如2.9个单位。
  • 考虑坐标系,左上角的原点和右下角的最大值,与数组索引匹配。
  • 让我们将初始点视为(x1,y1),将最终点视为(x2,y2)。

数学方法:

  • 使用公式m =(y2 - y1)/(x2 - x1)找到线的斜率
  • 现在找到该行的等式为y = m * x + b
  • b可以通过用y1替换y和x1替换x来找到。

<强>算法:

  • 让我们迭代x的各种值,初始值为x1和unitl x2。使用线方程制表y,并且x的每次迭代增量为0.1
  • 在初始点和每个数组[floor(x),floor(y)]增加单元格的值。
  • 在每次增加单元格之后,将x的值增加1而不是0.1

这可能是一个问题的唯一条件是线具有无穷大的斜率,即垂直线,并且可以存在特殊情况。我想这应该有效: - )

答案 4 :(得分:0)

我认为一种好的(可能是最好的)方法是使用Bresenham的线算法

看看:Bresenham's line algorithm