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

Php 递增数组中一行上的单元格,php,arrays,algorithm,Php,Arrays,Algorithm,假设我有一个100x100的阵列,我想将所有落在连接阵列中两点的线上的单元增加1 有没有人有算法或者知道可以实现这一点的库 我在PHP中工作,但是伪代码也可以 好吧,如果你有一个边界,比如在迷宫的上下文中,加上一个起点和终点,那么有几种方法可以对算法进行编码。一些好的建议包括: 1) 整体填充,然后从开始节点查找到目标节点的最短路径。 2) 从起点到终点的深度优先搜索 这些是迷宫探索和有界网格探索中常用的方法 希望有帮助:)我现在得到的最佳答案是找到起点和终点的边界框,然后检查边界框中的每个单元

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

有没有人有算法或者知道可以实现这一点的库


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

好吧,如果你有一个边界,比如在迷宫的上下文中,加上一个起点和终点,那么有几种方法可以对算法进行编码。一些好的建议包括:

1) 整体填充,然后从开始节点查找到目标节点的最短路径。 2) 从起点到终点的深度优先搜索

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


希望有帮助:)

我现在得到的最佳答案是找到起点和终点的边界框,然后检查边界框中的每个单元格,并检查右上角和左下角,查看它们是否在直线上方或下方

如果它们都在上方或下方,则线不会通过单元

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

我还要在左上角和右下角做同样的检查


这个算法听起来合理吗?

如果你的“线”是一条实际的线(两点之间的最短距离),而不是一组随机的线段,也许你可以像我一样使用宽度优先搜索。有助于进一步解释发生了什么。这仅在整个区域打开时才真正适用。如果对角线没有问题,并且希望使用PHP而不是ActionScript,则可能需要修改此选项。不过,这些概念可能会对您有所帮助

但是,如果您的直线不是直线,而是从某一点开始和结束的扭曲图形,则可能需要按照建议在正方形上进行相交测试

我不确定你是否会有多条带对角线的最短路径。。。我仍然认为,经过优化的边界框解决方案可能会更好,但我不确定这是否在任何方面都是错误的(对角线可以,没有障碍)


祝你好运

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

假设:

  • 100X100阵列的尺寸为100 x 100个单元,其中每个单元占用1 x 1个单元
  • 此外,每个点都可以在小数点后绘制一个最大有效位数,例如2.9个单位
  • 坐标系的原点在左上角,最大值在右下角,这将与阵列索引匹配
  • 考虑初始点为(x1,y1)和最终点为(x2,y2)。
数学方法:

  • 使用公式m=(y2-y1)/(x2-x1)求直线的斜率
  • 现在求出直线的方程y=m*x+b
  • 通过用y1替换y,用x1替换x,可以找到b
算法:

  • 让我们迭代x的各种值,初始值为x1和unitl x2。使用直线方程将y制成表格,x的每次迭代增量为0.1
  • 在初始点以及每个阵列[楼层(x)、楼层(y)]增加单元的值
  • 在每个单元格增量之后,将x的值增加1,而不是0.1
这可能是一个问题的唯一条件是直线具有无穷大坡度的情况,即垂直直线,并且对于同一直线可能存在特殊情况。我想这应该行得通:-)

我认为一个好的(也许是最好的)方法是使用Bresenham的直线算法


看看:

什么是“以1连接阵列中两点的线”?为了扩展BoltClock的问题,您是否想象了方形单元,以及连接一个单元中心点与另一个单元中心点的线?单元是正方形的。线不必从单元格的中心开始或结束(但我可以把它简单化。想象一下,在一张方格纸上随机画一条线。我想确定这条线经过了哪些方格。这是家庭作业吗?我能想到一些实际用途,但提出这个问题的方式应该是一个作业问题。不,不是。它是为www.cyclists在地图上画线的。)roadmap.com我认为这听起来不错。您可以通过只检查线路经过的最后一个小区周围的小区来优化此功能,并在找到线路经过的下一个小区时停止检查相邻小区。此算法是可行的,但最坏的情况是检查100x100阵列中的每个框不太好。我开始写这个算法作为我的答案,但后来意识到它并不总是有效。这是因为无法选择正确的步长(在算法中设置为0.1的x增量)。想象一种情况,直线既不是水平的,也不是垂直的,并且将单元格切割到非常靠近其一个角的位置。直线经过的角越近,单元格中包含的直线长度越小。因此,该长度可以小于0.1(或您可能选择的任何步长)你的算法可能检测不到细胞。好吧,更准确地说,你可能能够计算出2个给定点的最佳步长。但这一步没有下限,因此算法的复杂性没有上限…@朱尔斯:是的,这就是我将此作为假设的原因。而且,不是rawly选择的步长值我们可以根据单元格大小的1/10或1/100进行调整。正如您所提到的,越微调,精度越高:-)