2011-04-19 39 views
0

我在这两个模拟中都是初学者,所以这个问题可能很愚蠢。如果是这样,请随时编辑它。我试图在Python中模拟以下场景。我随机在固定维数的二维场中放置一些小粒子。每个粒子的半径效果为r。如果第一个粒子的第二个粒子在其半径效应范围内,则必须在两个粒子上施加一个力(第一个粒子对第二个粒子的影响,反之亦然),我的力函数定义为:模拟一个简单的物理相关场景

f(i,j)_n = (r - |pi_n - pj_n|)((pj_n - pi_n)/|pi_n - pj_n|)

其中n当前时间步长,pi_n表示i在时间步长的位置n||表示幅度计算和(pj_n - pi_n)表示向量减法。

我想知道是否有任何库为我简化这些东西。我需要的基本上是以下几点:

time-step particle position(x,y) 

有没有人对我有一些建议?

+0

如果你是一个初学者,我建议你自己写这个东西。这些图书馆可能会让初学者感到困惑。此外,你会学到东西。 – ktdrv 2011-04-19 18:20:22

回答

1

我真的很喜欢pymunk物理库,花栗鼠物理库的包装。

首先,图书馆需要进行初始化:

import pymunk 
pymunk.init_pymunk() 
space = pymunk.Space() 
space.gravity = (0.0, -100.0) 

实现的东西,你已经要求你必须创建一个BodyCircle形状要创建每个粒子的喜欢。

mass = 1 
radius = 14 
inertia = pymunk.moment_for_circle(mass, 0, radius, (0,0)) 
body = pymunk.Body(mass, inertia) 
x, y = random.randint(0, 200), random.randint(0, 200) 
body.position = x, 550 
shape = pymunk.Circle(body, radius, (0,0)) 
shape.sensor = True 
space.add(body, shape) 

的颗粒将不会互相碰撞,东阳的sensor标志被设置为True。半径现在有点影响力。

现在,我们创建了一个回调函数具有影响力的重叠区域的颗粒:

def near_callback(space, arbiter, *args, **kwargs): 
    body_i = arbiter.shapes[0].body 
    body_j = arbiter.shapes[1].body 

    # calculate the forces force_i and force_j with your formula 
    ... 

    body_i.apply_force(force_i) 
    body_j.apply_force(force_j) 

回调被设置在space

space.set_default_collision_handler(near_callback, near_callback, None, None, None) 

当然,space有对于每个时间帧“步进”:

space.step(dt) 

我希望这有点可以理解和帮助。

+0

我知道这已经很晚了,但我正在重温这个问题并试着回答。你愿意指点我周围的宝石的任何有用的材料?我设置了'dt = 1'并做了一次'space.step(dt)'差不多100次,但回调从未被调用过。可能是我在做一些微不足道的事情。你介意展示一个我可以玩的例子吗? – Legend 2011-09-20 07:28:59

2

谷歌搜索python library vector 2d返回http://www.supereffective.org/pages/Vector-2d-Vector-Library作为顶部命中,这似乎是一个主管文库(含有突起和 - perpendicularization,归一化,旋转,缩放等)

只要颗粒的数目ISN”太大,这应该与集成方案结合使用。例如您跟踪每个粒子(POS,VEL),或许还加速度矢量和使用:

F = m a

- >F = m dv/dt

- >dv/dt = F/m

,从而

dv ~= dt*F/m

- >v' - v ~= dt*F/m

- >ball.vel += timeStep*sum(ball.force(n) for n in ball.neighbors())/ball.mass

这是欧拉积分具有非常糟糕的属性,但是是好的一场比赛。