首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新点的位置

更新点的位置
EN

Stack Overflow用户
提问于 2010-01-25 18:45:29
回答 4查看 267关注 0票数 2

我的问题是:

我在3D空间中有一组点,它们的位置会以一定的速度不时更新。但我需要和他们保持最小的距离。

你能帮我做这个吗?

编辑:我使用C实现算法。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-26 02:40:56

您也可以使用物理模拟来执行此操作。这提供了更多的可能性,但需要更高的计算成本。

例如,这里的其他人建议检测碰撞,但在您对duffymo的评论中,您建议您可能希望平滑减速以避免碰撞。在这种情况下,可以创建粒子间力,将它们彼此推开,然后使用a = F/m和v = v0 + dt a计算每个时间步的速度,其中F是所有粒子相互作用的力的总和。以粒子间力为例,您可以使用类似以下内容的内容:

从下面的Python代码计算得出。但实际上,只要它在你的最小距离附近变得足够大(所以这些点永远不会离得那么近),并且在某个距离之外它是零(所以这些点不会总是相互排斥),任何东西都可以工作。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2010-01-25 19:01:50

如果希望保持最小距离d,则可以始终假设这些点由半径为d/2的刚性球组成。因此,每当两个球接触(即距离为≤d)时,假设为弹性碰撞,则会更改速度。查阅你的物理教科书,了解如何在弹性碰撞的情况下改变速度。

(您可能需要实现四叉树以进行有效的碰撞检测。)

票数 1
EN

Stack Overflow用户

发布于 2010-01-25 18:57:07

在给定速度的情况下更新位置很容易-只需使用速度的一阶差分并在时间步长结束时计算位置。

“但我需要保持他们之间的最小距离”--根本没有意义。它们之间的距离将由给出速度矢量的过程的物理特性决定。你能描述一下你正在尝试做什么吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2131684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档