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

 Java Discussion :

courbe de Bézier en Java


Sujet :

Java

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut courbe de Bézier en Java
    Bonjour à tous,

    j'essaie d'écrire un petit programme en java qui permet de dessiner des courbes de Béziers à partir des points donnés.
    d'après mes recherche j'ai compris que :
    une courbe de Béziers peut être écrite sous la forme suivante

    x(t)=∑_(k=0)^n▒〖xi*∁(n¦k) t^k 〖(1-t)〗^(n-k ) 〗
    y(t)=∑_(k=0)^n▒〖yi*∁(n¦k) t^k 〖(1-t)〗^(n-k ) 〗

    avec t appartient [0..1]
    sachant que j'ai uniquement les coordonnées des points et je connais leur ordre càd je connais qui est le point de départ et celui d'arrivé.

    1) est ce que ces données me permettent elles de construire ma courbe de Béziers

    2) pouvez vous m'expliquez la démarche à suivre pour dessiner en java une courbe de Béziers

    3) est-il obligatoire de définir une classe polynôme.


    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par azertyuio Voir le message
    sachant que j'ai uniquement les coordonnées des points et je connais leur ordre càd je connais qui est le point de départ et celui d'arrivé.

    1) est ce que ces données me permettent elles de construire ma courbe de Béziers
    Non, il faut aussi au moins un point de contrôle. Une courbe de bézier sans point de contrôle, on appelle ça un segment. C'est assez facile à faire .

    Citation Envoyé par azertyuio Voir le message
    2) pouvez vous m'expliquez la démarche à suivre pour dessiner en java une courbe de Béziers

    3) est-il obligatoire de définir une classe polynôme.
    Franchement, il est plus simple de se reposer sur CubicCurve2D.Double et QuadCurve2D.Double
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Non, il faut aussi au moins un point de contrôle. Une courbe de bézier sans point de contrôle, on appelle ça un segment. C'est assez facile à faire .
    evidement il me faut des points de contrôle quand j'ai mentionné les points j'ai voulu dire les points de controle
    et quant j'ai dit leurs ordres c'est pour indiquer que je connais le point de départ et d'arrivé
    car on sait que les bézier passe par le 1er et le dernier point et ne passe pas obligatoirement par les autres points


    Voilà un petit essai mais ça marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Vector points = new Vector ();
    	points.addElement (new Point (100,0,0));
    	points.addElement(new Point (300,0,0));
    	points.addElement(new Point (500,0,0));
    	points.addElement(new Point (100,350,0));
    	points.addElement(new Point (100,200,0));
    	float xt=0, yt=0;
    	for (int i=0; i<5; i++)
    	for(int t=0; t<=1; t+=0.1){
    		Point M = (Point)bbb.elementAt(i);
    		xt+= combinaison(i,4) * (float)Math.pow(t,i)*(float)Math.pow(1-t, 4-i)* M.x;
    		yt+= combinaison(i,4) * (float)Math.pow(t,i)*(float)Math.pow(1-t, 4-i)* M.y;
    		dessinerPoint(new Point (xt, yt, 0));
    	}

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Path2D path = new Path2D.Double();
    path.moveTo(p1.x, p1.y);
    path.curveTo(pc1.x, pc1.y, pc2.x, pc2.y, p2.x, p2.y);
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par bouye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Path2D path = new Path2D.Double();
    path.moveTo(p1.x, p1.y);
    path.curveTo(pc1.x, pc1.y, pc2.x, pc2.y, p2.x, p2.y);
    peux tu m'expliquer un peu le code

    et c'est quoi le path ?

    merci

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    java.awt.geom.Path2D
    java.awt.geom.Path2D.Float
    java.awt.geom.Path2D.Double
    java.awt.geom.GeneralPath


    Les classes qui permettent de dessiner des chemins, c'est à dire à peu près n'importe quelle forme.

    1) on crée un chemin vide.
    2) on déplace le pointeur (sans dessiner de trait) sur le premier point p1 du spline.
    3) on crée un spline de Bézier entre p1 et p2 avec les points de contrôle pc1 et pc2.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par bouye Voir le message
    java.awt.geom.Path2D
    java.awt.geom.Path2D.Float
    java.awt.geom.Path2D.Double
    java.awt.geom.GeneralPath


    Les classes qui permettent de dessiner des chemins, c'est à dire à peu près n'importe quelle forme.
    c'est à dire même les courbe de Béziers ?

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    la méthode curveTo() permet de dessiner un spline de Bézier entre le point courant et le prochain point à l'aide de deux points de contrôle.

    la méthode quadTo() permet de dessiner un spline quadratique entre le point courant et le prochain point à l'aide d'1 seul points de contrôle.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Point AA= new Point (100,0,0);
    	Point BB=new Point (300,0,0);
    	Point CC=new Point (500,0,0);
    	Point DD=new Point (100,350,0);
    	Point EE=new Point (100,200,0);
     
    CubicCurve2D path = new CubicCurve2D.Double();
     
    path.setCurve(AA.x, AA.y, BB.x, BB.y, CC.x, CC.y, DD.x, DD.y);
    voilà ce petit code en principe ça marche mais pour verifier je veux afficher cette courbe
    est ce que je dois définir une methode paint qui permet de la dessiner ?

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui, dans un JPanel ou un JComponent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * {@inheritDoc}
    */
    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D)g;
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2d.setColor(Color.BLACK);
      g2d.setStroke(new BasicStroke(1f));
      g2d.draw(path);
    }
    Bravo d'avoir également trouvé la class spécialement dédiée aux splines de Bézier par toi-même.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Petite question (pas un reproche juste par curiosité) ? D'où tires-tu la classe de points 3D que tu sembles utiliser ? C'est une classe perso ? Ou tu utilises Java3D ? N'oublie pas que l'AWT et Java2D disposent déjà de plusieurs classes de points 2D (Point, Point2D.Double et Point2D.Float).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par bouye Voir le message
    Bravo d'avoir également trouvé la class spécialement dédiée aux splines de Bézier par toi-même.
    merci beaucoup ça m'encourage


    Citation Envoyé par bouye Voir le message
    Petite question (pas un reproche juste par curiosité) ? D'où tires-tu la classe de points 3D que tu sembles utiliser ? C'est une classe perso ? Ou tu utilises Java3D ? N'oublie pas que l'AWT et Java2D disposent déjà de plusieurs classes de points 2D (Point, Point2D.Double et Point2D.Float).
    oui c'est une classe perso
    car au début j'ai des points 3D dans l espace et apres un certain traitement je définit un plan et je les projette sur ce plan pour travailler en 2D donc z=0 toujours.
    j'espère que j'ai repondu à ta question

    et merciiii beaucoup pour ton aide

  13. #13
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    juste une petite question
    si j'ai n points telque n> 4 alors comment je peut utiliser le code ci dessus ?
    est ce que je dois définir à chaque fois 4 points de telle façon le dernier sera la premier de la 2eme courbe ==>finalement le principe des spline ?

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben les splines de Bézier sont toujours définis avec 4 pts de contrôle donc...

    Un truc du genre :
    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
    Path2D path = new Path2D.Double();
    for (int i = 0 ; i < points.lenght - 1 - 3 ; i += 3) {
      if (i == 0) {
        path.moveTo(points[i].x, points[i].y);
      }
      int diff = points.lenght - 1 - i;
      // Line.
      if (diff  == 1) {
        path.lineTo(points[i+1].x, points[i+1].y);
      }
      // Quadratic spline.
      else if (diff  == 2) {
        path.quadTo(points[i+1].x, points[i+1].y, points[i+2].x, points[i+2].y);
      }
      // Bezier spline.
      else if (diff >= 3) {
        path.curveTo(points[i+1].x, points[i+1].y, points[i+2].x, points[i+2].y, points[i+3].x, points[i+3].y);
      }
    }
    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
    Path2D path = new Path2D.Double();
    CubicCurve2D bezier = null;
    QuadCurve2D quad= null;
    Line2D line = null;
    for (int i = 0 ; i < points.lenght - 1 - 3 ; i += 3) {
      if (i == 0) {
        path.moveTo(points[i].x, points[i].y);
      }
      int diff = points.lenght - 1 - i;
      Shape s = null;
      // Line.
      if (diff  == 1) {
        if (line == null) {
          line = new Line2D.Double();
        }
        line.setLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y);
        s= line;
      }
      // Quadratic spline.
      else if (diff  == 2) {
        if (quad == null) {
          quad = new QuadCurve2D.Double();
        }
        quad.setCurve(points[i].x, points[i].y, points[i+1].x, points[i+1].y, points[i+2].x, points[i+2].y);
        s = quad;
      }
      // Bezier spline.
      else if (diff >= 3) {
        if (bezier == null) {
          bezier = new CubicCurve2D.Double();
        }
        bezier.setCurve(points[i].x, points[i].y, points[i+1].x, points[i+1].y, points[i+2].x, points[i+2].y, points[i+3].x, points[i+3].y);
        s = bezier;
      }
      if (s != null) {
        path.append(s, true);
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Bonjour
    voilà j'ai écrit ce code et il m'affiche une courbe mais je ne sais pas si elle est juste voilà l'affichage



    et voilà le code
    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
     
    Vector aaa = new Vector ();  // Vector contenant des points  
    aaa.addElement(new Point(100,150,0));	
    aaa.addElement(new Point(150,50,0));	
    aaa.addElement(new Point(250,125,0));	
    aaa.addElement(new Point(400,0,0));	
    aaa.addElement(new Point(550,150,0));	
    aaa.addElement(new Point(700,100,0));	
    aaa.addElement(new Point(800,50,0));	
    aaa.addElement(new Point(850,50,0));	
     
     
    // afficher une droite brisée 
    for (int j=0; j<aaa.size()-1; j++){
    	Point AA, BB;
    	AA= (Point)aaa.elementAt(j);
    	BB= (Point)aaa.elementAt(j+1);	
    	ajouterLigne(AA,BB);
    }
     
    // afficher la courbe de bezier spline 
    for (int i=0; i<aaa.size()-3; i+=3){
     
    			Point AA= (Point) aaa.elementAt(i);	    
    			Point BB= (Point) aaa.elementAt(i+1);	    
    			Point CC= (Point) aaa.elementAt(i+2);	    
    			Point DD= (Point) aaa.elementAt(i+3);	    
     
    			CubicCurve2D path = new CubicCurve2D.Double();
     
    			path.setCurve(AA.x, AA.y, BB.x, BB.y, CC.x, CC.y, DD.x, DD.y);		
     
    			Graphics2D g2d = (Graphics2D)g;
    			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    			g2d.setColor(Color.BLACK);
    			g2d.setStroke(new BasicStroke(1f));
    	  		g2d.draw(path);
    		}

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    A priori elle devrait être bonne si tu ne sautes pas de points ou te plantes dans les indices sans faire exprès.
    Puisque tu ne te sers de tes courbes que pour le rendu, je te conseilles de faire plutôt ça, ça éviteras de de créer des objets temporaires inutiles :

    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
     
    private List<Point> aaa = new ArrayList<Point>(8); 
     
    [...]
     
    private CubicCurve2D curve = new CubicCurve2D.Double();
    private Paint curveForeground = Color.BLACK;
    private Stroke curveStroke = new BasicStroke(1f);
     
    [...]
     
     
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    for (int i=0; i<aaa.size()-3; i+=3){	
        Point AA= aaa.elementAt(i);	    
        Point BB=  aaa.elementAt(i+1);	    
        Point CC= aaa.elementAt(i+2);	    
        Point DD= aaa.elementAt(i+3);	    	
        curve.setCurve(AA.x, AA.y, BB.x, BB.y, CC.x, CC.y, DD.x, DD.y);	 
        g2d.setPaint(curveForeground );
        g2d.setStroke(curveStroke );
        g2d.draw(curve);
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par bouye Voir le message
    A priori elle devrait être bonne si tu ne sautes pas de points ou te plantes dans les indices sans faire exprès.
    au 4eme point la courbe me semble pointue
    que penses tu ?

    et merci pour le code c'ai vrai j'ai pas penser à éviter de de créer des objets temporaires inutiles.

  18. #18
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package javaapplication1;
     
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.Paint;
    import java.awt.Point;
    import java.awt.RenderingHints;
    import java.awt.Stroke;
    import java.awt.geom.CubicCurve2D;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Line2D;
    import java.util.LinkedList;
    import java.util.List;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
     
    /**
     *
     * @author Fabrice
     */
    public class Main extends JComponent {
     
        List<Point> aaa = new LinkedList<Point>();  // Vector contenant des points
        Ellipse2D circle = new Ellipse2D.Double();
        private Paint circleBackground = Color.RED;
        Line2D line = new Line2D.Double();
        private Paint lineForeground = Color.GRAY;
        private Stroke lineStroke = new BasicStroke(0.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, new float[]{5, 5}, 0);
        CubicCurve2D curve = new CubicCurve2D.Double();
        private Paint curveForeground = Color.BLACK;
        private Stroke curveStroke = new BasicStroke(1f);
     
        public Main() {
            aaa.add(new Point(100, 150));
            aaa.add(new Point(150, 50));
            aaa.add(new Point(250, 125));
            aaa.add(new Point(400, 0));
            aaa.add(new Point(550, 150));
            aaa.add(new Point(700, 100));
            aaa.add(new Point(800, 50));
            aaa.add(new Point(850, 50));
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Dimension size = getSize();
            Insets insets = getInsets();
            Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom));
            try {
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setPaint(lineForeground);
                g2d.setStroke(lineStroke);
                // afficher une droite brisée
                for (int j = 0; j < aaa.size() - 1; j++) {
                    Point AA = (Point) aaa.get(j);
                    Point BB = (Point) aaa.get(j + 1);
                    line.setLine(AA, BB);
                    g2d.draw(line);
                }
                g2d.setPaint(curveForeground);
                g2d.setStroke(curveStroke);
                // afficher la courbe de bezier spline
                for (int i = 0; i < aaa.size() - 3; i += 3) {
                    Point AA = aaa.get(i);
                    Point BB = aaa.get(i + 1);
                    Point CC = aaa.get(i + 2);
                    Point DD = aaa.get(i + 3);
                    curve.setCurve(AA.x, AA.y, BB.x, BB.y, CC.x, CC.y, DD.x, DD.y);
                    g2d.draw(curve);
                }
                // afficher un cercle rouge
                g2d.setPaint(circleBackground);
                for (int j = 0; j < aaa.size(); j++) {
                    Point AA = (Point) aaa.get(j);
                    circle.setFrameFromCenter(AA.x, AA.y, AA.x + 2.5, AA.y + 2.5);
                    g2d.fill(circle);
                }
            } finally {
                g2d.dispose();
            }
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void run() {
                    // TODO code application logic here
                    JFrame f = new JFrame("Test");
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.setSize(1000, 400);
                    f.setLayout(new BorderLayout());
                    f.add(new Main(), BorderLayout.CENTER);
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
            });
        }
    }
    Nom : Sans titre.png
