Dessin d'un arc plein Swing Java
Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Dessin d'un arc plein Swing Java



  1. #1
    electron22

    Dessin d'un arc plein Swing Java


    ------

    Bonjour,
    Je souhaite dessiner un virage (arc plein), j'utilise les méthodes (curveTo, moveTo ..) puisque le dessin devrait être paramétrable (épaisseur, hauteur/largeur, coordonnées...).
    Pour dessiner l'arc, j'ai pris en compte les coordonnées d'un sinus (cercle trigonométrique), puisque la largeur devrait être identique tout au long de l'arc.
    Comme la méthode curveTo propose que trois coordonnées, je l'ai renseigné comme suit :
    - Point de départ : xi (ce point n'est pas renseigné dans curveTo)
    - Deux points intermédiaires : racine(3)/2 et 1/2.
    - Point final : hauteur de l'arc

    Je dessine deux arcs de deux hauteurs différents pour créer une épaisseur.

    Mon problème est que quand je dessine l'arc plein, la largeur de l'arc n'est identique tout au long du dessin. (Juste au début et à la fin mais pas au milieu).

    Je me suis dit que comme je choisi que deux points, l'arc n'est pas correctement dessiné (normalement il faut les trois points : racine(3)/2, racine(2)/2 et 1/2 pour dessiner un arc parfait, je pense ...). Les coordonnées ne sont pas équitablement répartis, curveTo n'arrive pas à dessiner un arc comme je veux.

    Ensuite, j'ai changé de méthode, je voulais modifier les coordonnées pour mieux les répartir, j'ai divisé la largeur (coordonnées x) en trois distances identiques, je n'arrive pas à convertir mes trois coordonnées de x en radian pour avoir l'image du sinus...

    Image de l'arc résultat ci-jointe

    Voici les deux version de codes :

    Version 1
    Code:
    	void dessineVirage(Graphics g)
    	{
    		g.setColor(new Color(100, 100, 150));
    
    		 GeneralPath gp1;
    		 gp1 = new GeneralPath();
    	
    	      Graphics2D g2D = (Graphics2D) g;
    
    //*************************************************
    
    	      //Variables du virage
    	      
    	      int largeurRoutes = 50;  //Paramérable
    	      int multiLarge = 3;        //Paramérable
    	      int xi = 100;                 //Paramérable
    
    	      int largeurVirageB = multiLarge * largeurRoutes; 
    	      int largeurVirageA = largeurVirageB - largeurRoutes;
    	      
    	      int hauteurVirageB = multiLarge * largeurRoutes; 
    	      int hauteurVirageA = hauteurVirageB - largeurRoutes;
    	      
    	      int yi = env.axeX - env.MesRoutes[0].hauteur;
    
    
    	      int xai = xi + largeurRoutes; //Paramérable
    	      int xa1 = (int) (xai + (largeurVirageA - (largeurVirageA * Math.sqrt(3.0))/2));
    	      int xa2 = xai + (hauteurVirageA/2);
    	      int xa3 = xai + largeurVirageA;
    
    	      int xbi = xi;
    	      int xb1 = (int) (xbi + (largeurVirageB - (largeurVirageB * Math.sqrt(3.0))/2));
    	      int xb2 = xbi + (largeurVirageB/2); 
    	      int xb3 = xbi + largeurVirageB;
    	      
    	      int yai = yi;
    	      int ya1 = yai - (hauteurVirageA/2);
    	      int ya2 = yai - (int)(hauteurVirageA * Math.sqrt(3.0)/2);
    	      int ya3 = yai - hauteurVirageA;
    
    	      int ybi = yi;
    	      int yb1 = ybi - (hauteurVirageB/2);
    	      int yb2 = ybi - (int)(hauteurVirageB * Math.sqrt(3.0)/2);
    	      int yb3 = ybi - hauteurVirageB;
    
    	      //Dessin
    	      gp1.moveTo(xai, yai);
    	      gp1.curveTo(xa1, ya1, xa2, ya2, xa3, ya3);
    	      gp1.lineTo(xb3, yb3);
    	      
    	      gp1.curveTo(xb2, yb2, xb1, yb1, xbi, ybi);
    	      gp1.lineTo(xai, yai);
    	      
    	      g2D.fill(gp1);
    	      
    	}
    Version 2

    Code:
    	void dessineVirage(Graphics g)
    	{
    		g.setColor(new Color(100, 100, 150));
    
    		 GeneralPath gp1;
    		 gp1 = new GeneralPath();
    	
    	      Graphics2D g2D = (Graphics2D) g;
    
    //*************************************************
    	      //Variables du virage
    	      
    	      int largeurRoutes = 50;  //Paramérable
    	      int multiLarge = 3;        //Paramérable
    	      int xi = 100;                 //Paramérable
    
    	      double largeurVirageB = multiLarge * largeurRoutes; 
    	      double largeurVirageA = largeurVirageB - largeurRoutes;
    	      
    	      double hauteurVirageB = multiLarge * largeurRoutes; 
    	      double hauteurVirageA = hauteurVirageB - largeurRoutes;
    	      
    	      double yi = env.axeX - env.MesRoutes[0].hauteur;
    
    
    	      double xai = xi + largeurRoutes; //Paramérable
    	      double xa1 = xai + (hauteurVirageA/3);//(int) (xai + (largeurVirageA - (largeurVirageA * Math.sqrt(3.0))/2));
    	      double xa2 = xai + 2*(hauteurVirageA/3);
    	      double xa3 = xai + largeurVirageA;
    
    	      double xbi = xi;
    	      double xb1 = xbi + (hauteurVirageB/3); //(int) (xbi + (largeurVirageB - (largeurVirageB * Math.sqrt(3.0))/2));
    	      double xb2 = xbi + 2*(largeurVirageB/3); 
    	      double xb3 = xbi + largeurVirageB;
    	      
    	      double yai = yi;
    	      double ya1 = (yai - (hauteurVirageA * ( Math.sin(Math.PI/6))));//(hauteurVirageA/2);
    	      double ya2 = (yai - (hauteurVirageA *  ( Math.sin(Math.PI/3)))); //(int)(hauteurVirageA * Math.sqrt(3.0)/2);
    	      double ya3 = yai - hauteurVirageA;
    
    	      double ybi = yi;
    	      double yb1 = (ybi - (hauteurVirageB *  ( Math.sin(Math.PI/6))));//(hauteurVirageB/2);
    	      double yb2 = (ybi - (hauteurVirageB *  ( Math.sin(Math.PI/3))));//(int)(hauteurVirageB * Math.sqrt(3.0)/2);
    	      double yb3 = ybi - hauteurVirageB;
    
    	      //Dessin
    	      gp1.moveTo(xai, yai);
    	      gp1.curveTo(xa1, ya1, xa2, ya2, xa3, ya3);
    	      gp1.lineTo(xb3, yb3);
    	      
    	      gp1.curveTo(xb2, yb2, xb1, yb1, xbi, ybi);
    	      gp1.lineTo(xai, yai);
    	      
    	      g2D.fill(gp1);
    	      
    	}


    Mes questions : Est ce que c'est la bonne méthode pour dessiner un arc plein paramétrable ? est ce qu'il y a un problème dans le code ou dans le raisonnement, calcul .. ? Je vous remercie. J'espère que j'ai expliqué comme il faut mon problème n'hésiter pas à me poser des questions.

    -----
    Images attachées Images attachées  
    Dernière modification par electron22 ; 16/07/2016 à 15h03.

Discussions similaires

  1. Swing maxi bande FM commerciale ?
    Par bo61 dans le forum Électronique
    Réponses: 10
    Dernier message: 26/08/2014, 07h53
  2. [JAVA swing] Problème avec des JPanel mis à la façon des Poupées Russes
    Par Aenonis dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 09/08/2013, 03h32
  3. liste dessin php html java ...
    Par MANTA.. dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 23/08/2012, 16h49
  4. Java Swing: setBounds
    Par martini_bird dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 15/02/2006, 20h41