更新; 将j = 0改为j = i,允许平稳的帧速率下最多700粒子
我正在尝试模拟具有数百个粒子的2D水,这些粒子具有声明其位置的Vector2和一个用于表示它们速度的Vector2。
当涉及到碰撞检测时,我的程序虽然仅使用勾股定理,但不喜欢使用超过450个粒子。
以下是主类中的碰撞检测代码;
for (int i = 0; i < particleList.Count; i++)
{
for (int j = 0; j < particleList.Count; j++)
{
if (distanceBetween(particleList[i].position, particleList[j].position) < reactDistance)
{
if (particleList[i].position.X > particleList[j].position.X) //x axis
{
particleList[i].velocity.X += repelSpeed;
particleList[j].velocity.X -= repelSpeed;
particleList[i].position.X -= attractSpeed;
particleList[j].position.X += attractSpeed;
}
else
{
particleList[i].velocity.X -= repelSpeed;
particleList[j].velocity.X += repelSpeed;
particleList[i].position.X += attractSpeed;
particleList[j].position.X -= attractSpeed;
}
if (particleList[i].position.Y > particleList[j].position.Y) //y axis
{
particleList[i].velocity.Y += repelSpeed;
particleList[j].velocity.Y -= repelSpeed;
particleList[i].position.Y -= attractSpeed;
particleList[j].position.Y += attractSpeed;
}
else
{
particleList[i].velocity.Y -= repelSpeed;
particleList[j].velocity.Y += repelSpeed;
particleList[i].position.Y += attractSpeed;
particleList[j].position.Y -= attractSpeed;
}
}
}
}
这里是`distanceBetween(v1, v2)`方法的代码:
public float distanceBetween(Vector2 a, Vector2 b)
{
float xDist, yDist, distTo;
if (a.X > b.X) //x axis
{
xDist = a.X - b.X;
}
else
{
xDist = b.X - a.X;
}
if (a.Y > b.Y) //y axis
{
yDist = a.Y - b.Y;
}
else
{
yDist = b.Y - a.Y;
}
distTo = (float)(Math.Sqrt((xDist * xDist) + (yDist * yDist)));
return distTo;
}
Vector2.Distance(v1, v2)方法不会影响性能。
如果你想知道attractSpeed是什么,它是我尝试形成水集合的努力,但我不确定如何做到。
最终,我希望得到像这样的效果:http://grantkot.com/MPM/Liquid.html
Parallel.For(start, end, i => { //i is used here just like in normal for loop. });
- Lasse