/* 5. feladat
Módosítsa a körrajzoló eljárást hogy tetszõleges körívet rajzolhasson! */
// #include <math.h>
// #include <GL\glut.h>
// #include <stdlib.h>

#include "stdafx.h"
#define PI 3.1415926535898

void circlepoints_arc(int x, int y,int szog,int szog1,float sin0,float sin1,int _x,int _y) {
 
  glPointSize(3.0);
     if ( (0<=szog) && (szog<45) ) {    //Az iv I.-bol indul
 
  glBegin(GL_POINTS);
   if    ((szog1<=45)&&(sin0<=x)&&(y<=sin1)) glVertex2f(y+_x,x+_y);
   else if (szog1<=90) { if (sin0<=x) glVertex2f(y+_x,x+_y);
          if (y<=sin1) glVertex2f(x+_x,y+_y);
   }
 

   else if (szog1<=135) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           if (y>=sin1) glVertex2f(-x+_x,y+_y);
   }
   else if (szog1<=180) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
              if (x>=sin1) glVertex2f(-y+_x,x+_y);
   }
   else if (szog1<=225) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           if (-x>=sin1) glVertex2f(-y+_x,-x+_y);
   }
   else if (szog1<=270) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           if (sin1<=-y) glVertex2f(-x+_x,-y+_y);
   }
   else if (szog1<=315) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0<=x) glVertex2f(y+_x,x+_y);
           glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }

  glEnd();
  }
 
     else if ( (szog<=90) ){
 
  glBegin(GL_POINTS);
 
      if (szog1<=90) { if ((sin0<=y) && (y<=sin1)) glVertex2f(x+_x,y+_y);}
   else if (szog1<=135) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           if (y>=sin1) glVertex2f(-x+_x,y+_y);
   }
   else if (szog1<=180) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           if (x>=sin1) glVertex2f(-y+_x,x+_y);
   }
   else if (szog1<=225) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           if (-x>=sin1) glVertex2f(-y+_x,-x+_y);
   }
   else if (szog1<=270) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           if (sin1<=-y) glVertex2f(-x+_x,-y+_y);
   }
   else if (szog1<=315) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0<=y) glVertex2f(x+_x,y+_y);
           glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }

  glEnd();
  }
  else if ( szog<=135 ){   //Az iv II.-bol indul

  glBegin(GL_POINTS);
 
   if (szog1<=135) { if ((sin0>=y) && (y>=sin1)) glVertex2f(-x+_x,y+_y); }
   else if (szog1<=180) { if (sin0>=y) glVertex2f(-x+_x,y+_y);
              if (x>=sin1) glVertex2f(-y+_x,x+_y);
   }
   else if (szog1<=225) { if (sin0>=y) glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           if (-x>=sin1) glVertex2f(-y+_x,-x+_y);
   }
   else if (szog1<=270) { if (sin0>=y) glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           if (sin1<=-y) glVertex2f(-x+_x,-y+_y);
   }
   else if (szog1<=315) { if (sin0>=y) glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0>=y) glVertex2f(-x+_x,y+_y);
           glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }

  glEnd();
     }
 
  else if ( szog<=180 ){

  glBegin(GL_POINTS);
 
      if (szog1<=180) { if ((sin0>=x) && (x>=sin1)) glVertex2f(-y+_x,x+_y);}
   else if (szog1<=225) { if (sin0>=x) glVertex2f(-y+_x,x+_y);
           if (-x>=sin1) glVertex2f(-y+_x,-x+_y);
   }
   else if (szog1<=270) { if (sin0>=x) glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           if (sin1<=-y) glVertex2f(-x+_x,-y+_y);
   }
   else if (szog1<=315) { if (sin0>=x) glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0>=x) glVertex2f(-y+_x,x+_y);
           glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }

  glEnd();
     }
  else if ( szog<=225 ){        //Az iv III.-bol indul

  glBegin(GL_POINTS);
 
      if (szog1<=225) { if ((sin0>=-x) && (-x>=sin1)) glVertex2f(-y+_x,-x+_y);}
   else if (szog1<=270) { if (sin0>=-x) glVertex2f(-y+_x,-x+_y);
           if (sin1<=-y) glVertex2f(-x+_x,-y+_y);
   }
   else if (szog1<=315) { if (sin0>=-x) glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0>=-x) glVertex2f(-y+_x,-x+_y);
           glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }
  glEnd();
  }
  else if ( szog<=270 ){

  glBegin(GL_POINTS);
 
      if (szog1<=270) { if ((sin0>=-y) && (sin1<=-y)) glVertex2f(-x+_x,-y+_y);}
   else if (szog1<=315) { if (sin0>=-y) glVertex2f(-x+_x,-y+_y);
           if (sin1>=-y) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0>=-y) glVertex2f(-x+_x,-y+_y);
           glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }
  glEnd();
  }
  else if ( szog<=315 ){     //Az iv IV.-bol indul

  glBegin(GL_POINTS);
 
      if (szog1<=315) { if ((sin0<=-y) && (sin1>=-y)) glVertex2f(x+_x,-y+_y);
   }
   else if (szog1<=360) { if (sin0<=-y) glVertex2f(x+_x,-y+_y);
           if (sin1>=-x) glVertex2f(y+_x,-x+_y);
   }
  glEnd();
  }
  else if ( szog<=360 ){

  glBegin(GL_POINTS);
 
      if (szog1<=360) { if ((sin0<=-x) && (sin1>=-x)) glVertex2f(y+_x,-x+_y);}
  glEnd();
  }
 
  glFlush();
}

