Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zusammenstoß von Kugeln (https://www.delphipraxis.net/24921-zusammenstoss-von-kugeln.html)

xineohp 30. Jun 2004 19:56

Re: Zusammenstoß von Kugeln
 
Zitat:

Zitat von braingrenade
Delphi-Quellcode:
      vbuf := subvectors(chspr[i].v,chspr[i2].v) ;

       alpha := arccos(dotproduct(chspr[i].v,vbuf)/((magnitude(chspr[i].v)*magnitude(vbuf))));
       lengthv := cos(alpha)*magnitude(chspr[i].v);
       v1 := scalevector(normalize(vbuf),lengthv);

        // ich glaube du musst an dieser Stelle vbuf neu berechnen ... du musst ja meinen VektorA für zwei verschiedene Kugeln berechnen! mit anderen Worten es gibt zwei verschiedene Vektoren A

       alpha := arccos(dotproduct(chspr[i2].v,vbuf)/((magnitude(chspr[i2].v)*magnitude(vbuf))));
       lengthv := cos(alpha)*magnitude(chspr[i2].v);
       v2 := scalevector(normalize(vbuf),lengthv);

       vbuf := addvectors(v1,v2); // vbuf ist am Ende immer (0,0), v1 und v2 sind "Gegenvektoren"

       chspr[i].v := subvectors(chspr[i].v,vbuf);
       chspr[i2].v := addvectors(chspr[i2].v,vbuf);

EDIT: genau das ist der Fehler, du musst bei meinem Kommentar vbuf := -vbuf einsetzen, da das ganze ja für den zweiten Punkt "von der anderen Seite" betrachtet werden muss.

EDIT2: im Übrigen würde ich vbuf umbenennen ... aber das ist wohl eher marginal :mrgreen:

braingrenade 30. Jun 2004 20:04

Re: Zusammenstoß von Kugeln
 
hmm.. wenn ich's so mache ist vbuf am ende trotzdem (0,0)
Delphi-Quellcode:
      vbuf := subvectors(chspr[i].v,chspr[i2].v) ;

       alpha := arccos(dotproduct(chspr[i].v,vbuf)/((magnitude(chspr[i].v)*magnitude(vbuf))));
       lengthv := cos(alpha)*magnitude(chspr[i].v);
       v1 := scalevector(normalize(vbuf),lengthv);

       vbuf := subvectors(chspr[i2].v,chspr[i].v) ; // neu
       alpha := arccos(dotproduct(chspr[i2].v,vbuf)/((magnitude(chspr[i2].v)*magnitude(vbuf))));
       lengthv := cos(alpha)*magnitude(chspr[i2].v);
       v2 := scalevector(normalize(vbuf),lengthv);

       vbuf := addvectors(v1,v2);

       chspr[i].v := subvectors(chspr[i].v,vbuf);
       chspr[i2].v := addvectors(chspr[i2].v,vbuf);

xineohp 30. Jun 2004 20:11

Re: Zusammenstoß von Kugeln
 
hm, welche Geschwindigkeit haben denn die Kugeln und an welcher Stelle befinden sie sich?
Die Berechnung geht von den Kugelmittelpunkten aus ... die dürfen folglich nicht identisch sein, da ja sonst VektorD (= der Abstand) gleich 0 ist, womit die ganze Rechnung zusammenbricht!

EDIT: die Umsetzung meiner Rechnung in Code scheint übrigens zu stimmen. Ich wette du arbeitest bei deiner Kollisionsabfrage nur mit den Kugelmittelpunkten, nicht mit den Radien ... womit der Abstand der Kugelzentren bei einer Kollision immer 0 wäre ...

braingrenade 30. Jun 2004 20:18

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es sind halt ziemlich viele Kugeln , aber normalerweise Überschneiden sich die Mittelpunkte nicht.

Ich hab das Programm einfach mal angehängt.

EDIT : das Problem steckt in der Unit chaos.
EDIT2 : Meine Kollision basiert auf Bitmasken.

xineohp 30. Jun 2004 20:43

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab da so einen Verdacht worans liegt ... siehe Bild.
Ich schätze mal, da war meine Zeichnung einwenig un-eindeutig, sorry.

xineohp 30. Jun 2004 20:57

Re: Zusammenstoß von Kugeln
 
mit folgenden Änderungen funktionierts:

Delphi-Quellcode:
//statt
//vbuf := subvectors(chspr[i].v,chspr[i2].v) ;
vbuf := subvectors( makeVector(chspr[i].x,chspr[i].y), makeVector(chspr[i2].x,chspr[i2].y) ) ;

//und statt
//vbuf := subvectors(chspr[i2].v,chspr[i].v) ;
vbuf := subvectors( makeVector(chspr[i2].x,chspr[i2].y), makeVector(chspr[i].x,chspr[i].y) ) ;
einziges Problem: es wird nur ungefähr jede zehnte Kollision erkannt ...

braingrenade 30. Jun 2004 21:16

Re: Zusammenstoß von Kugeln
 
Ah ja danke !

Das komische daran ist aber das er jede Kollision erkennt, bei machen aber nix passiert :shock:

xineohp 30. Jun 2004 21:21

Re: Zusammenstoß von Kugeln
 
genau ...

kann man die Kugeln irgendwie größer machen?

braingrenade 30. Jun 2004 21:24

Re: Zusammenstoß von Kugeln
 
Du kannst einfach die x.bmp durch ein Bild deiner Whal ersetzen, probier ich gerade , aber ändert sich auch nix. Wenn du ein Größeres Bild nimmst dann setz am besten in Unit1 die Zahl der Objekte kleiner.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
xplus := 0;
yplus := 0;
path := extractfilepath(application.exename);
x := Tchaos.create(form1.Handle,path+'x.bmp',10); //hier die zahl der Objekte einstellen in diesem Fall 10
end;

xineohp 30. Jun 2004 21:39

Re: Zusammenstoß von Kugeln
 
ich glaube irgendwas ist an der Physik falsch ... die Dinger werden ja immer schneller (wenn sie sich dann mal treffen)?! das kann doch eigentlich irgentwie nicht sein, oder?

braingrenade 30. Jun 2004 21:46

Re: Zusammenstoß von Kugeln
 
Jo, eigentlich sollte die Geschwindigkeit im ganzen immer gleich sein. :wall:
Naja ich kuck mir das Morgen nochmal na, jetzt ist erstmal Zeit für ne Mütze Schlaf *gähn*

braingrenade 1. Jul 2004 20:11

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, nun hab ich nach langem rumprobieren eine Version bei der wenigsten ab und zu mal die Kollision richtig funzt, oft is die aber falsch oder die Kugeln verkanten sich :(

Hab's mal angehängt.

xineohp 1. Jul 2004 21:03

Re: Zusammenstoß von Kugeln
 
ich hab ne Idee vorans liegen könnte ... ich werde das morgen nochmal durchrechnen und umsetzen.

Skiron 1. Jul 2004 21:06

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin kein Physikgenie, aber könnt das nicht auch so gehen?

Man zieht eine Senkrechte der Linie von M1 nach M2 durch den Punkt des Zusammenstoßes.
Dann kann man das so berechnen, als ob der Ball von der Linie abprallen würde, welche zusätzlich noch eine Kraft auf ihn richtet!! würde das nicht so gehen?

ws hab ich grad nur Sch**** geschrieben, aber vielleicht könnts ja ein anderer Andsatz für einen anderen Lösungsweg sein!

Hab mal als Anhang eine kleine Skizze reingeschmissen, damit mans leichter versteht, was ich meine!

xineohp 2. Jul 2004 18:50

Re: Zusammenstoß von Kugeln
 
moin,

im Prinzip ist das genau das was ich berechnet habe ... Du Zerlegst den Gechwindigkeitsvektor/Kraft der Kugeln in einen der genau auf die andere Kugel gerichtet ist und einen senkrecht zu dieser Linie. Dann Berechnest du die Summe der Kräfte die beim Zusammenstoß auf treten und verteilst sie (in gleichen Teilen) wieder an die Kugeln und addierst den zweiten Teil des Geschwindigkeitsvektors wieder hinzu.

ibp 2. Jul 2004 19:08

Re: Zusammenstoß von Kugeln
 
hi, wenn zwei kugeln gegenläufug aufeinander stossen, scheint alles ok zu sein, nur wenn sie aus einer gleichen richtung kommen, laufen beide in eine richtung weiter, das scheint als ob es ein winkel oder vektoren-"additions" problem ist

xineohp 2. Jul 2004 20:07

Re: Zusammenstoß von Kugeln
 
jup,

der Fehler ist, das zum einen der neu errechnete Vektor falsch ist (die Vektoren v1 und v2 müssen subtrahiert nicht addiert werden, da sie gegenläufig sind) Die Summe von v1 und v2 muss durch zwei dividiert werden (da die Massen gleich sind) und zu dem senkrecht stehenden Vektor (in meinen Zeichnungen b) addiert werden (nicht zu v).

ibp 2. Jul 2004 21:44

Re: Zusammenstoß von Kugeln
 
.. du solltest zwischen global- und lokal- systemen unterscheiden und entsprechend transformieren, damit ersparst du dir viel arbeit....

xineohp 3. Jul 2004 13:10

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 2)
@ibp: ich weiß zwar nicht, was du genau meinst aber ich hab das jetzt folgendermaßen gelö?t:

Die schiefe Kollision wird auf die zwischen den Kugeln wirkenden Kräfte reduziert und diese dann nach den Formeln für den geraden Stoß gelöst.

@braingrenade: binds mal ein und probiers aus. Ich hatte noch keine Zeit dazu.

braingrenade 3. Jul 2004 15:14

Re: Zusammenstoß von Kugeln
 
:shock: Hossa !
Danke für die Mühe !

Hab nur noch eine Frage : Was muss ich für m1 und m2 einsetzen ?

braingrenade 3. Jul 2004 21:13

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
So , hab nun ne ganze weile rumprobiert und festgestellt das wenn m1 und m2 (ich denke das sind die Massen der Kugeln oder ?) gleich sind dann geht die Kollision nicht. Nimmt man zwei unterschiedliche Werte dann geht sie, aber die Kugeln beschleunigen immer mehr, und wenn sie aus der gleichen Richtung kommen gibt's auch keine Kollision. Ist der Unterschied zwischen m1 und m2 zu klein z.b. bei 1 und 1.01 dann geht die Kollision gar nicht, desto größer der Unterschied desto schneller beschleunigen die Kugeln.

Ich hab mal die neue Version Angehängt (hab deine Units eingebunden und Gravitation und wirken einer Kraft eingebaut)

@ibg : Das versteh ich jetzt auch nicht ...

xineohp 3. Jul 2004 21:40

Re: Zusammenstoß von Kugeln
 
hm, also mir ist aufgefallen, dass die Kugeln öfter mal "umeinender kreisen", dass also nicht nur eine Kollision stattfindet sondern mehrere. Ich schätze mal, dass das daran liegt, dass die Abstandberechnung nicht mathematisch ist sondern auf Bitmaps beruht... Ich werde noch mal ein eigenes Testprogramm dafür schreiben.

EDIT: Besonders in Kombination mit einem in meiner Berechnungen enhaltenen Fehler kommt es hier zu gravierenden Fehlern! bei der 1. Kollision zweier Kugeln ist alles korrekt, wenn aber jetzt eine zweite Berechnung (auf Grund der Bitmap-Berechnungen) wird die Kollision mit den Vektoren aus der ersten Berechnung wiederholt. Diese sind nun aber in ihrer Richtung umgekehrt, was mein Algo aber nicht überprüft... ich arbeite dran.

ibp 4. Jul 2004 11:28

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
... also das war gemeint, lokale systeme sind die objekte und globales system ist das feld. mittels transformation der systeme hast du dann immer automatisch die richtigen Vorzeichen!
gruß rené

braingrenade 4. Jul 2004 18:55

Re: Zusammenstoß von Kugeln
 
Ich muss die Sache erstmal auf Eis legen da ich eine Woche lang weg bin, also nicht wundern wenn ich nix schreib.

xineohp 4. Jul 2004 19:07

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab mal ein eigenes Testprog geschrieben und die Berechnungen korrigiert ... bei zwei Kugel funz das alles ohne Probleme, aber bei dreien treten Fehler auf:

1. Wenn drei Kugeln gleichzeitig aufeinandertreffen entsteht ein Fehler, da die Kollisionen "nacheinander" berechnet werden (ich hab bislang keine Idee wie man das ändern könnte)
2. Bei mehr als 2 Kugeln werden die Dinger immernoch immer schneller?! (weiß der Teufel warum!)


PS: der Code ist noch unaufgeräumt und nicht gegen unsachgemäße Anwendung geschützt :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz