假设我有一个100x100阵列,我希望将所有将落在连接阵列中两个点的线上的单元格增加1。
是否有人有算法或知道可以实现此目的的库?
我在PHP工作,但伪代码也可以。
答案 0 :(得分:3)
我现在最好的答案是找到起点和终点的边界框,然后检查边界框中的每个单元格,并检查右上角和左下角,看它们是在上面还是下面。线。
如果它们都高于或低于该值,则该线不会通过该单元格。
如果一个在上面而另一个在下面,则该线穿过该单元。
我还必须在左上角和右下角进行相同的检查。
这个算法看起来好听吗?
答案 1 :(得分:0)
好吧,如果你有一个边界,比如在迷宫的上下文中,加上一个起点和终点,你可以通过几种方法编写算法。一些好的包括:
1)Flood Fill,然后从Start节点找到Destination节点的Shortest Path。 2)深度优先从开始到目的地搜索。
这些是迷宫探索和有界网格探索中常用的一些。
希望有所帮助:)
答案 2 :(得分:0)
如果你的'线'是实际线(两点之间的最短距离),而不是随机线段的集合,也许你可以使用广度优先搜索,就像我here一样。 This有助于解释更多内容。这仅在整个区域开放时才适用。如果对角线没问题,您可能需要修改它,并且您希望使用PHP而不是ActionScript。这些概念可能对你有帮助。
但是,如果你的线不是一条线,而是一个在一个点上开始和结束的波浪形图,那么你可能需要像你建议的那样对你的方块做一个交叉测试。
我不确定你实际上是否会有多条最短的路径与对角线...我仍然认为你的边界框解决方案,优化,可能会更好,但我不确定这是否真的会错任何计数(对角线好,没有障碍物。)
祝你好运!答案 3 :(得分:0)
我有一个更像数学方法的解决方案。
<强>假设:强>
数学方法:
<强>算法:强>
这可能是一个问题的唯一条件是线具有无穷大的斜率,即垂直线,并且可以存在特殊情况。我想这应该有效: - )
答案 4 :(得分:0)
我认为一种好的(可能是最好的)方法是使用Bresenham的线算法