Affichages : 1719
Taille : 21,3 Ko

    Ca me parait tout à fait correct. Faut pas oublier que pour faire 2 splines de bézier concécutifs il faut 7 points (le pts 4 est la fin du 1er spline et le début du second). Donc le 8ème point ne sert à rien (et ne fait pas partie du spline).

    Le 4ème point est pointu à cause de tes pts de contrôle justement, les deux tangentes semblent former un angle droit. Si tu veux un sommet "smooth" ou symétrique il faut que des tangentes aient le même coefficient de pente (modulo le signe).

    Nom : Sans titre2.png
Affichages : 1716
Taille : 62,0 Ko
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  19. #19
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 151
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ca me parait tout à fait correct. Faut pas oublier que pour faire 2 splines de bézier concécutifs il faut 7 points (le pts 4 est la fin du 1er spline et le début du second). Donc le 8ème point ne sert à rien (et ne fait pas partie du spline).
    Nom : Sans titre2.png
Affichages : 1716
Taille : 62,0 Ko
    ouais je confirme mais là je me trouve de nouveau au même problème
    il me faut toujours 4+3+3+3+....+3 points
    ce que je veux dire c'est que je ne peux pas tracer ma courbe si j'ai n points
    tel que par exemple n=11 il va me tracer une courbe qui passe par 10 points !!

    or la formule générale des Béziers :

    x(t)=∑_(k=0)^n▒〖xi*∁(n¦k) t^k 〖(1-t)〗^(n-k ) 〗
    y(t)=∑_(k=0)^n▒〖yi*∁(n¦k) t^k 〖(1-t)〗^(n-k ) 〗

    avec t appartient à [0..1]

    et là je constate que je peux dessiner une courbe avec N points.
    or avec les spline j'arrivais pas !!!

  20. #20
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Va falloir te chercher à te simplifier ton problème et utiliser les briques de dessin à ta disposition (splines quadratiques et cubiques).

    http://fr.wikipedia.org/wiki/Courbe_de_B%C3%A9zier

    Exemples
    Courbe de Bézier linéaire (de degré 1)
    Les points de contrôle P0 et P1 définissent la courbe de Bézier donnée par l'équation :


    Il s'agit donc du segment [P0, P1].




    Courbe de Bézier quadratique (de degré 2)
    Une courbe de Bézier quadratique est la courbe B(t) définie par les points de contrôle P0, P1 et P2.





    Courbe de Bézier cubique (de degré 3)
    Ce sont les courbes de Bézier les plus utilisées (car elles permettent d'assurer la continuité en tangence et en courbure de deux courbes raccordées). Une courbe de Bézier cubique est la courbe B(t) définie par les points de contrôle P0, P1, P2 et P3. Sa forme paramétrique est :





    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. 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.

    Par exemple, pour une courbe définie par les points A, B, C, D, E, F et G, on utilise les courbes cubiques définies par A, B, C, et D, et par D, E, F, et G et la continuité est ainsi assurée. Pour avoir une courbe C1 en D, il faut que [C, D] = [D, E], et si en plus on veut qu'elle soit C2 en D, alors [B, D] = [D, F], et de même pour les dérivées successives.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Courbe de Bézier
    Par acacia dans le forum Mathématiques
    Réponses: 11
    Dernier message: 31/03/2010, 17h59
  2. Position sur une Courbe de Bézier
    Par Kurisu dans le forum Mathématiques
    Réponses: 2
    Dernier message: 29/06/2007, 07h49
  3. Courbes et Histogrammes en Java
    Par snetechen dans le forum 2D
    Réponses: 6
    Dernier message: 04/07/2006, 14h31
  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