Pas de dépendances
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <sdl/sdl.h> #ifdef WIN32 #pragma comment(lib,"sdl.lib") #pragma comment(lib,"sdlmain.lib") #endif #define PI 3.141592653589f #define RESX 800 #define RESY 600 void SDL_PutPixel32(SDL_Surface *surface, int x, int y, Uint32 pixel) { Uint8 *p; if (x<0 || y<0 || x>=RESX || y>=RESY) return; p = (Uint8*)surface->pixels + y * surface->pitch + x * 4; *(Uint32*)p = pixel; } void Line(SDL_Surface* surf,int x1,int y1, int x2,int y2,Uint32 couleur) // Bresenham { int x,y; int Dx,Dy; int xincr,yincr; int erreur; int i; Dx = abs(x2-x1); Dy = abs(y2-y1); if(x1<x2) xincr = 1; else xincr = -1; if(y1<y2) yincr = 1; else yincr = -1; x = x1; y = y1; if(Dx>Dy) { erreur = Dx/2; for(i=0;i<Dx;i++) { x += xincr; erreur += Dy; if(erreur>Dx) { erreur -= Dx; y += yincr; } SDL_PutPixel32(surf,x, y,couleur); } } else { erreur = Dy/2; for(i=0;i<Dy;i++) { y += yincr; erreur += Dx; if(erreur>Dy) { erreur -= Dy; x += xincr; } SDL_PutPixel32(surf,x, y,couleur); } } SDL_PutPixel32(surf,x1,y1,couleur); SDL_PutPixel32(surf,x2,y2,couleur); } void Circle(SDL_Surface* surf,int x1,int y1, int radius,Uint32 couleur) { // inspiré de http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/bresenham.html int d,x,y,x2m1,max; y=radius; d= -radius; x2m1= -1; max = (int)(radius/sqrt(2.0)); for(x=0;x<=max;x++) { x2m1 += 2; d+= x2m1; if (d>=0) { y--; d -= (y<<1); } SDL_PutPixel32(surf,x1+x,y1+y,couleur); SDL_PutPixel32(surf,x1-x,y1+y,couleur); SDL_PutPixel32(surf,x1+x,y1-y,couleur); SDL_PutPixel32(surf,x1-x,y1-y,couleur); SDL_PutPixel32(surf,x1+y,y1+x,couleur); SDL_PutPixel32(surf,x1-y,y1+x,couleur); SDL_PutPixel32(surf,x1+y,y1-x,couleur); SDL_PutPixel32(surf,x1-y,y1-x,couleur); } } int Render(SDL_Surface* screen,int nbp,float table) { int i; int radius = RESY/2-2; int cx,cy; cx = RESX/2; cy = RESY/2; SDL_FillRect(screen,NULL,0xFFFFFFFF); Circle(screen,cx,cy,radius,0x00000000); for(i=0;i<nbp;i++) { float angle1,angle2; angle1 = 2.f*PI*i/nbp; angle2 = 2.f*PI*i*table/nbp; Line(screen,(int)(cx + radius * cosf(angle1)),(int)(cy + radius * sinf(angle1)),(int)(cx + radius * cosf(angle2)),(int)(cy + radius * sinf(angle2)),0x00000000); } SDL_Flip(screen); return 0; } int main(int argc,char** argv) { Uint8 * key; int numkeys; SDL_Surface* screen; int nbp = 10; float table = 2; SDL_Init(SDL_INIT_VIDEO); screen=SDL_SetVideoMode(RESX,RESY,32,SDL_SWSURFACE|SDL_DOUBLEBUF); do { SDL_PumpEvents(); key = SDL_GetKeyState(&numkeys); if (key[SDLK_UP]) nbp++; if (key[SDLK_DOWN] && nbp>1) nbp--; if (key[SDLK_RIGHT]) table+=0.01f; if (key[SDLK_LEFT] && table>1) table-=0.01f; Render(screen,nbp,table); SDL_Delay(1); } while(!key[SDLK_ESCAPE]); SDL_Quit(); return 0; }
Illustration graphique d'une table de multiplication : Inspiré de la chronique de Mickaël Launay : https://www.youtube.com/watch?v=-X49VQgi86E Utilisez les flèches pour animer : HAUT/BAS : rajouter des points GAUCHE/DROITE : changer de table de multiplication. ECHAP pour quitter.