Courbe de bezier

Signaler
Messages postés
6
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
2 décembre 2008
-
Messages postés
1
Date d'inscription
dimanche 5 juin 2005
Statut
Membre
Dernière intervention
5 mai 2009
-
beman

7 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
18
et ?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
sur wikipedia t'as une explication claire et des formules pour ces courbes.
Messages postés
10
Date d'inscription
dimanche 26 août 2007
Statut
Membre
Dernière intervention
14 juin 2008

Salut,

voila un code en c que j'ai realisé il y a pas longtemps sur ces courbe avec la SDL

/* Courbe de Bézier
by Ango973 */

#include <stdio.h>
#include <stdlib.h>
#include <SDL\SDL.h>

void pause();

void ligne(int x0,int y0, int x1,int y1, Uint32 c);

void putpixel(int xe, int ye, Uint32 couleur);

void bezier (int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, int n);

SDL_Surface *ecran = NULL;

Uint32 color;

int main(int argc, char *argv[]){

    Uint32 color_screen;

    SDL_Init(SDL_INIT_VIDEO);

    ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
    color_screen = SDL_MapRGB(ecran->format,255,255,255);

    SDL_WM_SetCaption("Courbe de Brezier !", NULL);
    SDL_FillRect(ecran,0,color_screen);

    SDL_Flip(ecran);

    bezier(150,450,220,300,300,50,660,500,4);

    pause();

    SDL_Quit();

    return EXIT_SUCCESS;
}

void bezier (int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, int n)
{
    int xab, yab, xbc, ybc, xcd, ycd, xabc, yabc, xbcd, ybcd, xg, yg;

    color = SDL_MapRGB(ecran->format,183,111,255);

    if (n == 0){

        ligne(xa,ya,xb,yb,color);
        ligne(xb,yb,xc,yc,color);
        ligne(xc,yc,xd,yd,color);

        SDL_Flip(ecran);

    }
    else{
        xab = (xa + xb)/2;
        yab = (ya + yb)/2;
        xbc = (xb + xc)/2;
        ybc = (yb + yc)/2;
        xcd = (xc + xd)/2;
        ycd = (yc + yd)/2;
        xabc = (xab + xbc)/2;
        yabc = (yab + ybc)/2;
        xbcd = (xbc + xcd)/2;
        ybcd = (ybc + ycd)/2;
        xg = (xabc + xbcd)/2;
        yg = (yabc + ybcd)/2 ;

        bezier(xa,ya,xab,yab,xabc,yabc,xg,yg,n-1) ;
        bezier(xg,yg,xbcd,ybcd,xcd,ycd,xd,yd,n-1) ;
    }
}

void pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

void putpixel(int xe, int ye, Uint32 couleur)
{
    Uint32 * numerocase;

    numerocase = (Uint32 *)(ecran->pixels) + xe + ye * ecran->w;
    *numerocase = couleur;
}

void ligne(int x0,int y0, int x1,int y1, Uint32 c)
{
    int dx,dy,x,y,residu,absdx,absdy,pasx,pasy,i;

    dx = x1 - x0;
    dy = y1 - y0;
    residu = 0;   /* il s’agit d’une division euclidienne, avec quotient et reste */
    x = x0;
    y = y0;
    putpixel(x,y,c);

    if (dx > 0){
        pasx = 1;
    }
    else{
        pasx = -1;
    }

    if (dy > 0){
        pasy = 1;
    }
    else{
        pasy = -1;
    }

    absdx = abs(dx);
    absdy = abs(dy);

    if (dx == 0){
        for(i = 0; i < absdy; i++) {
              y += pasy;
              putpixel(x,y,c);
        }
    }
    else{
      if(dy == 0) {
        for(i = 0;i < absdx; i++){
             x += pasx;
             putpixel(x,y,c);
        }
      }
      else{
        if (absdx == absdy){
            for(i = 0; i < absdx; i++) {
                x += pasx;
                y += pasy;
                putpixel(x,y,c);
            }
        }
        else{
          if (absdx > absdy){
              for(i=0;i= absdx) {
                      residu -= absdx;
                      y += pasy;
                  }
                  putpixel(x,y,c);
              }
          }
          else{
            for(i=0;i=absdy){
                    residu -= absdy;
                    x += pasx;
                }
                putpixel(x,y,c);
            }
          }
        }
      }
    }
}

Ango973
Messages postés
10
Date d'inscription
dimanche 26 août 2007
Statut
Membre
Dernière intervention
14 juin 2008

Salut,

