// Here we are going to create a circle. This is something I don't believe
// you can do unless you create it on your own. In other words, it is not
// preset.

// Now because a circle is justa bunch of lines. That is what we are going
// to make. A bunch of lines, close together that go around in a circle.

// Now first of all I am going to create a typedef to hold our circle properties
// as we call them

// typedef struct
// {
// This will hold the x values as we need them
// float x;
// This will hold the y values as we need them
// float y;
// Call it CIRCLE
// }CIRCLE;

// Then I am setting the property circle to act like the typedef CIRCLE
// CIRCLE circle;

// Now for the meat of this tutorial, the circle creation function
// The properties this takes are:
// k - the translation on the y axis
// r - the radius of the circle
// h - the translation on the x axis

// void createcircle (int k, int r, int h) {
// Now we begin drawing our lines
// 	glBegin(GL_LINES);
// Here we are setting up the vertices all in one line function, this 
// sets every 2 vertices to a line.

// First we begin our loop, this loop will cycle through, constantly
// changing our x and y values for our lines. It cycles through until
// it reaches 180, increasing in intervals of 1
// 	for (int i = 0;i < 180;i++)
// 	{
// Now to set up the current x value that we need for our vertex
// I am setting it to the radius of the circle, times by the cosine of 
// the current value of i, then I am taking h to translate it
// 	circle.x = r * cos(i) - h;
// Then to set up the current y value that we need for our vertex
// I am setting it to the radius of the circle, times by the sine of 
// the current value of i, then I am adding k to translate it
// 	circle.y = r * sin(i) + k;
// Then I am drawing the vertex
// 	glVertex3f(circle.x + k,circle.y - h,0);

// Now for the second part of the line, I am doing the same as above, only
// I am moving it 0.1 units so that I am not down to points. This also
// Lowers the chance of any holes occuring in the circle
// 	circle.x = r * cos(i + 0.1) - h;
// 	circle.y = r * sin(i + 0.1) + k;
// Then I am drawing the vertex
// 	glVertex3f(circle.x + k,circle.y - h,0);
// 	}
// 	glEnd();
// }

// Then to call it, use something like this:
// createcircle(0,10,0);

// That would create a circle that is originated around (0,0) and with
// a radius of 10 units.

// Changing GL_LINES to another shape can come up with some other little
// effects if you would like to give it a go.

// But other than that, this is all you need for a circle.

// If you have any queries, please email me at swiftless@gmail.com

#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>

typedef struct
{
float x;
float y;
}CIRCLE;

CIRCLE circle;

float rot = 0;

void createcircle (int k, int r, int h) {
	glBegin(GL_LINES);
	for (int i = 0;i < 180;i++)
	{
	circle.x = r * cos(i) - h;
	circle.y = r * sin(i) + k;
	glVertex3f(circle.x + k,circle.y - h,0);
	
	circle.x = r * cos(i + 0.1) - h;
	circle.y = r * sin(i + 0.1) + k;
	glVertex3f(circle.x + k,circle.y - h,0);
	}
	glEnd();
}

void display (void) {
	glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
	glTranslatef(0,0,-20);
	glRotatef(rot,0,1,0);
	glRotatef(rot,1,0,0);
	glRotatef(rot,0,0,1);
	glColor3f(1,1,1);
	createcircle(0,10,0);
	glRotatef(rot,0,1,0);
	glRotatef(rot,1,0,0);
	glRotatef(rot,0,0,1);
	glColor3f(1,0,0);
	createcircle(-2,8,-2);
	glRotatef(rot,0,1,0);
	glRotatef(rot,1,0,0);
	glRotatef(rot,0,0,1);
	glColor3f(0,1,0);
	createcircle(-1,6,-1);
	glRotatef(rot,0,1,0);
	glRotatef(rot,1,0,0);
	glRotatef(rot,0,0,1);
	glColor3f(0,0,1);
	createcircle(2,4,2);
	glRotatef(rot,0,1,0);
	glRotatef(rot,1,0,0);
	glRotatef(rot,0,0,1);
	glColor3f(0,1,1);
	createcircle(1,2,1);
	glutSwapBuffers();
	rot++;
}

void reshape (int w, int h) {
	glViewport (0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	gluPerspective (60, (GLfloat)w / (GLfloat)h, 0.1, 100.0);
	glMatrixMode (GL_MODELVIEW);
}

int main (int argc, char **argv) {
    glutInit (&argc, argv);
	glutInitDisplayMode (GLUT_DOUBLE);
	glutInitWindowSize (500, 500);
	glutInitWindowPosition (100, 100);
    glutCreateWindow ("A basic OpenGL Window");

    glutDisplayFunc (display);
	glutIdleFunc (display);
	glutReshapeFunc (reshape);
    glutMainLoop ();
    return 0;
}


