Illustration de tables de multiplication

Illustration de tables de multiplication

Voir version :

Pas de dépendances

Télécharger :

#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;
}



Commentaires

	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.