 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 11.09.2012, 07:05 Titel: Simple (Kollision) Physik |
|
|
Bin heut Morgen wohl noch nichts ganz fit (und hab auch noch keine rechte Idee):
Ich wollte ein einfaches Physik-Experiment erstellen für eine neue Projekt-Idee
Habe erst nur ein kurzen Test-Code:
Leider macht er nicht was er soll.
Ich möchte das (im Beispiel durch 'initialwerte' festgelegte) Kollisions-Energie auf das 'Objekt' übertragen wird und dieses sich dann durch den 'Raum' bewegt mit abfallenender Energie (sprich langsamer wird) bei mir bewegt sich zwar das Objekt, aber leider mit gleichbleibender Geschwindigkeit und stoppt dann einfach wenn die Energie nicht mehr ausreicht.... (hat nun hoffentlich jemand verstanden was ich meine )
Code: |
screen 19, 32
Type tPhy
Energy as Single
PowerX as Single
PowerY as Single
End Type
Type tPos
X as Integer
Y as Integer
End Type
Dim Graph as any ptr = Imagecreate(10,10,&hFFFFFFFF) 'test
Dim GPhy as tPhy
GPhy.Energy=1.0
GPhy.PowerX=1.0
GPhy.PowerY=1.0
Dim GPos as tPos
GPos.X = 100
GPos.Y = 100
Sub NewPos(byref Position as tPos, byref Physics as tPhy)
If Physics.Energy = 0 Then Exit Sub
Position.X += (Physics.PowerX * Physics.Energy)
Position.Y += (Physics.PowerY * Physics.Energy)
Physics.Energy /= 1.00033
If Physics.Energy < 0.00001 Then Physics.Energy = 0
End Sub
Do
screenlock
cls
locate 1,1:?GPos.X,GPos.Y
locate 2,1:?GPhy.Energy,GPhy.PowerX,GPhy.PowerY
put (GPos.X,GPos.Y),Graph,pset
screenunlock
NewPos(GPos,GPhy)
If GPos.X = 0 Then GPhy.PowerX = 1.0
If GPos.Y = 0 Then GPhy.PowerY = 1.0
If GPos.X = 789 Then GPhy.PowerX = -1.0
If GPos.Y = 589 Then GPhy.PowerY = -1.0
sleep 10
Loop until multikey(&h01)
Imagedestroy(Graph)
|
Any Vorschläge?
Edit: Sorry, lag am fehlenden Kaffee
So funktionierts...
Code: |
screen 19, 32
Type tPhy
Energy as Single
PowerX as Single
PowerY as Single
End Type
Type tPos
X as single
Y as single
End Type
Dim Graph as any ptr = Imagecreate(10,10,&hFFFFFFFF) 'test
Dim GPhy as tPhy
GPhy.Energy=5.0
GPhy.PowerX=1.0
GPhy.PowerY=1.0
Dim GPos as tPos
GPos.X = 100
GPos.Y = 100
Sub NewPos(byref Position as tPos, byref Physics as tPhy)
If Physics.Energy = 0 Then Exit Sub
Position.X += (Physics.PowerX * Physics.Energy)
Position.Y += (Physics.PowerY * Physics.Energy)
Physics.Energy -= 0.001
If (Physics.Energy < 0.001) Then Physics.Energy = 0
End Sub
Do
screenlock
cls
locate 1,1:?GPos.X,GPos.Y
locate 2,1:?GPhy.Energy,GPhy.PowerX,GPhy.PowerY
put (GPos.X,GPos.Y),Graph,pset
screenunlock
NewPos(GPos,GPhy)
If (GPos.X <= 0) or (GPos.X >= 789) Then GPhy.PowerX *= -1.0
If (GPos.Y <= 0) or (GPos.Y >= 589)Then GPhy.PowerY *= -1.0
sleep 10
Loop until multikey(&h01)
Imagedestroy(Graph)
|
_________________
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 11.09.2012, 21:00 Titel: |
|
|
Vielleicht ein altes Projekt von mir als Ideenlieferant für die Umsetzung des Impulssatzes:
http://www.dreael.ch/Deutsch/Download/Billard-Simulation.html
Die QB-Version sollte sich mit Leichtigkeit in FB übernehmen lassen, weil nirgends irgendwelcher 16-bit-spezifischer POKE/DEF SEG/INP()/OUT-Code verwendet wird. In FB kannst Du sogar ähnlich der C++-Version ein hübscheres Klassendesign spendieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 12.09.2012, 09:44 Titel: |
|
|
Billiard... auf die Analogie wär ich gar nicht gekommen (bin eher der Dart-spieler )
Das in etwa war das was ich suchte, wenn man bei Google allerdings Physik Algos sucht findet man nichts brauchbares (wenn man nicht weiss wonach man genau suchen soll...)
Hatter hier aber noch ein Thread gefunden der meinem recht ähnlich ist
http://forum.qbasic.at/viewtopic.php?t=7829&highlight=physik
Das ganze soll ein neuer Versuch (nachdem ich vor ein paar Jahren schon einen nicht so tollen Entwurf geschrieben habe...) für ein Space-Break-Out werden, da gibts wohl noch ein paar 'unrealistische' einstellungen zu überdenken, wie das der Ball sich auch bei Abfallender Energie nicht auf null sinken darf (wär blöd wenn das Spiel 'vorbei' wär weil der Ball im Raum 'stecken' bleibt')... _________________
 |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.09.2012, 11:56 Titel: |
|
|
Ich kann dir ein paar begriffe zuwerfen von denen ich nicht weiß ob du damit was anfangen kannst, aber versuchen kann mans ja mal
Was man letztendlich tut ist, die physikalischen gesetze die man so rausgefunden hat in [url=http://de.wikipedia.org/wiki/Gewöhnliche_Differentialgleichung]differentialgleichungen[/url] zu packen. das heißt du hast deine position, die ableitung davon ist die geschwindigkeit, die ableitung davon die beschleunigung etc., und du kennst jetzt nur deine anfangsposition und deine anfangsgeschwindigkeit und dann die funktion zu welchem zeitpunkt die beschleunigung wie groß und in welche richtung ist und möchtest damit die dadurch definierte funktion der geschwindigkeit und der position ausrechnen, damit du eben weißt zu welchem zeitpunkt dein objekt wo ist damit du's an der richtigen stelle auf den bildschirm malen kannst. Das ganze nennt sich mathematisch ein Anfangswertproblem
Einfaches beispiel: Anfangsgeschwindigkeit v(0) = 0, Anfangsposition x(0) = 0 und konstante beschleunigung a(t) = a = 1. Damit kannst du dir dann die funktion x(t) ausrechnen als x(t) = 1/2 * t * t. Die allgemeine formel für den fall konstanter beschleunigung ist x(t) = x(0) + v(0) * t + a * t * t, die du aus dem physikuntericht kennen müsstest.
Das dumme ist, wenn a(t) komplizierter oder gar unbekannt ist (a(t) = 1 wenn der nutzer ne taste drückt oder 0 wenn nicht und du weißt natürlich nicht wann er welche taste drückt) kannst du das problem nicht mehr einfach so lösen. In dem fall benutzt man dann ein numerisches integrationsverfahren, was die lösung dieser differentialgleichungen so pi mal daumen errät sozusagen. Das einfachste davon ist das explizite Euler-verfahren. Je nach dem wie wichtig deine simulation ist (zum beispiel flugbahn von marslandungskapseln vorherberechnen) ist das aber halt nicht genau genug, dann benutzt man bessere verfahren. Ein immernoch halbwegs einfaches beispiel für bessere verfahren wäre das Runge-Kutta-Verfahren. Je komplizierter du allerdings das verfahren machst um so langsamer wird deine simulation, für echtzeitsimulation sind einige sachen irgendwann nicht mehr tauglich.
Rotationen kann man an der stelle übrigens extakt gleich rechnen wie normale bewegungen, du hast ne winkelgeschwindigkeit und ne winkelbeschleunigung und ne "verdrehtheits"position sozusagen, genau das selbe spiel. Du musst dafür nur die körper basierend auf ihrem schwerpunkt modelieren, sonst sieht das ganze etwas unnatürlich aus.
*wenn* du dann mal funktionierende körperbewegungen hast kannst du anfangen dir über gelenke und kollisionen zwischen körpern gedanken zu machen. Da gibts dann massig mehr ansätze dazu, die alle verschiedene vor- und nachteile haben. Sprungbretter: Starrkörpersimulation, Kollisionserkennung, (hier wird das deutsche wikipedia-material dann etwas dünn..) Collision Detection, Collision Response.
PS: kann mir mal wer erklären, warum der BB-Code parser sich weigert, urls mit umlauten und klammern drin zu akzeptieren wenn man die nicht von hand url-encoded? x.x das board brauch glaub ich mal n software-update  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|