how to avoid clutch billiard balls?

Posted by Nait87 on Stack Overflow See other posts from Stack Overflow or by Nait87
Published on 2012-09-07T09:24:25Z Indexed on 2012/09/07 9:38 UTC
Read the original article Hit count: 212

Filed under:
|

I'm working on the simple behaviour of billiard balls in a collision with each other. All works normal, but there was a problem when facing a few easy balls is the effect of coupling balls and they're cool with each other. Tell me how to prevent this.

bool MGBilliard::CollisingBall(CCPoint curr_point, CCPoint next_point)
{
    float dx = next_point.x - (curr_point.x + dvdt.x);
    float dy = next_point.y - (curr_point.y - dvdt.y);
    float d = dx*dx+dy*dy;
    return d <= BALL_RADIUS * BALL_RADIUS;
}
double MGBilliard::angleCollisionBalls(Ball* current, Ball* next)
{
    double na;
    double dx = fabs(next->location.x - current->location.x);
    double dy = fabs(next->location.y - current->location.y);
    na = atan(fabs(dy/dx));
    if(atan(fabs(current->location.y/current->location.x)) < atan(fabs(next->location.y/next->location.x)))
        na = current->angle - na;
    else if(atan(fabs(current->location.y/current->location.x)) > atan(fabs(next->location.y/next->location.x)))
        na = current->angle + na;
    return na;
}
for(unsigned int i = 0;i<BALL_COUNT;++i)
    {
        if(vBalls[i]->speed > 0){
            vBalls[i]->speed += vBalls[i]->acceleration;
            float dsdt = vBalls[i]->speed*dt;
            dvdt.x = dsdt*cos(vBalls[i]->angle);
            dvdt.y = dsdt*sin(vBalls[i]->angle);
            vBalls[i]->location.x += dvdt.x;
            vBalls[i]->location.y += dvdt.y;
            for(unsigned int j = 1; j < BALL_COUNT; ++j)
            {
                if(i == j) continue;
                if(CollisingBall(vBalls[i]->spriteBall->getPosition(),vBalls[j]->spriteBall->getPosition()))
                {
                    vBalls[j]->speed = 600;
                    double angle;
                    angle = angleCollisionBalls(vBalls[i],vBalls[j]);
                    vBalls[i]->angle = (float)-angle;
                    vBalls[j]->angle = (float)angle;
                }
            }
        }
    }

© Stack Overflow or respective owner

Related posts about c++

Related posts about game-physics