void arc(int x0,int y0,int alfa,int beta, int radius) {
     double x,y,d;
     float sinus0,sinus1;
  if (alfa>beta){
     x=alfa;
  alfa=beta;
  beta=x;
  }
  sinus0=radius*sin(alfa*PI/180);
  sinus1=radius*sin(beta*PI/180);

  x =0;
   y =radius ;
     d = 1 - radius;
  circlepoints_arc(x,y,alfa,beta,sinus0,sinus1,x0,y0);
     while(y > x) {
          if(d < 0) {
               d += 2*x + 3;
               x++;
          }
          else {
               d += 2*(x - y) + 5;
               x++;
               y--;
          }
     circlepoints_arc(x,y,alfa,beta,sinus0,sinus1,x0,y0);
   }
}

void sziv(int x,int y){
 arc(-30+x,10+y,0,270,30);
 arc(30+x,10+y,0,180,30);
 arc(30+x,10+y,270,360,30);
 arc(-30+x,-50+y,0,90,30);
 arc(30+x,-50+y,90,180,30);
}

void level(int x,int y){
 arc(-20+x,40+y,270,360,20);
 arc(20+x,40+y,180,270,20);
 arc(-20+x,0+y,90,270,20);
 arc(20+x,0+y,0,90,20);
 arc(20+x,0+y,270,360,20);
 glLineWidth(3.0);
 glBegin(GL_LINES);
  glVertex2f(-10+x,-30+y);
  glVertex2f(-10+x,-40+y);
  glVertex2f(10+x,-30+y);
  glVertex2f(10+x,-40+y);
  glVertex2f(-20+x,-50+y);
  glVertex2f(20+x,-50+y);
 glEnd();
 arc(-20+x,-30+y,0,90,10);
 arc(-20+x,-40+y,270,360,10);
 arc(20+x,-30+y,180,90,10);
 arc(20+x,-40+y,180,270,10);

}

void virag(int x,int y,int r){
// arc(0+x,0+y,0,360,r);
 arc(r+x,0+y,120,240,r);
 arc(-r+x,0+y,0,60,r);
 arc(-r+x,0+y,300,360,r);

 arc(cos( 60*PI/180)*r+x,sin( 60*PI/180)*r+y,180,300,r);
 arc(cos(120*PI/180)*r+x,sin(120*PI/180)*r+y,240,360,r);
 arc(cos(240*PI/180)*r+x,sin(240*PI/180)*r+y,0,120,r);
 arc(cos(300*PI/180)*r+x,sin(300*PI/180)*r+y,60,180,r);
}

void init() {
 glClearColor(1.0,1.0,1.0,1.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
    gluOrtho2D(-200,200,-200,200);
}

void display() {
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3d(1.0,0.0,0.0);
 sziv(-90,90);
 glColor3d(0.0,0.8,0.0);
 level(100,100);
 glColor3d(0.8,0.0,0.6);
 virag(0,-45,60);
}

void keyboard( unsigned char key, int x,int y) {
 switch (key) {
 case 27:
  exit(0);
  break;
 }
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize(400,400);
 glutInitWindowPosition(100,100);
 glutCreateWindow("körívek_1");
 init();
 glutDisplayFunc(display);
 glutKeyboardFunc(keyboard);
 glutMainLoop();

 return 0;
}