IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

courbes de Bézier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 21
    Points : 15
    Points
    15
    Par défaut courbes de Bézier
    Bonjour
    Je suis sur la réalisation d'un logiciel de dessin vectoriel et je rencontre un pb avec les courbes de Bézier.
    Le problème est je pense au niveau algo et pas directement lié au C, donc déplacez le topic si nécessaire...

    Disons que ça marche a peu près mais c'est pas très précis.

    voici ma fonction pour tracer une courbe:

    formule pour un courbe de Bézier cubique (cf wikipédia):
    B(t) = P0(1-t)^3 + 3*P1*t(1-t)^2 + 3*P2*t^2*(1-t) + P3*t^3
    avec t compris entre 0 (début du traçé) et 1 (fin du traçé)
    P0 = pt source, P1-P2 = pts de controles, P3 = pt cible

    variables et fonctions:
    this->aX, this->aY: position courante du point (donc P0 sur la formule)
    ligne(floatx, float y); fonction pour tracer une segment du point courant (this->aX, this->aY) jusqu'à (x,y)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Draw::bezierCubABS(float x1, float y1, float x2, float y2, float x, float y)
    {
    	float ptx, pty; //point de destination de chaque segment du traçé
    	float t;
     
    	for(t=0; t<=1; t+=0.1) {
    		ptx = this->aX*pow((1-t),3) + 3*x1*t*pow(1-t, 2) + 3*x2*pow(t, 2)*(1-t) + x*pow(t,3);
    		pty = this->aY*pow((1-t),3) + 3*y1*t*pow(1-t, 2) + 3*y2*pow(t, 2)*(1-t) + y*pow(t,3);
    		ligne(ptx, pty);
    	}
    	ligne(x,y); // finit le traçé au cas ou ça ne tombe pas pile poil
     
    }
    La fonction me trace une espèce de patate qui ressemble à cercle, quand je diminue l'incrémentation de t ça ressemble plus à un cercle mais c'est du coup c'est segmenté.

    Une idée?

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    résolu! xD
    En ré-écrivant mon code pour ce topic je me suis aperçu d'une ânerie:
    J'utilise mes this->aX, this->aY plusieurs fois alors qu'ils sont modifiés à chaque appel de ligne();
    je l'ai ai donc stockés dans des variables provisoires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	float x0 = this->aX;
    	float y0 = this->aY;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Avec l'algorithme de De Casteljau (C et bibliothèque SDL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    typedef struct _points{
            double x, y;
     }Points;
     
    static void Casteljau(double t,Points* tab,int nbpoints,double *rx,double *ry)
    {
    	if (nbpoints == 1)
    	{
    		*rx = tab[0].x;
    		*ry = tab[0].y;
    		return;
    	}
     
    	Points subtab[nbpoints];
    	int i;
    	for(i=0;i<nbpoints-1;i++)
    	{
    		subtab[i].x = t*tab[i].x + (1-t)*tab[i+1].x;
    		subtab[i].y = t*tab[i].y + (1-t)*tab[i+1].y;
    	}
     
    	Casteljau(t, subtab, nbpoints-1, rx, ry);
    }
     
    void ShowBezier(SDL_Surface* screen, Points* tab, double tstep, int nbPoints, Uint32 couleur)
    {
    	double t = 0.0;
    	Points p, plast;
     
    	plast.x=plast.y=0;
    	double rx = 0.0;
    	double ry = 0.0;
    	int i = 0;
    	while(t<=1.0)
    	{
    		Casteljau(t,tab,nbPoints,&rx,&ry);
    		p.x = (int)rx;
    		p.y = (int)ry;
    		if (i!=0)
    			ligne_Bresenham(screen,p,plast,couleur);
    		plast.x = p.x;
    		plast.y = p.y;
    		t+=tstep;
    		i++;
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Courbe de Bézier
    Par acacia dans le forum Mathématiques
    Réponses: 11
    Dernier message: 31/03/2010, 17h59
  2. Courbes de bézier sous CSS 2?
    Par sirbaldur dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 18/09/2007, 15h27
  3. Position sur une Courbe de Bézier
    Par Kurisu dans le forum Mathématiques
    Réponses: 2
    Dernier message: 29/06/2007, 07h49
  4. recherche doc sur les courbe de bézier
    Par amaury pouly dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/04/2003, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo