![]() |
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:
Ich schätze mal der Fehler liegt irgenwo bei sinus oder cosinus.
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); |
Re: Zusammenstoß von Kugeln
in welcher form liegen denn die winkel vor ? in Grad oder im Bogenmaß?
|
Re: Zusammenstoß von Kugeln
Das müsste Bogenmaß sein da afaik Delhpi ja alles in Bogenmaß ausrechnet.
|
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 :-) )
|
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. |
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)
|
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.
|
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:
Nur leider geht das schon wieder nicht :wall:
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; ... 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. |
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 |
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:
Geht leider immer noch nicht
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)); :wall: :wall: :wall: Ich glaub ich steh grad irgendwie auf'm Schlauch... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr. |
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