如何解决网格中一个点与所有其他点之间的距离的最佳算法
在像素网格中,我希望计算从一个选定像素到所有其他像素的欧式距离。
这也可以认为是找到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()
?
解决方法
因为您在网格上,所以只需要计算每个网格点的距离绝对值的距离->(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对多个数据并行执行计算只是更快一点不需要查找?我必须进行测试,但是我将从更简单的迭代开始,而没有所有这些技巧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。