我的问题是:
我在3D空间中有一组点,它们的位置会以一定的速度不时更新。但我需要和他们保持最小的距离。
你能帮我做这个吗?
编辑:我使用C实现算法。
提前谢谢。
发布于 2010-01-26 02:40:56
您也可以使用物理模拟来执行此操作。这提供了更多的可能性,但需要更高的计算成本。
例如,这里的其他人建议检测碰撞,但在您对duffymo的评论中,您建议您可能希望平滑减速以避免碰撞。在这种情况下,可以创建粒子间力,将它们彼此推开,然后使用a = F/m和v = v0 + dt a计算每个时间步的速度,其中F是所有粒子相互作用的力的总和。以粒子间力为例,您可以使用类似以下内容的内容:

从下面的Python代码计算得出。但实际上,只要它在你的最小距离附近变得足够大(所以这些点永远不会离得那么近),并且在某个距离之外它是零(所以这些点不会总是相互排斥),任何东西都可以工作。
from pylab import *
def repulse(x, c, rmin=1., fmax=100):
if x<=rmin:
return fmax
try:
f = c/(x-rmin)-5.
if f<0.:
f = 0.
if f>fmax:
return fmax
except:
f = fmax
return f
x = arange(0, 100, .01)
r = 0.*x
for c in range(0, 10):
for i, xv in enumerate(x):
r[i] = repulse(xv, 2.**c)
plot(x, r)
show()发布于 2010-01-25 19:01:50
如果希望保持最小距离d,则可以始终假设这些点由半径为d/2的刚性球组成。因此,每当两个球接触(即距离为≤d)时,假设为弹性碰撞,则会更改速度。查阅你的物理教科书,了解如何在弹性碰撞的情况下改变速度。
(您可能需要实现四叉树以进行有效的碰撞检测。)
发布于 2010-01-25 18:57:07
在给定速度的情况下更新位置很容易-只需使用速度的一阶差分并在时间步长结束时计算位置。
“但我需要保持他们之间的最小距离”--根本没有意义。它们之间的距离将由给出速度矢量的过程的物理特性决定。你能描述一下你正在尝试做什么吗?
https://stackoverflow.com/questions/2131684
复制相似问题