Seite 1 von 1

Elastischen Stoß in PB umsetzen

Verfasst: 05.07.2009 17:56
von Ruskie
Servus,

Ich möchte einen elastischen Stoß zwischen 3 oder mehr kugelförmigen Objekten gleicher Masse in PB umsetzen. Das ganze ist in etwa so aufgebaut:
http://img12.imageshack.us/img12/6389/stoss.jpg
Körper A erhält einen Impuls und stößt an die ruhenden Körper B und C.
Den physikalischen Ablauf hab ich in eine Prozedur gepackt, die in Abhängigkeit vom Winkel zwischen den Körpern die X- und Y-Komponente des Impulses umrechnet und von einer Kugel auf die andere überträgt.

Nun zu meinem Problem:
Da ich alle Kugeln in einer Schleife einzeln abarbeite erhält diejenige, für die ich zuerst diese Prozedur aufrufe auch den höheren Impuls. Ich möchte allerdings, dass die Übertragung gleichzeitig abläuft und B und C somit auch den selben Impuls erhalten.
Kann mir einer hier ein wenig auf die Sprünge helfen wie ich das in einem Programm realisieren kann?

Vielen Dank im Voraus,
Ruskie

Verfasst: 05.07.2009 18:02
von Andesdaf
zum gleichzeitigen Ausführen von Prozeduren: Threads benutzen.

Kannst dich ja mal informieren.

Verfasst: 05.07.2009 18:12
von Kaeru Gaman
ähm NEIN keine threads für sowas.

... außer du willst eine richtige OOP umgebung schaffen für zig objekte die physikalisch aufeinander reagieren,
dann darfst du allerdings auch riesenarbeit in die synchronisation stecken.


dein problem dürfte sein, dass du Werte die den Objekten zugeordnet sind direkt veränderst.

schaffe dir Wertebuffer für die Objekte.

sagen wir mal, du hast eine Größe in deinem Objekt für Speed.
also so in etwa:

Code: Alles auswählen

Structure Kugel
  PosX.d
  PosY.d
  Speed.d
EndStructure
wenn du jetzt bei mehreren Objekten in Abhängigkeit voneinander die Speed verändern wolltest,
hättest du ja das Problem, dass du beim ersten Objekt die Speed schon geändert hast,
und wenn du dann fürs zweite Objekt darauf Bezug nimmst, würdest du schon mit dem neuen Speed rechnen.

also verändere deine Struct folgendermaßen:

Code: Alles auswählen

Structure Kugel
  PosX.d
  PosY.d
  Speed.d
  SpeedNew.d
EndStructure
wenn du jetzt die neue Speed ausrechnest, schreibst du die nicht zurück in Speed, sondern schreibst sie in SpeedNew.
für alle anderen Objekte steht dir jetzt noch die alte Speed in der Zelle Speed zur Verfügung.
erst wenn du alle Objekte durchgegangen bist, überträgst du die Werte,
d.h. du gehst dann nochmal alle Objekte durch, und dabei führst du nur jeweils \Speed = \SpeedNew aus.

das macht man ganz allgemein so für mehrere Objekte die einander beeinflussen,
auch für Conway's würde man mit dieser Art doppeltem Buffer arbeiten.

Verfasst: 05.07.2009 19:29
von Ruskie
Danke Kaeru, das ist genau das was ich gebraucht hab :allright:
Das Prinzip hab ich sogar schon irgendwo in einem anderen Teil meines Programms verwendet; war wohl zu verpeilt um zu bemerken, dass ich es hier genauso benutzen kann ^^