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

void elipsa(double a, double b) {
  double t;

  glBegin(GL_LINE_LOOP);
    glVertex2d(a, 0);
    for(t = 0.0; t < 2.0 * M_PI; t += M_PI / 100.0) 
      glVertex2d(a * cos(t), b * sin(t));
  glEnd();
} // elipsa

void slikaj(void) {
  glClear(GL_COLOR_BUFFER_BIT);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glColor3d(1.0, 0.5, 0.5);
  elipsa(8.0, 4.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslated(0.0, -4.0, 0.0);
  glRotated(30.0, 0.0, 0.0, 1.0); // oko osi z
  glColor3d(0.0, 1.0, 0.0);
  elipsa(8.0, 4.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glScaled(-1.0, 1.0, 1.0); // zrcaljenje na osi y
  glTranslated(2.0, 0.0, 0.0);
  glRotated(75.0, 0.0, 0.0, 1.0); // oko osi z
  glColor3d(1.0, 1.0, 0.0);
  elipsa(4.0, 1.0);

  glFlush();
} // slikaj

void skaliraj(int w, int h) {
  double xmin = -10.0, xmax = 10.0;
  double xrange = xmax - xmin;
  double yrange = h * xrange / w;

  glViewport(0, 0, w, h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(xmin, xmax, -yrange / 2.0, yrange / 2.0);
} // skaliraj

void tipka(unsigned char c, int x, int y) {
  if(c == 'q') exit(0);
} // tipka

int main(int argc, char** argv) {
  glutInit(&argc, argv); // -geometry 600x300+60+30
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

  //glutInitWindowPosition(60, 30);
  //glutInitWindowSize(600, 300);
  glutCreateWindow("GLelipse");

  glClearColor(0.0, 0.0, 0.0, 0.0);

  glutDisplayFunc(slikaj);
  glutReshapeFunc(skaliraj);
  glutKeyboardFunc(tipka);
  glutMainLoop();
  return 0;
} // main