voila un code en c que j'ai realisé il y a pas longtemps sur ces courbe avec la SDL

/* Courbe de Bézier
by Ango973 */

#include <stdio.h>
#include <stdlib.h>
#include <SDL\SDL.h>

void pause();

void ligne(int x0,int y0, int x1,int y1, Uint32 c);

void putpixel(int xe, int ye, Uint32 couleur);

void bezier (int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, int n);

SDL_Surface *ecran = NULL;

Uint32 color;

int main(int argc, char *argv[]){

    Uint32 color_screen;

    SDL_Init(SDL_INIT_VIDEO);

    ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
    color_screen = SDL_MapRGB(ecran->format,255,255,255);

    SDL_WM_SetCaption("Courbe de Brezier !", NULL);
    SDL_FillRect(ecran,0,color_screen);

    SDL_Flip(ecran);

    bezier(150,450,220,300,300,50,660,500,4);

    pause();

    SDL_Quit();

    return EXIT_SUCCESS;
}

void bezier (int xa, int ya, int xb, int yb, int xc, int yc, int xd, int yd, int n)
{
    int xab, yab, xbc, ybc, xcd, ycd, xabc, yabc, xbcd, ybcd, xg, yg;

    color = SDL_MapRGB(ecran->format,183,111,255);

    if (n == 0){

        ligne(xa,ya,xb,yb,color);
        ligne(xb,yb,xc,yc,color);
        ligne(xc,yc,xd,yd,color);

        SDL_Flip(ecran);

    }
    else{
        xab = (xa + xb)/2;
        yab = (ya + yb)/2;
        xbc = (xb + xc)/2;
        ybc = (yb + yc)/2;
        xcd = (xc + xd)/2;
        ycd = (yc + yd)/2;
        xabc = (xab + xbc)/2;
        yabc = (yab + ybc)/2;
        xbcd = (xbc + xcd)/2;
        ybcd = (ybc + ycd)/2;
        xg = (xabc + xbcd)/2;
        yg = (yabc + ybcd)/2 ;

        bezier(xa,ya,xab,yab,xabc,yabc,xg,yg,n-1) ;
        bezier(xg,yg,xbcd,ybcd,xcd,ycd,xd,yd,n-1) ;
    }
}

void pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

void putpixel(int xe, int ye, Uint32 couleur)
{
    Uint32 * numerocase;

    numerocase = (Uint32 *)(ecran->pixels) + xe + ye * ecran->w;
    *numerocase = couleur;
}

void ligne(int x0,int y0, int x1,int y1, Uint32 c)
{
    int dx,dy,x,y,residu,absdx,absdy,pasx,pasy,i;

    dx = x1 - x0;
    dy = y1 - y0;
    residu = 0;   /* il s’agit d’une division euclidienne, avec quotient et reste */
    x = x0;
    y = y0;
    putpixel(x,y,c);

    if (dx > 0){
        pasx = 1;
    }
    else{
        pasx = -1;
    }

    if (dy > 0){
        pasy = 1;
    }
    else{
        pasy = -1;
    }

    absdx = abs(dx);
    absdy = abs(dy);

    if (dx == 0){
        for(i = 0; i < absdy; i++) {
              y += pasy;
              putpixel(x,y,c);
        }
    }
    else{
      if(dy == 0) {
        for(i = 0;i < absdx; i++){
             x += pasx;
             putpixel(x,y,c);
        }
      }
      else{
        if (absdx == absdy){
            for(i = 0; i < absdx; i++) {
                x += pasx;
                y += pasy;
                putpixel(x,y,c);
            }
        }
        else{
          if (absdx > absdy){
              for(i=0;i= absdx) {
                      residu -= absdx;
                      y += pasy;
                  }
                  putpixel(x,y,c);
              }
          }
          else{
            for(i=0;i=absdy){
                    residu -= absdy;
                    x += pasx;
                }
                putpixel(x,y,c);
            }
          }
        }
      }
    }
}

Ango973
Messages postés
10
Date d'inscription
dimanche 26 août 2007
Statut
Membre
Dernière intervention
14 juin 2008

Desolé d'avoir posté deux fois j'ai pas fait expré si tu as des questions n'hesite pas.

Ango973
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
Messages postés
1
Date d'inscription
dimanche 5 juin 2005
Statut
Membre
Dernière intervention
5 mai 2009

Bonjour!

Je regarde ton programme Ango, mais je ne parviens pas a comprendre la logique de calcul de la fonction "bezier".
Quelqu'un pourrait il éclairer ma lanterne sil vous plait?

Merci :)