# Elastischer Stoß



## subsauber (20. Dez 2011)

Hallo ihr Lieben!
Wir sollen jetzt in der Schule eine Kugelsimulation gestalten und ich bin fast fertig.
Mir fehlt nur noch ein Elastischer Stoß, aber ich weiß nicht wie ich sowas konstruieren soll..  


Ich habe schon in anderen Foren geguckt und bin total aufgeschmissen...
Wäre echt nett, wenn ihr mir helfen könntet.

Hier mein Quellcode:

Hauptprogramm

```
import sum.kern.*;


public class Hauptprogramm {

	
	public static void main(String[] args) {
	    
	  
		
		
		Bildschirm meinBildschirm;
		Tastatur meineTastatur;
		Kugel meineKugel1;
		Kugel meineKugel2;
		Kugel meineKugel3;
		Kugel meineKugel4;
		Kugel meineKugel5;
		Kugel meineKugel6;
		Kugel meineKugel7;
		Kugel meineKugel8;
		Kugel meineKugel9;
		Kugel meineKugel10;
		Kugel meineKugel11;
		Kugel meineKugel12;
		Kugel meineKugel13;
		Kugel meineKugel14;
		Kugel meineKugel15;
		Kugel meineKugel16;
		Kugel meineKugel17;
		Kugel meineKugel18;
		Kugel meineKugel19;
		Kugel meineKugel20;
		Kugel meineKugel21;
		Kugel meineKugel22;
		Kugel meineKugel23;
		Kugel meineKugel24;
		Kugel meineKugel25;
		Kugel meineKugel26;
		Kugel meineKugel27;
		Kugel meineKugel28;
		Kugel meineKugel29;
		Kugel meineKugel30;

		
		
		int ballRadius = 5;
		double ballGeschwindigkeit = 5.0;
		
		
		meinBildschirm = new Bildschirm();
		meineTastatur = new Tastatur();
		meineKugel1 = new Kugel(50,  50,ballGeschwindigkeit,-30,ballRadius,Farbe.ROT);
		meineKugel2 = new Kugel(100,  50,ballGeschwindigkeit,-29,ballRadius,Farbe.GRUEN);
		meineKugel3 = new Kugel(150,  50,ballGeschwindigkeit,-28,ballRadius,Farbe.BLAU);
		meineKugel4 = new Kugel(200,  50,ballGeschwindigkeit,-27,ballRadius,Farbe.GELB);
		meineKugel5 = new Kugel(250,  50,ballGeschwindigkeit,-26,ballRadius,Farbe.GRUEN);
		meineKugel6 = new Kugel(300,  50,ballGeschwindigkeit,-25,ballRadius,Farbe.BLAU);
		meineKugel7 = new Kugel(50,  100,ballGeschwindigkeit,-24,ballRadius,Farbe.GELB);
		meineKugel8 = new Kugel(50,  150,ballGeschwindigkeit,-23,ballRadius,Farbe.BLAU);
		meineKugel9 = new Kugel(50,  200,ballGeschwindigkeit,-22,ballRadius,Farbe.GRAU);
		meineKugel10 = new Kugel(50,  250,ballGeschwindigkeit,-21,ballRadius,Farbe.SCHWARZ);
		meineKugel11 = new Kugel(50,  300,ballGeschwindigkeit,-20,ballRadius,Farbe.PINK);
		meineKugel12 = new Kugel(75,  50,ballGeschwindigkeit,-31,ballRadius,Farbe.GELB);
		meineKugel13 = new Kugel(125,  50,ballGeschwindigkeit,-32,ballRadius,Farbe.ROT);
		meineKugel14 = new Kugel(175,  50,ballGeschwindigkeit,-33,ballRadius,Farbe.GRUEN);
		meineKugel15 = new Kugel(50,  75,ballGeschwindigkeit,-34,ballRadius,Farbe.GELB);
		meineKugel16 = new Kugel(50,  85,ballGeschwindigkeit,-35,ballRadius,Farbe.SCHWARZ);
		meineKugel17 = new Kugel(88,  50,ballGeschwindigkeit,-36,ballRadius,Farbe.BLAU);
		meineKugel18 = new Kugel(77,  50,ballGeschwindigkeit,-37,ballRadius,Farbe.ROT);
		meineKugel19 = new Kugel(66,  50,ballGeschwindigkeit,-38,ballRadius,Farbe.GRUEN);
		meineKugel20 = new Kugel(55,  50,ballGeschwindigkeit,-39,ballRadius,Farbe.PINK);
		meineKugel21 = new Kugel(44,  50,ballGeschwindigkeit,-40,ballRadius,Farbe.GRAU);
		meineKugel22 = new Kugel(33,  50,ballGeschwindigkeit,-41,ballRadius,Farbe.GELB);
		meineKugel23 = new Kugel(50,  50,ballGeschwindigkeit,-42,ballRadius,Farbe.BLAU);
		meineKugel24 = new Kugel(50,  50,ballGeschwindigkeit,-43,ballRadius,Farbe.PINK);
		meineKugel25 = new Kugel(99,  50,ballGeschwindigkeit,-45,ballRadius,Farbe.GRAU);
		meineKugel26 = new Kugel(156,  50,ballGeschwindigkeit,-48,ballRadius,Farbe.BLAU);
		meineKugel27 = new Kugel(123,  50,ballGeschwindigkeit,-49,ballRadius,Farbe.GRAU);
		meineKugel28 = new Kugel(233,  50,ballGeschwindigkeit,-50,ballRadius,Farbe.ROT);
		meineKugel29 = new Kugel(33,  50,ballGeschwindigkeit,-53,ballRadius,Farbe.GRAU);
		meineKugel30 = new Kugel(233,  50,ballGeschwindigkeit,-17,ballRadius,Farbe.ROT);
				
				
		meineKugel1.merke(meinBildschirm);
		meineKugel2.merke(meinBildschirm);
		meineKugel3.merke(meinBildschirm);
		meineKugel4.merke(meinBildschirm);
		meineKugel5.merke(meinBildschirm);
		meineKugel6.merke(meinBildschirm);
		meineKugel7.merke(meinBildschirm);
		meineKugel8.merke(meinBildschirm);
		meineKugel9.merke(meinBildschirm);
		meineKugel10.merke(meinBildschirm);
		meineKugel11.merke(meinBildschirm);
		meineKugel12.merke(meinBildschirm);
		meineKugel13.merke(meinBildschirm);
		meineKugel14.merke(meinBildschirm);
		meineKugel15.merke(meinBildschirm);
		meineKugel16.merke(meinBildschirm);
		meineKugel17.merke(meinBildschirm);
		meineKugel18.merke(meinBildschirm);
		meineKugel19.merke(meinBildschirm);
		meineKugel20.merke(meinBildschirm);
		meineKugel21.merke(meinBildschirm);
		meineKugel22.merke(meinBildschirm);
		meineKugel23.merke(meinBildschirm);
		meineKugel24.merke(meinBildschirm);
		meineKugel25.merke(meinBildschirm);
		meineKugel26.merke(meinBildschirm);
		meineKugel27.merke(meinBildschirm);
		meineKugel28.merke(meinBildschirm);
		meineKugel29.merke(meinBildschirm);
		meineKugel30.merke(meinBildschirm);

		
	
		while (true) {			
			meineKugel1.bewege();
			meineKugel2.bewege();
			meineKugel3.bewege();
			meineKugel4.bewege();
			meineKugel5.bewege();
			meineKugel6.bewege();
			meineKugel7.bewege();
			meineKugel8.bewege();
			meineKugel9.bewege();
			meineKugel10.bewege();
			meineKugel11.bewege();
			meineKugel12.bewege();
			meineKugel13.bewege();
			meineKugel14.bewege();
			meineKugel15.bewege();
			meineKugel16.bewege();
			meineKugel17.bewege();
			meineKugel18.bewege();
			meineKugel19.bewege();
			meineKugel20.bewege();
			meineKugel21.bewege();
			meineKugel22.bewege();
			meineKugel23.bewege();
			meineKugel24.bewege();
			meineKugel25.bewege();
			meineKugel26.bewege();
			meineKugel27.bewege();
			meineKugel28.bewege();
			meineKugel29.bewege();
			meineKugel30.bewege();
			
			
			
		
			
			
			if ((meineTastatur.wurdeGedrueckt()) &&
				(meineTastatur.zeichen()=='e')) {
				break;
			}
		}
		
	
		meineKugel1.gibFrei();
		meineKugel2.gibFrei();
		meineKugel3.gibFrei();
		meineKugel4.gibFrei();
		meineKugel5.gibFrei();
		meineKugel6.gibFrei();
		meineKugel7.gibFrei();
		meineKugel8.gibFrei();
		meineKugel9.gibFrei();
		meineKugel10.gibFrei();
		meineKugel11.gibFrei();
		meineKugel12.gibFrei();
		meineKugel13.gibFrei();
		meineKugel14.gibFrei();
		meineKugel15.gibFrei();
		meineKugel16.gibFrei();
		meineKugel17.gibFrei();
		meineKugel18.gibFrei();
		meineKugel19.gibFrei();
		meineKugel20.gibFrei();
		meineKugel21.gibFrei();
		meineKugel22.gibFrei();
		meineKugel23.gibFrei();
		meineKugel24.gibFrei();
		meineKugel25.gibFrei();
		meineKugel26.gibFrei();
		meineKugel27.gibFrei();
		meineKugel28.gibFrei();
		meineKugel29.gibFrei();
		meineKugel30.gibFrei();
		meineTastatur.gibFrei();
		meinBildschirm.gibFrei();
	
	}

}
```

