Partage
  • Partager sur Facebook
  • Partager sur Twitter

Courbe de Bezier

    21 juin 2020 à 3:40:28

    Bonjour a vous !
    Quoi que pas mal en mathématique , je suis pas mathématicien du tout.
    J'aimerais comprendre la formule de la courbe de bezier si vous voulez bien m'aider !

    {\displaystyle P(t)=\sum _{i=0}^{n}B_{i}^{n}(t)\cdot \mathbf {P} _{i}}

    t est normalisé ( entre 0 et 1 )
    B = polynome de Bernstein
    n = nombre de points.

    Si je comprend bien cette formule , il faut appliquer la formuler des polynomes de Bernstein sur t pour chaque points et le multiplier par le point ? ( je sais pas si j'ai bien formuler mon idée .. )

    Est-ce que ce pseudo-code serait proche de la formule ?
    p[1] = ..
    p[2] = ..
    p[3] = ..
    p[4] = ..
    
    pt = 0
    
    for i = 0 ... 4
       pt += bernstein(t,4,i) * p[i]
    J'envois n et i en parametre a la fonction du polynome de bernstein car j'ai l'impression vu la notation que cette formule en aura aussi besoin

    Pour le polynome de bernstain on a :

    {\displaystyle B_{i}^{m}(u)={\binom {m}{i}}u^{i}(1-u)^{m-i}},
    Est-ce que la premiere parenthese du polynome de bernstein c'est une 'multiplication itérative' (désolé je ne sais pas comment ca se nomme encore .. ) ?? Un peu comme le symbole de 'somme itérative' ( Le gros E stylé de la formule de la courbe mais avec une multiplication ?? )

    P.S si on pouvais me dire comment ecrire ces symboles mathématiques .. je sais que OC le supporte mais j'ai aucune idée de comment ca fonctionne .

    Merci pour les infos variés que vous me donnerez !

    Edit :: Bon ok je lis les formule encore et encore et je crois que je ne suis pas loin de comprendre. Je me rend compte que le petit point dans la formule de la courbe n'est pas une multiplication , mais 'une insertion' (point de controle?) de Pi dans la formule de Bernstein :

    de wiki :
    • Pour n = 3 on a :
    {\displaystyle 1^{3}=(1-t+t)^{3}=((1-t)+t)^{3}=(1-t)^{3}+3(1-t)^{2}t+3(1-t)t^{2}+t^{3}}

    Puis on ajoute les n+1 points de contrôle pour chaque coefficient du polynôme et on obtient,

    {\displaystyle P(t)=(1-t)^{3}\mathbf {P} _{0}+3(1-t)^{2}t\mathbf {P} _{1}+3(1-t)t^{2}\mathbf {P} _{2}+t^{3}\mathbf {P} _{3}}



    Voici mon essaie en c++ de ce que j'ai compris des formules .. a premier vu ca semble fonctionnel !

    #include <iostream>
    #include <vector>
    #include <assert.h>
    #include <type_traits>	
    #include <math.h>
    
    /*
      'Hardcoded' Berstein polynomes functions for a Cubic ( 4 points ) curve.
    */
    template<class T>
    T GetBezierPointOnCurve_4_points(const std::vector<T>& P, float t)
    {
    	assert(
    		(std::is_same<int, T>::value || std::is_same<float, T>::value || std::is_same<double, T>::value)
    		&& "T doit etre de type INT ou FLOAT"
    	);
    
    	assert(
    		(t >= 0 && t <= 1) 
        		&& "T dois etre compris entre 0 et 1"
    	);
    
    	auto n{ P.size() };
    
    	if(n!=4){
    		//works only for 4 points for now
    		return 0;
    	}
    	
      	// TODO : move bernstein polynomes into a generic function
    	T control_point_1 = pow(1.0 - t, 3) * P[0];
    	T control_point_2 = 3 * pow(1.0 - t, 2) * t * P[1];
    	T control_point_3 = 3 * (1.0 - t) * pow(t, 2) * P[2];
    	T control_point_4 = pow(t, 3) * P[3];
      
    	return ( control_1 + control_2 + control_3 + control_4 );
    }
    
    int main(void)
    {
      	// Cubic curve.
      	// Curve goes from point 1 to point 4 without touching point 2 and 3 ( which are direction vectors )
    	std::vector<float> P = { 0.0 , 1.0 , 1.0 , 0.0 };
      
    	for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
    		std::cout << "Point on curve for t " << t << " : " << GetBezierPointOnCurve_4_points(P, t) <<std::endl;
    	}
      
    	return 0;
    }



    -
    Edité par CrevetteMagique 21 juin 2020 à 19:09:02

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2020 à 19:05:55

      Edit : J'arrive pas à faire s'afficher correctement les formules, si tu peux m'éclairer...

      Salut,

      Tu utilises correctement la formule.

      \(\begin{pmatrix}
      m\\
      i
      \end{pmatrix}\) ça ne répresente pas la multiplication dont tu parles (tu as ici une liste des symboles mathématiques couramment utilisés : https://openclassrooms.com/forum/sujet/comment-rediger-des-maths-sur-le-site-du-zero), mais le nombre de combinaisons de i éléments parmi m : https://fr.wikipedia.org/wiki/Combinaison_(math%C3%A9matiques).

      Tu peux aussi voir la formule initiale comme le produit scalaire entre le vecteur composé des n polynômes de Bernstain et le vecteur des points de contrôle. Cette écriture n'est en effet pas claire.

      Selon moi tu calcules correctement la courbe dans ton code.

      Pour calculer les polynômes de Bernstein, la page sur les combinaisons va t'éclairer, mais voici la formule :

      \(\begin{pmatrix}
      m\\
      i
      \end{pmatrix} = \frac{m!}{i!(m-i)!}\) 


      Tu peux regarder le binôme de Newton au passage, c'est de là que vient la formule des polynômes de Bernstein : https://fr.wikipedia.org/wiki/Formule_du_bin%C3%B4me_de_Newton#:~:text=La%20formule%20du%20bin%C3%B4me%20de,bin%C3%B4me%20ou%20formule%20de%20Newton.

      -
      Edité par leukos 23 juin 2020 à 19:26:02

      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2020 à 19:43:46

        Merci pour ton retour et tes liens !
        C'est rassurant de voir que je perd pas trop ma logique mathématique.
        J'ai fait quelques tests et ca me semble en effet juste.

        Par contre je coince un peu dans le cas ou ma courbe est composé de plusieurs points.
        Wikipedia en dit ceci :

        Courbe de Bézier de degré supérieur à 3
        Elles sont rarement utilisées. On préfère se ramener à l'utilisation de courbes cubiques que l'on raccorde afin de conserver le bénéfice de la continuité de courbure. Pour cela, il faut et il suffit que le dernier point d'une courbe soit le premier d'une autre. On obtient ainsi une courbe continue.
        Alors je comprend l'idée générale , mais c'est dans son application que c'est pas clair pour moi.
        1 - Est-ce que chacune de mes courbes sont comprises entre 0 et 1 puis je raccorde les resultat bout a bout pour former une plus longue courbe ? Dans ce cas , la premier point de la deuxieme courbe n'est-il pas en réalité  t > 1 et ainsi ca prendrais 2x plus de temps a une animation ?

        2 - Est-ce que j'ai plusieurs points compris dans [0,1] , je prend les 4 premiers et je normalise les points par rapport au quatrieme , je calcule la courbe que je ramenne sur le référentiel de la courbe total par la suite?

        Je sais pas si j'suis clair .. mais si ce l'est pas je peux tenter de reformuler et/ou faire des graphiques !
        Merci !

        -
        Edité par CrevetteMagique 23 juin 2020 à 19:45:07

        • Partager sur Facebook
        • Partager sur Twitter
          24 juin 2020 à 17:28:00

          Lorsque tu dis que ta courbe est composée de plusieurs points, tu veux dire qu'elle doit passer par plus de deux points de contrôle ?

          Je suppose que c'est juste pour plus de 4 points de contrôle en fait. (d'ailleurs je comprends pas pourquoi on est obligé de raccorder pour plus de points de contrôle, je vois pas comment il peut y avoir un saut dans la courbure)

          En attendant ta réponse, j'essaie d'éclairer le raccordement des courbes cubiques :

          Je suppose que tu as 7 points de contrôle, P(0), ..., P(6)

          Sur [0,1], tu obtiens une première courbe avec P(0), ..., P(3)

          Sur [1,2] (en posant t'=t-1 pour ne pas changer tes formules), tu obtiens une deuxième courbe avec P(3), ..., P(6)

          Les points de contrôle extrémaux sont des points de passage, comme tu utilises P(3) des deux côté ta courbe est continue.

          Si tu veux aussi la continuité des dérivées successives, il faut rajouter des contraintes sur tes points de contrôle comme évoqué dans la suite de la page Wikipédia.

          De cette façon tu obtiens une courbe sur [0,2], donc si j’interprète bien ce que tu veux dire oui ça prendrait deux fois plus de temps.

          Si tu veux rester sur [0,1], tu peux développer (1/2-t+t)^3 pour t allant de 0 à 1/2 plutôt que (1-t+t)^3 pour t allant de 0 à 1. Enfin ce n'est qu'une façon de faire parmi d'autres, ce que tu proposes fonctionne aussi et est peut-être plus simple.

          • Partager sur Facebook
          • Partager sur Twitter
            24 juin 2020 à 21:44:44

            leukos a écrit:

            Lorsque tu dis que ta courbe est composée de plusieurs points, tu veux dire qu'elle doit passer par plus de deux points de contrôle ?

            Je suppose que c'est juste pour plus de 4 points de contrôle en fait. (d'ailleurs je comprends pas pourquoi on est obligé de raccorder pour plus de points de contrôle, je vois pas comment il peut y avoir un saut dans la courbure)

            En attendant ta réponse, j'essaie d'éclairer le raccordement des courbes cubiques :

            Je suppose que tu as 7 points de contrôle, P(0), ..., P(6)

            Sur [0,1], tu obtiens une première courbe avec P(0), ..., P(3)

            Sur [1,2] (en posant t'=t-1 pour ne pas changer tes formules), tu obtiens une deuxième courbe avec P(3), ..., P(6)

            Les points de contrôle extrémaux sont des points de passage, comme tu utilises P(3) des deux côté ta courbe est continue.

            Si tu veux aussi la continuité des dérivées successives, il faut rajouter des contraintes sur tes points de contrôle comme évoqué dans la suite de la page Wikipédia.

            De cette façon tu obtiens une courbe sur [0,2], donc si j’interprète bien ce que tu veux dire oui ça prendrait deux fois plus de temps.

            Si tu veux rester sur [0,1], tu peux développer (1/2-t+t)^3 pour t allant de 0 à 1/2 plutôt que (1-t+t)^3 pour t allant de 0 à 1. Enfin ce n'est qu'une façon de faire parmi d'autres, ce que tu proposes fonctionne aussi et est peut-être plus simple.


            Oui je crois que tu interprete bien ce que j'ai voulu dire. Désolé mais comme j'ai dans le passé travaillé avec des courbes dnas le cadre d'animation , je me sert de cet exemple pour illustré. Donc effectivement , pour moi [0,2] résulte en une animation "deux fois plus longue". Je dois donc rester dans la plage [0,1].

            Donc dans mon cas j'ai besoin d'une courbe qui fini toujours a (1,1).
            Voici un image de ce que je voulais dire par une courbe avec plus de points dans une plage [0,1]
            Je crois que tu comprend ce que je veut dire puisque tu me dis ceci :
            "Si tu veux rester sur [0,1], tu peux développer (1/2-t+t)^3 pour t allant de 0 à 1/2 plutôt que (1-t+t)^3 pour t allant de 0 à 1"

            Donc l'idée est la , cependant , parfois pour une question de beauté visuelle , je peut vouloir mon point commun central plus loin que 1\2 pour avoir une animation répartie plus vers la fin que le debut .. bon j'ai fait une petite image pour illustrer ..

            Ceci donnerait par exemple un effet 'bulle' si on applique cette courbe au size. Je veut que ma bulle soit plus grosse au debut et plus rapide a la fin. Ainsi je place mon point central a 0.7 plutot que 0.5. C'est possible et calculabe ?? ( ben j'imagine que oui , je me suis pas attarder a mettre les chiffres sur papier et les manipuler ).
            Désolé j'suis pas mal pour manipuler les chiffres mais je connais pas les notation mathématiques et les termes :D

            -
            Edité par CrevetteMagique 24 juin 2020 à 21:51:39

            • Partager sur Facebook
            • Partager sur Twitter
              24 juin 2020 à 22:26:46

              Oui ça se fait très bien, quand on calcule (1-t+t)³ c'est pour avoir une combinaison convexe de 4 éléments (somme de coefficients positifs qui somment à 1).

              Ce qui fait que je me rends maintenant compte que j'ai écrit une bêtise, mais je la corrige ici :

              On veut toujours une combinaison convexe, mais pour t allant de 0 à t'.

              Donc on va calculer (1-t/t'+t/t') ³ = (1-t/t')³+3(1-t/t')²t/t'+3(1-t/t')(t/t')²+(t/t')³

              Comme ça on a toujours une somme égale à 1 et pour t=t' on tombe bien sur le quatrième point de contrôle, ce qui n'est pas le cas avec ce que j'ai répondu précédemment.

              -
              Edité par leukos 24 juin 2020 à 22:27:53

              • Partager sur Facebook
              • Partager sur Twitter

              Courbe de Bezier

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown