Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更新点的位置_C_Algorithm_Math - Fatal编程技术网

C 更新点的位置

C 更新点的位置,c,algorithm,math,C,Algorithm,Math,我的问题是: 我在3D空间中有一组点,它们的位置会以一定的速度不时更新。但我需要在他们之间保持最小的距离 你能帮我吗 编辑:我正在使用C实现算法 提前感谢。在给定速度的情况下更新位置很容易-只需使用速度的一阶差,并在时间步长结束时计算位置 “但我需要在他们之间保持最小的距离”-毫无意义。它们之间的距离将由给出速度矢量的过程的物理性质决定。你能描述一下你想做什么吗?如果你想保持最小距离d,你可以假设这些点是由半径为d/2的刚性球组成的。因此,每当两个球接触时(即距离为≤ d) ,在假设弹性碰撞的情

我的问题是:

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

你能帮我吗

编辑:我正在使用C实现算法


提前感谢。

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


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

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


(您可能需要实现四叉树以实现高效碰撞检测。)

您需要做的第一件事是检测两点之间的距离是否小于最小距离。第二种方法是以消除碰撞的方式移动点

第一部分基本上是圆对圆碰撞*检测,因此方法相同:检查每个移动点与其他点之间的距离或使用连续碰撞检测*(如果点按照一些简单的规律移动)

第二部分由你决定,方法太多了


(*)-googleable

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

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

根据下面的Python代码计算。但实际上任何东西都可以工作,只要它足够大,接近你的最小距离(因此点永远不会靠得那么近),并且在某个距离之外为零(因此点之间并不总是相互排斥)

从pylab导入*
def排斥(x,c,rmin=1,fmax=100):

如果x确定两个粒子是否会碰撞。假设你有两个粒子A和B,你知道它们在时间0的位置和速度。最初,它们之间的距离大于距离r;你想知道他们是否以及何时会彼此接近

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()
让我们定义两个3D向量R和V。R=B在时间0时相对于A的位置,
B.position-A.position
,V=B相对于A的速度,
B.velocity-A.velocity
。时间t时A和B之间距离的平方为

其中,点(v1,v2)是两个向量之和,abs(v)是两个向量之和

这是t的一个简单的二次函数。使用,当距离(t)的平方=r2时,可以找到时间t(如果有)。这将告诉你粒子是否和何时比r更接近彼此

确定大量粒子中哪一个将首先碰撞。当然,你可以选取每一对可能的粒子,计算它们碰撞的时间。这就是O(n2)。改善这一点比我们目前在这里所做的简单工作要困难得多


因为你只需要知道下一个,比如说,n秒,你可以为每个粒子在这段时间内的路径计算a,在每个方向上用r延伸所有这些盒子,看看哪些盒子重叠(如果有的话)。这可以使用修改后的。重叠的边界框不一定表示实际碰撞,只表示潜在碰撞。这些潜在的碰撞仍然需要进行数学检查,以确定是否存在任何真正的碰撞;这只是一种将检查量从O(n2)减少到更易于管理的方法。

StackOverflow用于编程问题,而不是数学/物理问题。@Oded:这更像是一个物理模拟问题,然后是一个数学问题。@fraguas:你在用什么语言?到目前为止你都做了些什么?@KennyTM:在我找到速度后,我会更新这些点,并检查它们是否都检查了最小距离条件。如果没有,我需要重新计算速度,这样就不会使点靠得更近。根据当前速度,计算点移动的方向和距离-如果移动点不会违反最小距离规则,请移动它。否则,沿计算的方向找到点可以移动且不违反规则的最大距离并移动它。我的问题不是更新位置。那很好。问题是,如果速度把两个点放在一起,我需要用更多的分数来重新计算速度,这样速度就不会把这两个点放在一起。想象一条你正在行驶的道路:如果你离一辆汽车越来越近,我需要在休息时保持安全距离。我需要在这里做同样的事情。这里所有的答案对我帮助很大。这是对我帮助很大的一个。谢谢大家的帮助;)
square_of_distance(t)
    = abs(R + V*t)^2
    = dot(R + V*t, R + V*t)
    = dot(R, R) + 2 * dot(R, V*t) + dot(V*t, V*t)
    = dot(R, R) + 2 * dot(R, V) * t + dot(V, V) * t^2