Delphi-PRAXiS
Seite 3 von 7     123 45     Letzte »    

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)

braingrenade 29. Jun 2004 18:47

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
So , nu hab ich mir ne Lösung ausgedacht (siehe anhang) die aber nicht funktionert :(

In code Hab ich das so realisiert :


Delphi-Quellcode:
  var
    i,i2,i3 :integer;
    vbuf,v1,v2 : T2dvector;
    alpha,beta,gamma,lengthv : real;

      ...
 
       vbuf := makevector((chspr[i].x-chspr[i2].x),(chspr[i].y-chspr[i2].y) ) ;
       //chspr ist ein array meiner Chaossprite Klasse, x und y ist die Position des Sprites vom Typ
       //real, v ist der Vektor des Sprites, v.x und v.y sind auch real
       

       alpha := dotproduct(chspr[i].v,vbuf);
       beta := arctan(chspr[i].v.x/chspr[i].v.y);
       gamma := alpha - beta;
       lengthv := cos(alpha)*(sqrt( sqr(chspr[i].x) + sqr(chspr[i].y)));
       v1 := makevector((lengthv*cos(gamma)),(lengthv*sin(gamma)));

       alpha := dotproduct(chspr[i2].v,vbuf);
       beta := arctan(chspr[i2].v.x/chspr[i2].v.y);
       gamma := alpha - beta;
       lengthv := cos(alpha)*(sqrt( sqr(chspr[i2].x) + sqr(chspr[i2].y)));
       v2 := makevector((lengthv*cos(gamma)),(lengthv*sin(gamma)));


       chspr[i].v := addvectors(chspr[i].v,v1);
       chspr[i2].v := addvectors(chspr[i2].v,v2);
Ich schätze mal der Fehler liegt irgenwo bei sinus oder cosinus.

ibp 29. Jun 2004 19:24

Re: Zusammenstoß von Kugeln
 
in welcher form liegen denn die winkel vor ? in Grad oder im Bogenmaß?

braingrenade 29. Jun 2004 19:25

Re: Zusammenstoß von Kugeln
 
Das müsste Bogenmaß sein da afaik Delhpi ja alles in Bogenmaß ausrechnet.

Markus 29. Jun 2004 19:40

Re: Zusammenstoß von Kugeln
 
Auf Basis dieser Simulation könnte man doch noch irgendwie Schwerkraft oder so einbauen, dass die Kugeln zum Beispiel vom Boden abprallen, oder wenn man 2 Kugel übereinander loslässt (das wäre dann aber schon komplizierter :-) )

braingrenade 29. Jun 2004 19:43

Re: Zusammenstoß von Kugeln
 
Genau das hab ich mir auch schon überlegt :mrgreen:

Was auch interessant wäre wenn man Große und kleine Kugeln nimmt könnte man die Diffusion simulieren.

Markus 29. Jun 2004 19:56

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn man eine solche Situation korekt ausrechnen könnte, wärs schon toll :-) (siehe Bild)

braingrenade 29. Jun 2004 20:00

Re: Zusammenstoß von Kugeln
 
Das sollte rein theoretisch später mit dem Programm möglich sein, beim dem Aufprall mit der schräge muss man ja "nur" die Regel Einfallwinkel gleich Ausfallwinkel beachten.

braingrenade 30. Jun 2004 17:42

Re: Zusammenstoß von Kugeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok , ich hab nun meinen Physik-Lehrer gefragt und der hat mir folgende Lösung (siehe Anhang) gegeben, die ich so in Code umgesetzt habe :


Delphi-Quellcode:
type T2dvector = record
    x,y : real;
end;

implementation

function Tchaos.MakeVector(X,Y : real) : T2dVector;
begin
  result.x := x;
  result.y := y;
end;

function Tchaos.Magnitude(Vector : T2dVector) : real;
begin
   result := sqrt(Vector.X * Vector.X+
                  Vector.Y * Vector.Y);
end;

function Tchaos.DotProduct(VectorA,VectorB : T2dVector) : real;
begin
   result := VectorA.X*VectorB.X+
             VectorA.Y*VectorB.Y
end;


...
var
    i,i2,i3 :integer;
    vbuf,v1,v2 : T2dvector;
    alpha,beta,gamma,delta,lengthv : real;
...
       vbuf := makevector((chspr[i].x-chspr[i2].x),(chspr[i].y-chspr[i2].y) ) ;
       alpha := dotproduct(chspr[i].v,vbuf);
       beta := degtorad( 90-radtodeg(alpha));
       gamma := arctan(chspr[i].v.x/chspr[i].v.y);
       delta := beta + gamma;
       lengthv := sin(alpha)*magnitude(chspr[i].v);
       v1 := makevector((sin(delta)/lengthv),(cos(delta)/lengthv));

       alpha := dotproduct(chspr[i2].v,vbuf);
       beta := degtorad( 90-radtodeg(alpha));
       gamma := arctan(chspr[i2].v.x/chspr[i2].v.y);
       delta := beta + gamma;
       lengthv := sin(alpha)*magnitude(chspr[i2].v);
       v2 := makevector((sin(delta)/lengthv),(cos(delta)/lengthv));

       chspr[i].v := v1;
       chspr[i2].v := v2;
...
Nur leider geht das schon wieder nicht :wall:
Ich bin aber ziemlich sicher das der Fehler etwas damit zu tun hat das Delphi alles im Bogenmaß ausrechnet, aber ich komm nicht drauf wo der genau liegt.

xineohp 30. Jun 2004 17:52

Re: Zusammenstoß von Kugeln
 
moin,


ich glaube das das nicht stimmt:
alpha = Skalarprodukt von VerktorA und VektorB

Den Schnittwinkel zweier Graden (Vektoren) berechnet man mit:
cos(alpha) = Skalarprodukt(VektorA, VektorB) / Betrag(=Länge) von VektorA * Betrag von VektorB

braingrenade 30. Jun 2004 17:59

Re: Zusammenstoß von Kugeln
 
Ah ja dann hab ich da was falsch verstanden, nur leider is das nicht der einzige Fehler im Code.

Delphi-Quellcode:
       vbuf := makevector((chspr[i].x-chspr[i2].x),(chspr[i].y-chspr[i2].y) ) ;
       
       alpha := arccos(dotproduct(chspr[i].v,vbuf)/(magnitude(chspr[i].v)*magnitude(vbuf)));
       beta := degtorad( 90-radtodeg(alpha));
       gamma := arctan(chspr[i].v.x/chspr[i].v.y);
       delta := beta + gamma;
       lengthv := sin(alpha)*magnitude(chspr[i].v);
       v1 := makevector((sin(delta)/lengthv),(cos(delta)/lengthv));

       alpha := arccos(dotproduct(chspr[i2].v,vbuf)/(magnitude(chspr[i2].v)*magnitude(vbuf)));
       beta := degtorad( 90-radtodeg(alpha));
       gamma := arctan(chspr[i2].v.x/chspr[i2].v.y);
       delta := beta + gamma;
       lengthv := sin(alpha)*magnitude(chspr[i2].v);
       v2 := makevector((sin(delta)/lengthv),(cos(delta)/lengthv));
Geht leider immer noch nicht
:wall: :wall: :wall:

Ich glaub ich steh grad irgendwie auf'm Schlauch...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr.
Seite 3 von 7     123 45     Letzte »    

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 by Thomas Breitkreuz