Jump to content
  • Advertisement
Sign in to follow this  
titanandrews

OpenGL algorithm for creating a circle.

This topic is 4495 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

Hi All, I am new to OpenGL and 3D graphics. I am trying to create a circle. I see lots of examples all over the internet for how to do this, but for some mysterious reason it just doesn't work for me. GLint circle_points = 100; glBegin(GL_LINE_LOOP); for (int i = 0; i < circle_points; i++) { float angle = TWO_PI*i/circle_points; glVertex2f(cos(angle), sin(angle)); } glEnd(); This is code I got directly from the OpenGL redbook, but it only draws a straight line on my screen. TWO_PI is defined as 2*M_PI. I just don't get it. I have tried several different algorithms, but I can't get any of them to work. What clues should I look for to solve this problem? many many thanks! Barry

Share this post


Link to post
Share on other sites
Advertisement
Quote:
Original post by titanandrews
float angle = TWO_PI*i/circle_points;

And here's your problem. i / circle_points is an operation of two integer, resulting in rounding down to zero, due to the fact that i < circle_points.
Make that float angle = TWO_PI* (i + 0.0f)/(circle_points + 0.0f); and it should work fine. The addition promotes both variables to float (just like a cast) and thus avoids type-releated errors.

Cheers,
Pat.

Share this post


Link to post
Share on other sites
Did you really get that code DIRECTLY from the Red Book? You had to define i as an int to get it to compile, didn't you? The code in the Red Book doesn't say what i is actually, assuming we're taling about the same code. You assumed it was an int, but the book doesn't say [rolleyes]

The problem is if both i and circle_points are integers, then i/circle_points means integer division, which is not what you want. You should cast at least one of the values to float before dividing if you keep i as an integer.

edit: Too slow [razz]

Share this post


Link to post
Share on other sites
Thanks for the replies!
Yes, I assumed it was an int ( without thinking of course ). So I changed it to a float, but I still get the same problem, a straight line in the middle of the screen. I do a cout just to make sure there is no weird rounding problem going on. What else can I check? This really has me stumped.


GLint circle_points = 100;
glBegin(GL_LINE_LOOP);
for (float i = 0; i < circle_points; i++)
{
float angle = TWO_PI*i/circle_points;
char buffer[20];
sprintf(buffer,"%f",angle);
cout << buffer << endl;
glVertex2f(cos(angle), sin(angle));
}
glEnd();

Share this post


Link to post
Share on other sites
Mh. Well, here's a complete demo program that works as-is:

#include <GL/glut.h>
#include <cmath>

namespace {
// display function that renders the scene.
void display() {
// clear colour buffer (default colour is black on my machine)
glClear( GL_COLOR_BUFFER_BIT );

// set the circle colour to be white
glColor3f( 1.0f, 1.0f, 1.0f );

// make a smooth circle using 100 steps
int const steps = 100;
// instead of re-computing the angle each iteration,
// I just use the delta value
float const angleDelta = 3.141592654f * 2 / steps;

float angle = 0.0f;

// begin the loop
glBegin(GL_LINE_LOOP);
// iterate over the line segments and update the angle
for ( int i = 0; i < steps; ++i, angle += angleDelta ) {
// use the values as-is - the circle could be made smaller by
// multiplying x and y by some radius r
glVertex2f( cos(angle), sin(angle) );
}
glEnd();

// I use double-bufering, so present the rendered scene by
// swapping the buffers
glutSwapBuffers();
}
}

int main(int argc, char * argv[]) {
// setup the display mode to use double buffering and an RGB colour buffer
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "circle" );
glutDisplayFunc( display );

// setup complete - start the rendering loop
glutMainLoop();
}


Image Hosted by ImageShack.us

HTH,
Pat

Share this post


Link to post
Share on other sites
Ah Ha!! I figured out my problem with the code you posted and a little trial and error. Thanks! I was making some calls like this,

gluPerspective(52.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

and

gluLookAt(0.0, 10.0, 0.1, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

These were left over from Chapter 3 examples in "Beginning OpenGL". It is unclear what these functions are actually doing. The book has not explained them yet, but just by commenting them, I can draw the circle. I did read the API docs for these functions, and I guess they will make more sense to me later. For now the light bulb is still off for me.

thanks guys!


Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!