你不需要计算反射角,只要把问题分解成两个:一个是
x
,一个是
y
。在这两种情况下,你需要粒子在超过边界时 "回去"。
我以前在研究流体中的粒子密度时做过这个练习。最简单的是在两个方向都考虑一个(0,1)的边界。下面的代码应该可以做到这一点(提示:正确使用
abs
会产生相当于反射的效果)。
x0 = [.1, .9]
delta = [-0.2, 0.3]
x1 = [(1-abs(abs(xi + di)-1)) for xi, di in zip(x0, delta)]
print(x1)
# 0.1, 0.8
#or using numpy:
x1 = 1-np.abs(np.abs(np.asarray(x0) + np.asarray(delta))-1)
print(x1)
>> [0.09999999999999998, 0.8]
array([0.1, 0.8])
我从你的问题中假定,你忽略了粒子与粒子的碰撞和粒子与粒子的 "非叠加"。