Php 查找距离特定点最近的二维数组位置

Php 查找距离特定点最近的二维数组位置,php,matrix,optimization,mathematical-optimization,Php,Matrix,Optimization,Mathematical Optimization,我正在构建一个PHP应用程序,它使用矩阵来定义分幅,最终将成为一个映射 我目前很难理解如何在二维数组中搜索给定坐标的最近的特定值 想象一下下面的矩阵: 图例: C-表示我想要找到最接近的特定值的点 0-表示尚未使用的坐标 1-表示已在使用的坐标 你能帮我理解逻辑或代码吗?我如何搜索没有用过0到C的最近坐标?我对数学一点都不感兴趣,所以请原谅我的词汇表对任何找到更简单解决方案的人开放,但我会尝试通过从C到每个未使用点的向量来解决这个问题,然后搜索这些向量的距离 给定C和未使用点的索引: 将点存储在

我正在构建一个PHP应用程序,它使用矩阵来定义分幅,最终将成为一个映射

我目前很难理解如何在二维数组中搜索给定坐标的最近的特定值

想象一下下面的矩阵:

图例:

C-表示我想要找到最接近的特定值的点

0-表示尚未使用的坐标

1-表示已在使用的坐标


你能帮我理解逻辑或代码吗?我如何搜索没有用过0到C的最近坐标?

我对数学一点都不感兴趣,所以请原谅我的词汇表对任何找到更简单解决方案的人开放,但我会尝试通过从C到每个未使用点的向量来解决这个问题,然后搜索这些向量的距离

给定C和未使用点的索引:

将点存储在带有索引的数组中,当我们使用C点计算每个点的距离时,可以引用这些索引

计算从C到每个未使用点的向量 Vx=3-2=1 Vy=0-2=-2

向量是

计算每个未使用点之间的距离 距离=sqrt1²+-2²=sqrt5=2236

对于您将获得的所有分数:

在最近的地点取货 搜索最小距离或对结果进行排序,并获得第一个最近点。它的索引将是您正在搜索的未使用点

使用tiles实现代码的示例 这并不是专门优化的

$tileC=[2,2];//假设您已经搜索并找到了tile C位置。 $unusedTiles=[//假设您已经搜索并找到了所有未使用的tiles位置。 0 => [0,0], 1 => [1,0], 2 => [3,0], 3 => [4,0], 4 => [0,4] ]; $tileDistances=[]; foreach$unusedTiles作为$index=>$unusedTile{ //计算向量。 $vector=[ 'x'=>$unusedTile[0]-$tileC[0], “y”=>$unusedTile[1]-$tileC[1], ]; //获取从C到未使用的磁贴的距离。 $tileDistances[$index]=hypot$vector['x'],$vector['y']; } //获取最近的平铺索引。 $nearestTileIndexes=数组_键$tileDistances,最小$tileDistances; var_导出$tileDistances;//计算出的距离。 var_导出$nearestTileIndexes;//最近的瓷砖。 这将产生:

//距离 大堆 0 => 2.8284271247461903, 1 => 2.23606797749979, 2 => 2.23606797749979, 3 => 2.8284271247461903, 4 => 2.8284271247461903, ; //最近的瓷砖 大堆 0 => 1, // 1 => [1,0] 1 => 2, // 2 => [3,0] ; 距离测量的替代方案
计算完所有向量后,对每个向量进行循环,然后搜索最接近0的x,然后搜索y。剩余的第一个点将是您正在搜索的最近未使用的点。这避免了计算每个点的海压。

你好,阿德里,我真的很感谢你花了这么多时间来完成这项工作。评论的结构和解释似乎很棒,因为我清楚地理解了你是如何做到这一点的。我目前正在通过检查邻居和邻居的邻居来实现这一点。当我完成我的解决方案时,我将实施你的解决方案,并将两者进行基准测试,因为这可能很有趣。尝试回答你的问题真的很有趣^^,与你的邻居一起检查似乎是一种更进一步的方法。你添加的瓷砖越多,我的速度就会越慢。