Kugel:

```
import sum.kern.*;

public class Kugel {
	
	
	 
	private Buntstift hatStift;
	private Bildschirm kenntBildschirm;
	
	
	private int zRadius;
	public double zGeschwindigkeit;
	private int zRichtung;
	

	public Kugel(double pAnfangH,  double pAnfangV,  double pGeschwindigkeit,  int pRichtung, int pRadius, int pFarbe) {

	
		hatStift = new Buntstift ();
		hatStift.bewegeBis (pAnfangH,pAnfangV);
		hatStift.setzeFarbe(pFarbe);
		hatStift.setzeFuellMuster(Muster.GEFUELLT);
	
		
		
	
		this.setzeGeschwindigkeit(pGeschwindigkeit);
		this.setzeRichtung(pRichtung);
		this.setzeRadius(pRadius);	
    }
	
	
    
    public void merke(Bildschirm pBildschirm) {
    	kenntBildschirm = pBildschirm;
    }

    
	public void zeichne() {
		hatStift.zeichneKreis(zRadius);
	}
	
	
   
    public void loesche() {
		hatStift.radiere();
		this.zeichne();
		hatStift.normal();
	}
	
    
	public void bewege () {
		
		
		this.loesche();
		hatStift.bewegeUm(zGeschwindigkeit);
		this.zeichne ();
		
	
		if (this.rechterRand() >= kenntBildschirm.breite()){
			this.setzeRichtung(180 - this.richtung());
		}
		
    	if (this.linkerRand() <= 0){
			this.setzeRichtung(180 - this.richtung()); 
		 }
    	
        if (this.obererRand() <= 0){
			this.setzeRichtung(360 - this.richtung()); 
 	    }
        
		if (this.untererRand() >= kenntBildschirm.hoehe()){
			this.setzeRichtung(360 - this.richtung());
		}	 
		
	}
	
	

	public void setzeRadius (int pRadius) {
		zRadius = pRadius;
	} 
	
	
	public void setzeGeschwindigkeit(double pGeschwindigkeit) {
		zGeschwindigkeit = pGeschwindigkeit;
	}	
	
	
    
    public void setzeRichtung (int pwinkel) {
    	zRichtung = pwinkel;
    	hatStift.dreheBis(pwinkel);
    }

    
	
    public int richtung() {
    	return zRichtung ;
    }
    
    
	
	public double linkerRand() {
		return hatStift.hPosition() - zRadius;
    }
	
	

	public double rechterRand() {
		return hatStift.hPosition() + zRadius;
    }
	
	

	public double obererRand() {
		return hatStift.vPosition() - zRadius;
    }
	

	public double untererRand() {
		return hatStift.vPosition() + zRadius;
    }
    
    
    
    


	public void gibFrei () {
		hatStift.gibFrei ();
	} 
	
}
```

