Réaliser des transformations en java (GUI)
FerméKX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 8 oct. 2022 à 11:06
- Réaliser des transformations en java (GUI)
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Dism-gui - Guide
- Java apk - Télécharger - Langages
- Mkvtoolnix gui - Télécharger - Montage & Édition
1 réponse
8 oct. 2022 à 11:06
Bonjour,
Pour la première question, tu as fait ta rotation autour du point (posXOval, posYOval) qui n'est pas le centre de ton ovale, mais son coin supérieur gauche, il faudrait donc changer comme ça :
g2d.rotate(Math.toRadians(ROTATION), getWidth()/2.0, getHeight()/2);
Par contre il faut appliquer une rotation opposé après avoir dessiné l'ovale, sinon le carré sera également affecté par cette rotation.
@Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; double posXCentre = getWidth() / 2.0; double posYCentre = getHeight() / 2.0; //cree une oval double posXOval = posXCentre - DIAM_HORIZ / 2; double posYOval = posYCentre - DIAM_VERT / 2; g2d.rotate(Math.toRadians(ROTATION), posXCentre, posYCentre); g2d.setColor(Color.magenta); Ellipse2D.Double oval = new Ellipse2D.Double(posXOval, posYOval, DIAM_HORIZ, DIAM_VERT); g2d.fill(oval); g2d.rotate(Math.toRadians(-ROTATION), posXCentre, posYCentre); // cree un carre double posXCarre = posXCentre - COTE_CARRE / 2; double posYCarre = posYCentre - COTE_CARRE / 2; g2d.setColor(Color.yellow); Rectangle2D.Double carre = new Rectangle2D.Double(posXCarre, posYCarre, COTE_CARRE, COTE_CARRE); g2d.fill(carre); }
Pour la deuxième question, tu t'es complètement mélangé les pinceaux, dans ta boucle tu fais toujours g2d.setColor(Color.MAGENTA) donc forcément la couleur ne change pas selon la transparence, de plus tu fais g2d.rotate(MAX_TRANSPARENCE) ce qui n'a pas de sens, c'est un angle qu'il te faut, pas une couleur, sans oublier comme pour ta première question qu'il faut faire une rotation opposée pour pas cumuler les rotations.
//coin de la petite pastille coinXPastille = centreComposantX + RAYON_GROS_CERCLE - RAYON_PASTILLE; // creer une boucle de dessin for(bulle = 0; bulle < NB_PASTILLES; bulle++) { double ratio = ((double) bulle) / NB_PASTILLES; transparence = (int) (ratio * MAX_TRANSPARENCE); g2d.setColor( new Color(255, 30, 255, transparence)); pastille = new Ellipse2D.Double(coinXPastille, coinYPastille, RAYON_PASTILLE*2, RAYON_PASTILLE*2); double theta = ratio * 2 * Math.PI; g2d.rotate(theta, centreComposantX, centreComponsantY); g2d.fill(pastille); g2d.rotate(-theta, centreComposantX, centreComponsantY); }
Enfin, troisième question, tu n'as rien fait du tout pour que ça fonctionne... Dans le stateChanged, tu as commenté le code carreFlexible.setGrandeur(); c'est pourtant bien là qu'il faut intervenir, quant à ton dessin du carré, il doit prendre en compte le scale, sinon il dessinera toujours la même chose.
JSpinner spnDimCareeVert = new JSpinner(); spnDimCareeVert.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { // change la taille du caree a l'aide du tourniquet carreFlexible.setGrandeur((int) spnDimCareeVert.getValue()); carreFlexible.repaint(); } });
public class CarreFlexible extends JPanel { @Serial private static final long serialVersionUID = 1L; private static final double COTE_CARRE = 55; private int scale = 1; public void setGrandeur(int spn) { scale = spn; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.green); Rectangle2D.Double carre = new Rectangle2D.Double(0, 0, scale * COTE_CARRE, scale * COTE_CARRE); g2d.fill(carre); } }