用EasyX绘制多球碰撞中的碰撞代码

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;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值