Ich muss dazu sagen, dass wir nicht mit reinem Java programmieren. Wir bedienen uns stark an der Stifte und Mäuse Biblithek (kurz: SUM), die extra für junge Programmierer entwickelt wurde.


----------



## Marco13 (20. Dez 2011)

Mal verneweg: Du solltest die Kugeln in einem Array speichern. Wie soll man sonst paarweise jede Kugel mit jeder auf Kollisionen prüfen?
Die Kollision an sich kann (im Vergleich zu dem, was schon da ist) etwas fummelig werden. Sowas wie Snooker Balls kann ein Einstieg und ein Schritt auf dem Weg zu konkreteren Fragen sein...


----------



## stes (20. Dez 2011)

Hi, ich hab ebenfalls Informatik und die Ehre, mit dem SuM-Paket arbeiten zu dürfen  

Wir haben das Billardprojekt damals etwas weiter ausgebaut, auch mit Elastischem Stoß. Ich habe auch stundenlang im Internet gesucht, immer kleine Ansätze gefunden aber nirgendswo was Handfestes.. Ich hab mich dann auf Grundlage dieser Abbildung drangemacht und die nötigen Sachen hergeleitet, ist nicht so übermäßig schwierig 
Meine Ergebnisse sind bei Wikipedia einzusehen, wahrscheinlich mittlerweile teilweise schon überarbeitet 

Gruß
stes


----------



## Kr0e (24. Dez 2011)

Ich hatte damals für meine Facharbeit was ähnliches programmiert. Mit Drehung der Kugeln, was ziemlcih komplex war im Vergleich zum simplen Impuls.

Beim Impuls ist zusammengefasst der Trick, dass man einfach die Geschwinigkeitsvektoren zerlegt. Sprich einmal in die Komponente die parallel zur Distanz verläuft und in den Rest. Beim elastischen Stoss werden nun einfach die parallel-Komponenten der Bälle/Kugeln ausgetauscht. Der Rest bleibt unangerührt. Im Prinzip Physik Klasse 10... Bei der Drehung wurds dann damals um einiges komplexer, da man beachten muss, dass z.b. beim unelastischen Stoß/verformenden Stoß die Drehung länger einwirken kann und der Reibungsfaktor ist acuh noch zu beachten.


----------

