Objet mal dimensionné

Fermé
psn - 27 déc. 2022 à 21:40
Lumberjack33 Messages postés 8 Date d'inscription samedi 31 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022 - 31 déc. 2022 à 12:16

Bonjour,
J'ai un Mur (qui contient 3 briques par défaut). Vous pouvez modifier sa hauteur et sa largeur totale, ainsi que sa masse et le nombre de briques qu'il contient.

Problème : Quand je demande, par exemple, un mur de 1 mètre de large (100 centimètres avec le JSpinner). On peut voir qu'il occupe bien plus que 1/5 de la largeur du composant, qui est censé représenter 5 mètres.

Et en plus : initialement, par défaut, le mur a une hauteur de 45 cm et une largeur de 45 cm : ce doit être un carré !! Mais j'ai un rectangle à la place

public class Brique implements Dessinable, Selectionnable {
	private double masseEnKg = 1;
	private Rectangle2D.Double carreMuret;
	private Shape carreT;
	private Color couleur;
	private double largeur = 0.1;
	private double hauteur = 0.1;
	private Vecteur2D position;  
	private Vecteur2D vitesse = new Vecteur2D(0,0); //par defaut
	private Vecteur2D accel = new Vecteur2D(0,0); //par defaut
	private double pixelsParMetre=1;

	private Vecteur2D gravF = MoteurPhysique.calculForceGrav(masseEnKg);



	private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);


	public void addPropertyChangeListener(PropertyChangeListener listener) {
		this.pcs.addPropertyChangeListener(listener);
	}


	public Brique(Vecteur2D position, double largeur, double hauteur, Color couleur) {
		this.position = new Vecteur2D(position);
		this.largeur = largeur;
		this.hauteur = hauteur;
		this.couleur = couleur;
		creerLaGeometrie();
	}



	private void creerLaGeometrie() {
		carreMuret = new Rectangle2D.Double(position.x, position.y, largeur, hauteur);

		this.pcs.firePropertyChange("position", "?", this.position);
		this.pcs.firePropertyChange("acceleration", -1, this.accel);
		this.pcs.firePropertyChange("vitesse", -1, this.vitesse);
		this.pcs.firePropertyChange("forceGrav", -1, this.gravF);
	}

	@Override
	public void dessiner(Graphics2D g2d) {

		Graphics2D g2dCopie = (Graphics2D) g2d.create();

		AffineTransform mat = new AffineTransform();
		mat.scale(pixelsParMetre, pixelsParMetre);
		carreT = mat.createTransformedShape(carreMuret);
		g2dCopie.setColor(this.couleur);
		g2dCopie.fill(carreT);
		g2dCopie.setColor(Color.BLACK);
		g2dCopie.draw(carreT);

	}


Muret :

package geometrie;

import java.awt.*;
import java.util.List;

//creation du Muret a partir de briques
public class Muret extends Brique {
	public Muret(Vecteur2D position, double largeur, double hauteur, Color couleur) {
		super(position, largeur, hauteur, couleur);
	}

	private List<Brique> briques;

	public void setBriques(List<Brique> briques) {
		this.briques = briques;
	}
}

Scène ou je mets mes objets dessinables :

public class ZoneAnimationPhysique extends JPanel implements Runnable{
	private static final long serialVersionUID = 1L;

	private double largeurDuComposantEnMetres = 5;
	private double hauteurDuComposantEnMetres;


	private double pixelsParMetre;
	private boolean premiereFois=true;

	private int numOfBrique = 3;
	private List<Brique> muret = new ArrayList<Brique>(); //cree list briques
	private double largeurTotal = 0.45; 
	private double hauteur = 0.45;
	private int masseMuret = 1; // en kg

public ZoneAnimationPhysique() {
		setBackground(Color.lightGray);

		creeLeMuret();


	}//fin du constructeur

