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
Version 2Code: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); }
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.
-----