#include "functions.h" #include "draw.h" int main(void) { double xmin=-2.0, xmax=2.0, ymin=-1.5, ymax=1.5, xmin2, xmax2, ymin2, ymax2; double xinc = (xmax-xmin)/10.0, yinc = (ymax-ymin)/10.0; // Incrément x et y double x1, y1; double zx = 0.0, zy = 0.0; int mode = MANDEL; int iter_p = 10, zoom = 0, evt = 0, iter = 150, x = 1, y = 1, vect_x = 0, vect_y = 0; int invalidate = 1; int w, h, clic = 0; Color black = (Color)0; malloc_screen_tab(); MandelPoint new_point = new_MandelPoint(black, 0, 0, 0); fill_screen_tab(new_point); volatile int delay; //Calcul des vraies couleurs du curseur(couleurs extraites du niveau de gris) init_pointeur(); clrscr(); while(!(K_ESC)){ if(invalidate){ xinc = (xmax-xmin)/10.0, yinc = (ymax-ymin)/10.0; mandel(xmin, xmax, ymin, ymax, iter_p, zx, zy, mode); } if(K_ENTER) { mandel(xmin, xmax, ymin, ymax, iter, zx, zy, mode); } evt = getEvt(); invalidate = 0; if(K_X && K_PLUS){ zx+=0.1; wait_no_key_pressed(); invalidate = 1; } else if(K_X && K_MINUS){ zx-=0.1; wait_no_key_pressed(); invalidate = 1; } if(K_Y && K_PLUS){ zy+=0.1; wait_no_key_pressed(); invalidate = 1; } else if(K_Y && K_MINUS){ zy-=0.1; wait_no_key_pressed(); invalidate = 1; } if(K_MULTIPLY){ xmin+=xinc; xmax-=xinc; ymin+=(3.0*xinc)/4.0; ymax-=(3.0*xinc)/4.0; wait_no_key_pressed(); zoom++; iter_p++; invalidate = 1; } else if(K_DIVIDE){ xmin-=xinc; xmax+=xinc; ymin-=(3.0*xinc)/4.0; ymax+=(3.0*xinc)/4.0; wait_no_key_pressed(); zoom--; invalidate = 1; } if(K_PLUS){ iter_p+=5; wait_no_key_pressed(); invalidate = 1; } else if(K_MINUS){ iter_p-=5; wait_no_key_pressed(); invalidate = 1; } if(K_DEL){ xmin=-2.0, xmax=2.0, ymin=-1.5, ymax=1.5; zoom=0; iter_p=10; zx=0.0; zy=0.0; wait_no_key_pressed(); invalidate = 1; } if(K_M) { mode = MANDEL; invalidate = 1; } else if(K_J) { // On copie les couleurs en cache fill_pointer_tab(x, y); // On affiche le curseur pointeur(x,y); clic = 0; wait_no_key_pressed(); evt = 0; while(!(K_ESC) && !(K_DEL) && clic < 1){ evt = getEvt(); invalidate = 0; if(K_UP){ vect_y = (y > 1) ? -1 : 0; invalidate = 1; } else if(K_DOWN){ vect_y = (y < 239) ? 1 : 0; invalidate = 1; } if(K_RIGHT){ vect_x = (x < 319) ? 1 : 0; invalidate = 1; } else if(K_LEFT){ vect_x = (x > 1) ? -1 : 0; invalidate = 1; } if(K_J){ wait_no_key_pressed(); zx = xmin + x*(xmax-xmin)/320; zy = ymax - y*(ymax-ymin)/240; // On copie les couleurs en cache fill_pointer_tab(x, y); wait_no_key_pressed(); mode = JULIA; clic++; } if(invalidate){ // 1- On rétabli les couleurs apply_pointer_tab(x, y); // 2- On copie les nouvelles couleurs x+=vect_x; y+=vect_y; vect_x=0; vect_y=0; fill_pointer_tab(x, y); // 3- On remet le curseur pointeur(x,y); for(delay=0;delay<100000;delay++){}; // Delay entre chaque mouvement. } } // 1- On rétabli les couleurs apply_pointer_tab(x, y); wait_no_key_pressed(); invalidate = 1; } if(K_Z){ // On copie les couleurs en cache fill_pointer_tab(x, y); // On affiche le curseur pointeur(x,y); clic = 0; wait_no_key_pressed(); evt = 0; while(!(K_ESC) && !(K_DEL) && clic < 2){ evt = getEvt(); invalidate = 0; if(K_UP){ vect_y = (y > 1) ? -1 : 0; invalidate = 1; } else if(K_DOWN){ vect_y = (y < 239) ? 1 : 0; invalidate = 1; } if(K_RIGHT){ vect_x = (x < 319) ? 1 : 0; invalidate = 1; } else if(K_LEFT){ vect_x = (x > 1) ? -1 : 0; invalidate = 1; } if(K_Z){ wait_no_key_pressed(); if(clic < 1){ // Le premier clic x1 = x; // sauve position curseur(x,y) dans (x1,y1) y1 = y; // } else { // Le deuxième if(x1 < x){ // On part vers la droite xmin2 = xmin+((x1)*(xmax-xmin)/320.0); xmax2 = xmin+((x)*(xmax-xmin)/320.0); if(y1 < y){ // On part vers le bas ymax2 = ymax-((y1)*(ymax-ymin)/240.0); ymin2 = (3.0*(xmin2-xmax2)/4.0)+ymax2; } else if(y1 > y){ // ou vers le haut ymin2 = ymax-((y1)*(ymax-ymin)/240.0); ymax2 = (3.0*(xmax2-xmin2)/4.0)+ymin2; } } else if(x1 > x){ // ou vers la gauche xmax2 = xmin+((x1)*(xmax-xmin)/320.0); xmin2 = xmin+((x)*(xmax-xmin)/320.0); if(y1 < y){ // On part vers le bas ymax2 = ymax-((y1)*(ymax-ymin)/240.0); ymin2 = (3.0*(xmin2-xmax2)/4.0)+ymax2; } else if(y1 > y){ // ou vers le haut ymin2 = ymax-((y1)*(ymax-ymin)/240.0); ymax2 = (3.0*(xmax2-xmin2)/4.0)+ymin2; } } // Une fois le traitement terminé, on assigne le nouvel encadrement xmin = xmin2, xmax = xmax2, ymin = ymin2, ymax = ymax2; } line(0, y, 320, y, new_Color_RGB(255, 255, 255)); line(x, 0, x,240, new_Color_RGB(255, 255, 255)); // On copie les couleurs en cache fill_pointer_tab(x, y); // for(delay=0;delay<500000;delay++) // Delay entre chaque clic. wait_no_key_pressed(); clic++; } if(invalidate){ // 1- On rétabli les couleurs apply_pointer_tab(x, y); // 2- On copie les nouvelles couleurs x+=vect_x; y+=vect_y; vect_x=0; vect_y=0; fill_pointer_tab(x, y); // 3- On remet le curseur pointeur(x,y); for(delay=0;delay<100000;delay++){}; // Delay entre chaque mouvement. } } // 1- On rétabli les couleurs apply_pointer_tab(x, y); wait_no_key_pressed(); invalidate = 1; } if(K_UP || K_DOWN || K_LEFT || K_RIGHT) { unsigned x = 0, y = 0; int origin = 0; if(K_UP){ ymin += yinc; ymax += yinc; y = 24; origin = 1; wait_no_key_pressed(); invalidate = 1; } else if(K_DOWN){ ymin -= yinc; ymax -= yinc; y = 24; origin = 0; wait_no_key_pressed(); invalidate = 1; } if(K_LEFT){ xmin -= xinc; xmax -= xinc; x = 32; origin = 1; wait_no_key_pressed(); invalidate = 1; } else if(K_RIGHT){ xmin += xinc; xmax += xinc; x = 32; origin = 0; wait_no_key_pressed(); invalidate = 1; } apply_screen_tab(x, y, origin, new_point); } else if(evt) { if(!(K_PLUS) && !(K_ENTER)) { new_point = new_MandelPoint(black, 0, 0, 0); fill_screen_tab(new_point); } else { invalidate_screen_tab(); } } } free_screen_tab(); return 0; }