	public void creeLeMuret() {		
		//cree le muret avec les briques

		for (int i = 0; i < numOfBrique; i++) {
			Vecteur2D posInit = new Vecteur2D(largeurTotal*(i+1), 0.1);
			Brique brique = new Brique(posInit, largeurTotal, hauteur, Color.BLUE);
			brique.setMasseEnKg(masseMuret);
			forceGrav = MoteurPhysique.calculForceGrav(masseMuret);
			brique.setSommeDesForces(forceGrav); 
			muret.add(brique); 
		}
	}

	/**
	 * Permet de dessiner une scene 
	 * @param g Contexte graphique
	 */
	@Override
	public void paintComponent(Graphics g) {		
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;	
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

		if (premiereFois) {
			pixelsParMetre = getWidth()/largeurDuComposantEnMetres;
			hauteurDuComposantEnMetres = getHeight()/pixelsParMetre;
			premiereFois = false;
		}


		//cree et dessine les briques 

		for (Brique brique : muret) {
			brique.setPixelsParMetre(pixelsParMetre);
			brique.dessiner(g2d);
		}

		g2d.setColor(Color.black);
		g2d.drawString("Ce composant mesure " + String.format("%.2f", largeurDuComposantEnMetres) + 
				" m par " + String.format("%.2f", hauteurDuComposantEnMetres) + 
				" m ",  10,  getHeight()-10);

	}//fin paintComponent
}
}

Image :

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
28 déc. 2022 à 13:01

Bonjour,

Ton code est incomplet, il y a un certain nombre de classes/interfaces non standards que tu utilises et que tu ne nous donnes pas, du coup il est impossible de tester ton code pour essayer de déboguer.

Il manque : Dessinable, Selectionnable, Vecteur2D, MoteurPhysique et quelques méthodes de Brique

Je te conseillerais d'essayer d'être le plus standard possible et d'utiliser un maximum les classes fournies par Java, par exemple ta classe Vecteur2D pourrait sûrement être remplacée par la classe java.awt.geom.Point2D


0
Lumberjack33 Messages postés 8 Date d'inscription samedi 31 décembre 2022 Statut Membre Dernière intervention 31 décembre 2022
31 déc. 2022 à 12:16

à tester , mais ton code n'est pas complet :

Voici comment je suggère de modifier le code afin que la brique ait une largeur de 1 mètre et que cela occupe environ 1/5 de la largeur du composant, et afin que la brique soit un carré de 45 centimètres de côté :

public class Brique implements Dessinable, Selectionnable {
    private double masseEnKg = 1;
    private Rectangle2D.Double carreMuret;
    private Shape carreT;
    private Color couleur;
    private double largeur = 0.45; // Modifié pour être en mètres plutôt qu'en centimètres
    private double hauteur = 0.45; // Modifié pour être en mètres plutôt qu'en centimètres
    private Vecteur2D position;  
    private Vecteur2D vitesse = new Vecteur2D(0,0); //par defaut
    private Vecteur2D accel = new Vecteur2D(0,0); //par defaut
    private double pixelsParMetre=20; // Modifié pour que chaque mètre occupe 20 pixels

    private Vecteur2D gravF = MoteurPhysique.calculForceGrav(masseEnKg);

    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    public Brique(Vecteur2D position, double largeur, double hauteur, Color couleur) {
        this.position = new Vecteur2D(position);
        this.largeur = largeur;
        this.hauteur = hauteur;
        this.couleur = couleur;
        creerLaGeometrie();
    }

    private void creerLaGeometrie() {
        carreMuret = new Rectangle2D.Double(position.x, position.y, largeur, hauteur);

        this.pcs.firePropertyChange("position", "?", this.position);
        this.pcs.firePropertyChange("acceleration", -1, this.accel);
        this.pcs.firePropertyChange("vitesse", -1, this.vitesse);
        this.pcs.firePropertyChange("forceGrav", -1, this.gravF);
    }

