网格中一个点与所有其他点之间的距离的最佳算法

问题描述

在像素网格中,我希望计算从一个选定像素到所有其他像素的欧式距离

这也可以认为是找到2D网格坐标系中一个点与所有其他点之间的欧式距离。

现在,天真的解决方案是遍历网格并使用勾股加法(两个平方之和的平方根)计算每个像素与选定像素之间的距离:

for (int y = 0,x; y < gridHeight; ++y) {
    for (x = 0; x < gridWidth; ++x) {
        dist[x][y] = sqrt((chosenPixelX - x)^2 + (chosenPixelY - y)^2);
    }
}

...对每个像素进行sqrt()操作...

我知道Pythagorean addition的近似值,但是我们可以进一步利用以下事实:点/坐标在网格上,并且我们以已知的方式进行迭代(即+1中的单位x轴)来滚动计算/近似欧几里得距离,从而避免为每个坐标调用sqrt()

enter image description here

示例:可以使用d1计算/近似d2吗?绿色表示所选像素。

解决方法

因为您在网格上,所以只需要计算每个网格点的距离绝对值的距离->(1,1)==(-1,-1)==(-1, 1)==(1,-1)。此外,由于对角线对称,因此也不需要计算配对中的匹配值->(2,3)==(3,2)==(-2,3)==等。最后,只要计算的某个值的值为0,就可以取其他值->(3,0)== 3。

使用所有这些技巧,您可以减少至少87%的计算,甚至更多的平方根。

更好的是,如果您事先知道网格的最大大小并负担得起内存,则可以在编译时将这些全部预先计算为简单的2D查找。这就是我们过去用来进行sin / cos计算的方式-45度的查找数据,并使用绝对值处理对称性,如果绝对值大于45度,则处理90 - angle

但是...执行所有这些比较并从内存中查找以获取要缓存的值是否更快,或者使用现代CPU对多个数据并行执行计算只是更快一点不需要查找?我必须进行测试,但是我将从更简单的迭代开始,而没有所有这些技巧。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...