如何创建随机模拟?

时间:2009-02-01 15:28:40

标签: random simulation particles

我一直在玩this flash game,在我完成了初始('lol,fire')反应后,我开始想知道如何在编程中复制这种接触变异行为。我想这有点像honeypot xkcd

我正在考虑从粒子相互偏转和包含墙壁的情况开始。序列将以一定数量的“突变”粒子开始,当这些突变体与常规粒子碰撞时,它们本身就会变成突变体。我以后可以做一些更有趣的事情。

我的问题是如何开始这个。我打算用C ++的Drawing元素在C#中做这个(虽然我对C#很新 - 如果有一个不同的.NET我应该使用让我知道)但是如果有任何一般性的论文我有兴趣阅读它们(如果它们当然可以在线获得)。

谢谢, 罗斯

2 个答案:

答案 0 :(得分:4)

我认为你正在思考你正在思考的问题,一个方框中的一些particles会在这里做得很好。我无法想象你会找到关于这样一个特定而简单的案例的论文,但也许可以找到所需的一些技术,但与渲染器相比,后端的实现应该相对简单。

要在一个简单的方法周围移动粒子是Euler iteration,在那里存储位置和速度。 position = position + velocity * dt;其中dt是自上一帧以来的时间变化。最好保持dt固定,并在渲染器的点之间进行插值,如果可以......这将减少稳定性问题并使碰撞检测更容易。

要将一个粒子反射到一个墙上,检查它的x个分量或y位置是否超出边界,然后翻转速度的另一个分量的符号,例如

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

如果你有恒定的dt,这种方法效果很好,但如果它有所不同,你需要做一些更复杂的事情。找到与框相对应的碰撞点,reflect找到碰撞面中框外的向量部分。

为了使粒子相互碰撞,距离检查可能是最好的,一旦距离太小就会触发反射。即如果它们太靠近就会发生碰撞。反射速度分量,好像粒子是球体,因此反射的法线是它们位置的差异。

你可能会在gamedev上发现this article也很有用......

希望这有帮助。

答案 1 :(得分:1)

为什么不把经典的小行星游戏看作一个起点?这是一个不使用DirectX并且在c#

中的

http://www.codeproject.com/KB/GDI-plus/asteroids.aspx