#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#include "ex2.h"

// variabile Globale

CERC c[16];    // declararea unui vector de 16 cercuri

int main(void)
//*********
{
// variabile locale

int CercCurent=0,gata=0,k;

// cod

   OurInitGraph(); // initializarea modului grafic

// initializarea valorilor pentru cele 16 cercuri si afisarea lor pe ecran

   for(k=0;k<16;k++)    
      {
       c[k].x = 30*k+100;
       c[k].y =      200;
       c[k].r =  5*k+ 25;
       c[k].c =    k    ;
       Afiseaza(&c[k]);
      }

   while(!gata)
     switch(getch())
       {
        case ESC:
          gata=1;
          break;
        case TAB:
          CercCurent++;
          CercCurent%=16;
          break;
		case UNU:    Creste( &c[CercCurent], +10     ); break;
		case DOI:    Creste( &c[CercCurent], -10     ); break;
        case 0:
          switch(getch())
            {
             case LEFT:  Muta(   &c[CercCurent], -10,  0 ); break;
             case RIGHT: Muta(   &c[CercCurent],  10,  0 ); break;
             case UP:    Muta(   &c[CercCurent],   0,-10 ); break;
             case DOWN:  Muta(   &c[CercCurent],   0, 10 ); break;
             default:    break;
            }
       }
   closegraph();
   return 0;
}

void Sterge(CERC *c)
//******************
// functie care sterge un cerc (prin scrierea unui cerc negru peste cel vechi)
{
   setcolor(BLACK);
   circle(c->x,c->y,c->r);     // stergere
}

void Afiseaza(CERC *c)
//********************
// functie care afiseaza un cerc
{
   setcolor(c->c);
	circle(c->x,c->y,c->r);     //afisare
}

void Muta(CERC *c,int dx,int dy)
//******************************
// functie care muta un cerc (sterge cercul de pe vechea pozitie, modifica
// coordonatele centrului si apoi afiseaza cercul pe noua pozitie)
{
   Sterge(c);           //stergere cerc

   c->x += dx;          //mutare coordonate centru
   c->y += dy;

   Afiseaza(c);         //afisare in noua pozitie
}

void Creste(CERC *c,int dr)
//*************************
// functie care modifica dimensiunea unui cerc (sterge cercul cu dimensiunea
// veche, modifica raza cercului si apoi afiseaza cercul cu noua dimensiune)
{
   Sterge(c);           //stergere

   c->r += dr;          //redimensionare

   Afiseaza(c);         //afisare cu noua dimensiune
}

void OurInitGraph()
//*****************
{
int gdriver = DETECT, gmode, errorcode;

   initgraph(&gdriver,&gmode,""); /* initialize graphics and local variables */

   errorcode = graphresult();     /* read result of initialization */
   if (errorcode != grOk)         /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);                    /* terminate with an error code */
   }
}