    @Override
    public void dessiner(Graphics2D g2d) {
        Graphics2D g2dCopie = (Graphics2D) g2d.create();

        AffineTransform mat = new AffineTransform();
        mat.scale(pixelsParMetre, pixelsParMetre);
        carreT = mat.createTransformedShape(carreMuret);
        g2dCopie.setColor(this.couleur);
        g2dCopie.fill(carreT);
        g2dCopie.setColor(Color.BLACK);
        g2dCopie.draw(        carreT);
    }
}

//creation du Muret a partir de briques
public class Muret extends Brique {
    public Muret(Vecteur2D position, double largeur, double hauteur, Color couleur) {
        super(position, largeur, hauteur, couleur);
    }

    private List<Brique> briques;

    public void setBriques(List<Brique> briques) {
        this.briques = briques;
    }
}

public class ZoneAnimationPhysique extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;

    private double largeurDuComposant = 500;
    private double hauteurDuComposant = 500;
    private MoteurPhysique moteur;
    private List<Dessinable> dessinables;
    private JSpinner spinnerLargMuret;
    private JSpinner spinnerHautMuret;
    private JSpinner spinnerNbBriques;
    private JSpinner spinnerMasseMuret;
    private JButton btnLancer;

    public ZoneAnimationPhysique() {
        setPreferredSize(new Dimension((int) largeurDuComposant, (int) hauteurDuComposant));
        moteur = new MoteurPhysique(new Vecteur2D(0, -9.81));
        moteur.setDessinables(dessinables);
        setLayout(new BorderLayout());
        JPanel panneauControles = new JPanel();
        panneauControles.setLayout(new GridLayout(2, 4));
        panneauControles.add(new JLabel("Largeur du Muret en m"));
        SpinnerModel modelLargMuret = new SpinnerNumberModel(0.45, 0.1, 5.0, 0.1); // Modifié pour être en mètres plutôt qu'en centimètres
        spinnerLargMuret = new JSpinner(modelLargMuret);
        panneauControles.add(spinnerLargMuret);
        panneauControles.add(new JLabel("Hauteur du Muret en m"));
        SpinnerModel modelHautMuret = new SpinnerNumberModel(0.45, 0.1, 5.0, 0.1); // Modifié pour être en mètres plutôt qu'en centimètres
        spinnerHautMuret = new JSpinner(modelHautMuret);
        panneauControles.add(spinnerHautMuret);
        panneauControles.add(new JLabel("Nombre de briques"));
        SpinnerModel modelNbBriques = new SpinnerNumberModel(3, 1, 50, 1);
        spinnerNbBriques = new JSpinner(modelNbBriques);
                panneauControles.add(spinnerNbBriques);
        panneauControles.add(new JLabel("Masse du Muret en kg"));
        SpinnerModel modelMasseMuret = new SpinnerNumberModel(1, 1, 50, 1);
        spinnerMasseMuret = new JSpinner(modelMasseMuret);
        panneauControles.add(spinnerMasseMuret);
        add(panneauControles, BorderLayout.NORTH);
        btnLancer = new JButton("Lancer");
        add(btnLancer, BorderLayout.SOUTH);
        btnLancer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                lancer();
            }
        });
    }

    private void lancer() {
        double largMuret = (double) spinnerLargMuret.getValue();
        double hautMuret = (double) spinnerHautMuret.getValue();
        int nbBriques = (int) spinnerNbBriques.getValue();
        double masseMuret = (double) spinnerMasseMuret.getValue();
        Muret muret = new Muret(new Vecteur2D(0.5, 0.9), largMuret, hautMuret, Color.RED);
        muret.setMasse(masseMuret);
        List<Brique> briques = muret.creerBriques(nbBriques);
        muret.setBriques(briques);
        dessinables.add(muret);
        for (Brique brique : briques) {
            dessinables.add(brique);
        }
        moteur.setDessinables(dessinables);
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        for (Dessinable dessinable : dessinables) {
            dessinable.dessiner(g2d);
        }
    }

    @Override
    public void run() {
        while (true) {
            moteur.calculerDeplacementsEtCollisions(0.1);
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

0