用于确定景观中具有特定属性的点的所有点的距离的最快方法

时间:2014-05-03 23:10:46

标签: c++ multithreading performance simulation landscape

我目前正在集思广益,如何计算2D阵列中的距离,以及具有特定属性的点集中的所有点。一个很好的例子(以及我可能的用途之一)就是一个有水池的景观。我们的想法是计算这个景观中所有点与水的距离。

这些是我想遵守的标准及其推理:

1)执行速度是我最关心的问题。地形是动态的,代码需要以半连续的方式运行。我的意思是,有一些地形更新需要不断更新。

2)内存开销不是我的主要问题。这将作为主要应用程序运行。

3)它必须能够动态更新。请参阅#1,了解其背后的原因。这些更新可以进行本地化。

4)多线程是可能的。我已经广泛使用多线程,因为我的模拟非常占用CPU。我宁愿避免它,因为它会加速开发,但我可以在必要时这样做。

我提出了以下可能的方法,我正在寻找反馈和/或其他建议。

1)遍历整个数组,并使对应于点的容器类中的集合位置与具有特定属性的位置相邻。为这些点指定值1,为具有该属性的点指定0。

2)使用这些位置查找与它们相邻的那些距离较远的点,将它们放在第二个容器类中。

3)重复此过程,直到没有任何点未签名。

4)将点列表直接保存一个单位以备将来更新。

这个想法基本上是从距离0向外流动,并通过不断缩小循环中的点列表来节省计算。

1 个答案:

答案 0 :(得分:2)

1)我能想到的另一种做得好的方法是使用笛卡尔距离公式,但是你的方式似乎会减少CPU时间(因为笛卡尔方式必须计算到每个点上每一点)。

2)或者,如果我理解你的愿望,你可以迭代一次,用你的特殊属性将所有点保存在容器中(指向它们),然后再迭代一次,只使用距离从每次迭代到每个保存点的公式(然后重复)。如果这个解释不清楚,请评论并询问。已经晚了,我累了。

如果你想在后台运行这个比较,你别无选择,只能多线程整个程序。但是,是否多线程处理此过程的功能取决于您。如果您使用我提供的第二个选项,我认为您将减少足够的CPU使用量以放弃对相关过程进行多线程处理。我想的越多,我就越喜欢第二种选择。