setViewport(new QGLWidget) für QGraphicsView funktioniert gut, aber Antialiasing funktioniert hier nicht mehr? Die üblichen Methoden haben überhaupt keinen Effekt und bei der GL-spezifischen Option "HighQualityAntialiasing" wird nur der weiße Untergrund angezeigt.
kater hat geschrieben:Wenn du es fertig hast, zeig mal. Das klingt interesannt.
Wenn du zwischen den "Atom" Kugeln noch größere schwerere Kugeln plazierst und die sich mit bewegen wäre das genial

Das meiste des Programms hab ich fast eins zu eins von einem alten Python-Programm von mir übernommen, dass ich geschrieben habe als ich grade zu programmieren angefangen habe. Und ich fürchte, ich komm bis zum Ende des Sommers nicht dazu es zu kommentieren und auch nur so weit zu ändern, dass es mir nicht mehr peinlich sein muss
Aber wenn du sowas selbst vor hast: Für die Kugeln gibts eine Klasse die Radius, x-, y-Position, x-,y-Geschwindigkeit und Masse enthält. Dann eine Methode, die einen Bewegungsschritt ausführt, also da wird einfach zur Position die Geschwindigkeit addiert.
Die Kollision wird das eigentlich interessante sein. Die Physik/Mathematik dahinter ist...
Kugeln stoßen, wenn ihr Mittelpunktsabstand <= die Summe ihrer Radien ist.
Sie stossen entlang der Verbindungslinie ihrer Mittelpunkte, die Geschwindigkeitskomponenten normal darauf bleiben erhalten. Bei Stößen mit der Wand wechselt die Normalgeschwindigkeit das Vorzeichen, Tangentialgeschwindigkeit bleibt gleich.
Günstigerweise betrachtet man den Stoß zwischen zwei Kugeln im Schwerpunktssystem, da wechseln die Geschwindigkeiten einfach das Vorzeichen und man muss die Massen nur bei der Berechnung der Schwerpunktsbewegung berücksichtigen.
Also werden einfach ein paar Transformationen gemacht:
* Teilchengeschwindigkeiten relativ zur gemeinsamen Schwerpunktsbewegung
* Davon die Komponenten entlang und normal auf die Verbindungsachse
* Geschwindigkeit normal drauf bleibt gleich, die andere wechselt das Vorzeichen, Schwerpunktsbewegung ist sowieso erhalten
* Rücktransformation ins ursprüngliche Koordinatensystem (x-,y-Achse) und ins ortsfeste System
Ich kann dir ein Schnippsel anbieten, da erkennt man auch ungefähr das Chaos
http://pastebin.com/QzLuxRW3
Das meiste ist nur mühsam und unübersichtlich, aber die Positionskorrektur ist ein ganz übler hack. Allgemein werden sich, wenn eine Kollision erkannt wird, die Grenzflächen einander nicht genau berühren, sondern sich überschneiden. Daraus ergeben sich ganz interessante Probleme, zum Teil bleiben die Kugeln aneinander kleben. Deswegen verschiebe ich vor dem Stoß beide Kugeln um den gleichen Betrag entlang der Verbindungslinie, soweit bis sie sich genau berühren. Das ergibt aber einen Fehler der besonders auffällt, wenn man wie du geschrieben hast ein schweres Teilchen reingibt: Impulsübertrag von leichten Teilchen hat kaum eine Auswirkung, aber durch die Positionskorrektur springt es wild herum.
Deswegen ist das eines der ersten Dinge, die ich, wenn ich mal Zeit habe, ändern muss.
Von n Kugeln jede gegen jede andere zu checken braucht n²/2 Berechnungen pro Schritt. Effektiv wäre die Verwendung eines quadtrees, aber das überfordert mich in C++ im Moment auch völlig.