Archived

This topic is now archived and is closed to further replies.

Need help in drawing moving and bouncing ball

This topic is 5900 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I was currently given an assignment. Since I just started learning OpenGL (and worse, most of them are theories), thus I have no idea on how to program it. Below is the question: ================================================================ Implement a C/C++ interactive graphics program that "moving and bouncing (no gravity applied) a ball in a window" A Ball is drawn (as circle) with in multiple color to make it''s rotation clear. Implement keyboard call back function that: 1. enlarge the ball radius when press ''R'' 2. reduce the ball radius while press ''r'' 3. increase the ball velocity while press ''V'' 4. reduce the ball velocity while press ''v'' 5. increase ball direction angle (anti-clockwise) while press ''T'' 6. reduce the ball direction angle (anti-clockwise) while press ''t'' 7. increase the ball spinning speed (anti-clockwise) while press ''A'' 8. decrease the ball spinning speed (anti-clockwise) while press ''a'' Implement mouse call back function that: 1. Start / continue animation of the ball while left mouse button is pressed. 2. Pause animation while right mouse button is press ================================================================ Any help will be appreciated. Thanks.

Share this post


Link to post
Share on other sites
Hmm..I'm not sure what is so unclear to you with it, but here goes.. Do a function that draws a circle with a given radius and position and rotation angle(for spinning purposes), make a class(or a structure) for the ball and so on. You have to give the ball a texture so the spinning will be notisable.
Here's a function that draws a circle in allegro (the is probably an easier way to do it..) :
(the circle is actually drawn twice, because I didn't bother to remove the extra material. certain parts have to be drawn with x increasing one by one, others with y so the line will be continuous)
    
void pallo(double x0,double y0,double r,int c)
{
double x,y;
for(x=0;x<=640;x++)
{
y=sqrt(r*r-x*x);
putpixel(screen,x0+x,y0+y,c);
y=-sqrt(r*r-x*x);
putpixel(screen,x0+x,y0+y,c);
}
for(x=0;x<=640;x++)
{
y=sqrt(r*r-x*x);
putpixel(screen,x0-x,y0-y,c);
y=-sqrt(r*r-x*x);
putpixel(screen,x0-x,y0-y,c);
}
for(y=0;y<=640;y++)
{
x=sqrt(r*r-y*y);
putpixel(screen,x0+x,y0+y,c);
x=-sqrt(r*r-y*y);
putpixel(screen,x0+x,y0+y,c);
}
for(y=0;y<=640;y++)
{
x=sqrt(r*r-y*y);
putpixel(screen,x0-x,y0-y,c);
x=-sqrt(r*r-y*y);
putpixel(screen,x0-x,y0-y,c);
}
}

Here is a code to move a point with the given angle (0 or 2pii radians is upwards)

void movepoint(double *x,double *y,double angle,double speed)
{
*x=*x+sin(angle)*speed;
*y=*y-cos(angle)*speed;
}

When the ball hit's a wall the equivalent speed will just be reversed. Rotating the ball would probably bee the easiest to do with a matrice, but I dunno for sure, I can't think right now.
Well that's it, hope this posting wasn't too pointless..

Edited by - Afterlife on October 20, 2001 1:13:59 PM

Share this post


Link to post
Share on other sites
Use a sprite for your ball, with 3 colors or so. Draw it at the largest possible size (100% scaling factor) and allow for the scaling factor to be modified within the 1 - 100 range.

Using OpenGL is a good idea, because you can rotate the ball easily (using matrices). The ball velocity is a 2d vector which has one of its components'' sign reversed when it hits a bounday (collision with the vertical boundary inverts the horizontal component''s sign, and vice versa). A cool touch is to have the rate of spin affect the resultant vector when the ball hits one of the edges.

Don''t think of this program in terms of the graphics; that''s the least of the problems. Think in terms of the simulation - the underlying physics - and once you have that performing satisfactorily you can focus on displaying it.

Share this post


Link to post
Share on other sites
So far I just managed to draw a filled circle. The problem now is how to make it move and rotate after I left-click the mouse. From what I know there are functions called:
glTranslate{fd}( dx, dy, dz );
glRotate{fd}( angleInDegrees, axisXvalue, axisYvalue, axisZvalue);

Just wondering how to implement it on my source file... I tried once but the window goes blank when I left click on it..
Below is my souce code so far (the transformation function is called rollCircle()):

  
#include<GL\glut.h>
#include<math.h>
#include<stdio.h>

void drawCircle()
{
float originY=100;
float originX=100;
float radius=20;
float vectorX;
float vectorY;
float vectorY1;
float vectorX1;
float angle;
vectorY1=originY+radius;
vectorX1=originX;
glBegin(GL_TRIANGLES);
for(int i=0; i<=360;i++)
{
angle=(float)(((double)i)/57.29577957795135);
vectorX=originX+(radius*(float)sin((double)angle));
vectorY=originY+(radius*(float)cos((double)angle));
glVertex2d(originX,originY);
glVertex2d(vectorX1,vectorY1);
glVertex2d(vectorX,vectorY);
vectorY1=vectorY;
vectorX1=vectorX;
if(i<=120)
glColor3f(1.0,0.0,0.0);
else
if(i>120 && i<=240)
glColor3f(1.0,1.0,0.0);
else
glColor3f(0.0,1.0,0.0);

}
glEnd();
}

void rollCircle()
{
//need help on this

}

void myMouse(int button, int state, int x, int y)
{
if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
glutIdleFunc(rollCircle); // starts animation

else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
glutIdleFunc(NULL); // stops animation

}


void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
drawCircle();
glFlush();
}

void myInit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,200.0,0.0,200.0);
}

void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(200,200);
glutInitWindowPosition(0,0);
glutCreateWindow("Circle");
glutDisplayFunc(myDisplay);
glutMouseFunc(myMouse);
myInit();
glutMainLoop();
}

Thanks for any help.


Edited by - cwchan on October 21, 2001 6:14:26 AM

Share this post


Link to post
Share on other sites