float minDistances2[BallNum][2]; // 记录某个小球,距离它最近的小球的距离,这个小球的下标
for (i=0;i<BallNum;i++)
{
minDistances2[i][0] = 9999999;
minDistances2[i][1] = -1;
}
// 求解所有小球两两之间的距离平方
for (i=0;i<BallNum;i++)
{
for (j=0;j<BallNum;j++)
{
if (i!=j) // 自己和自己不需要比
{
float dist2;
dist2 = (ball_x[i] - ball_x[j])*(ball_x[i] - ball_x[j])
+ (ball_y[i] - ball_y[j])*(ball_y[i] - ball_y[j]);
if (dist2<minDistances2[i][0])
{
minDistances2[i][0] = dist2;
minDistances2[i][1] = j;
}
}
}
}
// 判断球之间是否碰撞
for (i=0;i<BallNum;i++)
{
if (minDistances2[i][0]<=4*radius*radius) // 最小距离小于阈值,发生碰撞
{
j = minDistances2[i][1];
// 交换速度
int temp;
temp = ball_vx[i]; ball_vx[i] = ball_vx[j]; ball_vx[j] = temp;
temp = ball_vy[i]; ball_vy[i] = ball_vy[j]; ball_vy[j] = temp;
minDistances2[j][0] = 999999999; // 避免交换两次速度,又回去了
minDistances2[j][1] = -1;
}
}
用EasyX绘制多球碰撞中的碰撞代码
最新推荐文章于 2024-08-06 13:00:19 发布