Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Seite 5 von 7   « Erste     345 67      

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