Ciao a tutti, devo realizzare un'animazione che riproduca un urto elastico tra carrelli.
Il programma fatto è minimale(sono solo dei rettangolini colorati su uno sfondo grigio) e mi rendo conto che in molte parti potevo adottare soluzioni più eleganti, trascurate a causa del breve tempo in cui ho dovuto scriverlo. Il problema è che l'urto non avviene come dovrebbe(i carrelli si comportano in modi stranissimi che cambiano anche in basse alle varie velocità e agli intervalli di tempo, fate andare il programma provando diverse velocità e carrelli per capire che intendo).
Ecco il codice:
Classe Carrello:
Classe Collisione(gestisce la collisione tra due carrelli definendo la nuova velocità):codice:import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class Carrello { private double massa; private int x; private int width; private int height; private double speed; private Color colore; public Carrello(int X0, int aWidth, int aHeight, double aMassa, double aSpeed, Color aColore) { x=X0; width=aWidth; height=aHeight; massa=aMassa; speed=aSpeed; colore=aColore; } public void updateX(int t){ x+=speed*t; } public int getX(){ return x; } public int getWidth(){ return width; } public int getHeight(){ return height; } public double getMassa(){ return massa; } public void drawyourself(Graphics2D g2){ g2.setColor(colore); g2.fillRect(x,500,width,-height); } public void updateSpeed(double newSpeed){ speed=newSpeed; } public double getSpeed(){ return speed; } }
Classe Azione(Classe che chiama il metodo update() del pannello contenente repaint()):codice:public class Collisione { Carrello car1,car2; double newSpeed1,newSpeed2,vi1,vi2,m1,m2; public Collisione(Carrello aCar, Carrello bCar) { car1=aCar; car2=bCar; vi1=car1.getSpeed(); vi2=car2.getSpeed(); m1=car1.getMassa(); m2=car2.getMassa(); } public void collisioneAvvenuta(){ newSpeed1=((m1-m2)*vi1+2*m2*vi2)/(m1+m2); newSpeed2=((m2-m1)*vi2+2*m1*vi1)/(m1+m2); car1.updateSpeed(newSpeed1); car2.updateSpeed(newSpeed2); } }
Classe Pannello:codice:import java.awt.event.*; public class Azione implements ActionListener { Pannello mioPan; public Azione(Pannello panel) { mioPan=panel; } public void actionPerformed(ActionEvent evento){ mioPan.update(); } }
Classe MainFrame(è il frame):codice:import javax.swing.*; import java.awt.*; import javax.swing.Timer; import java.util.*; public class Pannello extends JPanel { ArrayList<Carrello> carri=new ArrayList<Carrello>(); Azione azio; javax.swing.Timer t1; Color mioColore; private final int t=30; public Pannello() { azio=new Azione(this); t1=new javax.swing.Timer(t, azio); } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2=(Graphics2D) g; verificaCollisioni(); for(int i=0;i<carri.size();i++){ carri.get(i).drawyourself(g2); } } public void update(){ for(int i=0;i<carri.size();i++){ carri.get(i).updateX(t); } repaint(); } public void avviaTimer(){ t1.start(); } public void addCarrello(Carrello car){ carri.add(car); } public int getT(){ return t; } public void verificaCollisioni(){ for(int i=0;i<carri.size()-1;i++){ for(int j=i+1;j<carri.size();j++){ if((Math.abs(carri.get(i).getX()-carri.get(j).getX())== carri.get(i).getWidth()) | (Math.abs(carri.get(i).getX()-carri.get(j).getX())==carri.get(j).getX())) { Collisione col=new Collisione(carri.get(i),carri.get(j)); col.collisioneAvvenuta(); } } } } }
Classe Esperiment(contiene il main):codice:import javax.swing.*; import java.awt.*; public class MainFrame extends JFrame{ Pannello myPanel; public MainFrame() { setTitle("Urti elastici"); setSize(1000,1000); setLocation(0,0); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); myPanel=new Pannello(); Container pandent=getContentPane(); pandent.add(myPanel); } public Pannello getPannello(){ return myPanel; } }
Questo è tutto.codice:import java.awt.*; public class Esperiment { public static void main(String[] args) { Carrello car1=new Carrello(100,40,20,15,0.04,Color.RED); Carrello car2=new Carrello(700,60,20,12,-0.02,Color.BLUE); Carrello car3=new Carrello(0,35,10,10,0.02,Color.GREEN); MainFrame mioFrame=new MainFrame(); mioFrame.getPannello().addCarrello(car1); mioFrame.getPannello().addCarrello(car2); mioFrame.getPannello().addCarrello(car3); mioFrame.getPannello().avviaTimer(); } }
P.S Per favore non mandatemi consigli su come rendere migliore il programma, basta che mi diciate dov'è l'errore in questo. Ciao e grazie.

Rispondi quotando