0

So I'm trying to make a simple pool ball simulation, and when trying to check the collision between balls, my bounce function is being skipped in the loop. There should be a display on the console with the random letters in the function bounce in the PoolTable.cpp file, but its skipped and doesn't process the hits or output the text to the console. Not sure why its not running the function. No warnings. No errors. compiles fine. Im on windows machine, using code blocks, and the GLUT library/project.

Walkthrough So I initialize and place the balls with the constructor. Then I draw the balls on the screen with the drawBalls function. After drawing the balls, i update their positions and move them with moveBalls function. After moving each ball, while still in the moveball function, I check for collisions with checkCollisions function. checkCollisions then starts two for loops, but never runs the bounce function, as the balls don't bounce off eachother, and the cout isn't printed in the terminal. for some reason it is skipped.

PoolTable.cpp

#include "PoolTable.h"
#include "poolball.h"
#include "Graphics.h"
#include <iostream>
using namespace std;
#include <cmath>

PoolTable::PoolTable( int x){
placeBalls( x );
}

void PoolTable::placeBalls( int x ){
number_of_balls = x;
for( int i = 0; i < x; i++){
    balls[i].setX( balls[i].getRadius() + i * 20 );
    balls[i].setY( balls[i].getRadius() + i * 30 );
}
}

double find_angle(double vx, double vy) {
// determine the angle between poolballs when they collide
double t; double PI = acos(-1.0);
if(vx < 0) // vertical collision
    t = PI + atan(vy/vx);
else if(vx > 0.0 && vy >= 0.0) // 1st quardant collision
    t = atan(vy/vx);
else if(vx > 0.0 && vy < 0.0) //
    t = 2.0*PI + atan(vy/vx);
else if( vx == 0.0 && vy == 0.0)
    t = 0.0;
else if(vx == 0 && vy >= 0.0)
    t = PI/2.0;
else
    t = 1.5 * PI;
return t;
}


void PoolTable::bounce(int i, int j) {
cout << "klasdjflkadsjflkasjfsadk" << endl;
double PI = acos(-1.0);
double x1 = balls[i].getX();
double y1 = balls[i].getY();
double x2 = balls[j].getX();
double y2 = balls[j].getY();
double dx = x2 - x1;
double dy = y2 - y1;
double dist = sqrt(dx*dx+dy*dy);

// did a collision occur
if(dist <= 2 * balls[i].getRadius()) {

    double phi; // angle between the two ball centers
    if(dx == 0.0)
        phi = PI/2.0;
    else
        phi = atan2 (dy, dx);
    // now compute the total velocities of the two balls
    double vx1 = balls[i].xSpeed;
    double vy1 = balls[i].getYSpeed();
    double v1total = sqrt(vx1*vx1 + vy1*vy1);
    double vx2 = balls[j].getXSpeed();
    double vy2 = balls[j].getYSpeed();
    double v2total = sqrt(vx2*vx2 + vy2*vy2);

    // find the angle of each ball's velocity
    double ang1 = find_angle(vx1,vy1);
    double ang2 = find_angle(vx2,vy2);

    // transform velocities into normal.tangential components
    double v1xr = v1total * cos(ang1 - phi);
    double v1yr = v1total * sin(ang1 - phi);
    double v2xr = v2total * cos(ang2 - phi);
    double v2yr = v2total * sin(ang2 - phi);

    // now find the final velocities (assuming equal mass)
    double v1fxr = v2xr;
    double v2fxr = v1xr;
    double v1fyr = v1yr;
    double v2fyr = v2yr;

    // reset the velocities
    balls[i].setXSpeed(cos(phi)*v1fxr + cos(phi+PI/2)*v1fyr);
    balls[i].setYSpeed(sin(phi)*v1fxr + sin(phi+PI/2)*v1fyr);
    balls[j].setXSpeed(cos(phi)*v2fxr + cos(phi+PI/2)*v2fyr);
    balls[j].setYSpeed(sin(phi)*v2fxr + sin(phi+PI/2)*v2fyr);
}
}

void PoolTable::checkCollisions(void){
for( int i = 0; i < number_of_balls; i++){
    for( int j = i + 1; j < number_of_balls; j++){
        bounce(i, j);
    }
}
}

void PoolTable::moveBalls(void){
for( int i = 0; i < number_of_balls; i++){
    balls[i].move();
    void checkCollisions();
}

}

void PoolTable::drawBalls(void){
for( int i = 0; i < number_of_balls; i++){
    balls[i].draw();
}
}

1 Answers1

1

void checkCollisions(); (in moveBalls) is a function prototype, not a function call. Remove the void.

1201ProgramAlarm
  • 32,384
  • 7
  • 42
  • 56