我正在Java中开发一个模拟,对象在2D网格中移动。网格中的每个单元只能被一个单元格占用,对象通过从一个单元格移动到另一个单元格移动。
这比特定于Java的理论更有理论意义,但是有没有人想过我应该如何使用这个网格来处理冲突处理呢?在类似网格的世界中,人们是否曾经使用过任何算法来处理碰撞?
请注意,我不是在谈论碰撞检测,因为这是微不足道的,因为对象从一个单元格移动到另一个单元格。我说的是碰撞处理,它会变得非常复杂。
对象A希望移动到与对象B相同的位置,对象C希望移动到对象B的当前位置。由于每个单元只能包含一个对象,如果对象A能够移动到它想要的位置,这将导致对象B保持静止,从而使对象C也保持静止。
可以想象,这可能会产生一个更长的碰撞链,需要处理。
是否有任何算法或方法,人们已经使用,可以帮助这一点?没有碰撞检测算法饱和的搜索结果,几乎不可能搜索到这个问题。
编辑:所有的对象在完全相同的时间移动。我希望限制必须保持静止的对象的数量,因此我倾向于先处理具有较长碰撞链的对象(如本例中的对象B)。
发布于 2017-02-20 17:06:25
检查“提前”/“下一步”将导致计算困难,甚至爆炸。
相反,你可以(并行地)检查“哪个粒子可以移动到这个点?”在每个细胞上。为此,您需要在每个单元格中有一个速度矢量的速度图。然后沿着这个向量向后,你会发现一个细胞。如果有粒子,把它带到细胞里。
这样就不会发生冲突,因为每个单元格只执行一个操作。从负速度矢量的终点得到最近的细胞。
这是有点棘手的计算,因为速度可能不会完全降落在细胞的中心。需要概率(如果它是非常接近角,而不是中心)的运动/宏效果相等也。
因此,只有在细胞指数上才会有竞争条件,而运动的随机性(或根据距离细胞中心的距离来选择粒子)会容忍这种情况。
在量子物理学中,粒子可以跳过墙的另一边,静止不动(即使它不应该),还可以做一些对经典物理学来说不自然的事情。因此,如果分辨率很高,而且速度不高于地图大小,它应该看起来很自然,特别是当多个细胞竞争从另一个细胞中获取一个粒子时,它具有随机性。
多次通行证:
检验Gauss(method)方法求解许多线性方程组.
计算是在单元上进行的,而不是粒子上的,因此地图边界将是隐式的、防弹的,并且计算可以在所有核之间平均分布。
示例:
粒子A下降
粒子B向右
他们在碰撞的过程中
速度图平衡态的求解(Gauss)
现在粒子A的细胞有到down+right的速度
与B相同
就好像它们被碰撞了,但它们仍然在它们的细胞上。
用细胞的速度移动它们会使它们看起来像是在碰撞。
https://stackoverflow.com/questions/42356480
复制