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:
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 Collisione(gestisce la collisione tra due carrelli definendo la nuova velocità):
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 Azione(Classe che chiama il metodo update() del pannello contenente repaint()):
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 Pannello:
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 MainFrame(è il frame):
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;
	}

}
Classe Esperiment(contiene il main):
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();
	}
}
Questo è tutto.
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.