random - 如何创建随机模拟?

标签 random simulation particles

我一直在玩this flash game在我克服了最初的(“哈哈,火”) react 之后,我开始想知道如何在编程中复制这种接触突变行为。我想这有点像 honeypot xkcd .

我正在考虑从一个场景开始,在这个场景中,粒子会相互偏转并偏离包含的壁。该序列将从一定数量的“突变体”粒子开始,当这些突变体与常规粒子发生碰撞时,它们自己就会变成突变体。以后我可以做一些更有趣的事情。

我的问题是如何开始使用它。我打算在 C# 中使用 .NET 的绘图元素来完成它(尽管我对 C# 还很陌生——如果我应该使用 .NET 的不同部分让我知道)但是如果有任何一般性的论文我有兴趣阅读它们(当然,如果它们可以在线获取的话)。

谢谢, 罗斯

最佳答案

我认为您的想法是正确的,一些 particles在一个盒子里在这里会很好。我无法想象您会找到关于这样一个具体而简单的案例的论文,但可能需要一些技术,但与渲染器相比,后端的实现应该相对简单。

移动粒子的一个简单方法是 Euler iteration ,您存储位置和速度的位置。位置=位置+速度*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的碰撞点被碰撞的面中框外的矢量部分。

对于粒子之间的碰撞,距离检查可能是最好的,一旦距离太小就会触发反射。也就是说,如果它们靠得太近,它们就会发生碰撞。像粒子是球体一样反射速度分量,所以反射的法线是它们的位置差。

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

希望这对您有所帮助。

关于random - 如何创建随机模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/500995/

相关文章:

javascript - 在 JavaScript 中获取范围随机数的最佳方法?

c# - C# 中 "static"Random.Next 的正确方法?

用于模拟应用程序的 C++ normal_distribution 函数

python - numpy 半正定警告

matlab - 从粒子轨迹数据创建 3D 流管(或流线)

javascript - 在Javascript中计算粒子大小和它们之间的距离

ios - SpriteKit 粒子发射器改变颜色

python - 如何在Python中随机打印列表中的元素?

javascript - 随机 CSS 值

c++ - 使用光滑粒子流体动力学的流体模拟