Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Simple (Kollision) Physik

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 11.09.2012, 07:05    Titel: Simple (Kollision) Physik Antworten mit Zitat

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 grinsen)

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? happy

Edit: Sorry, lag am fehlenden Kaffee happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 11.09.2012, 21:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 12.09.2012, 09:44    Titel: Antworten mit Zitat

Billiard... auf die Analogie wär ich gar nicht gekommen (bin eher der Dart-spieler happy)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.09.2012, 11:56    Titel: Antworten mit Zitat

Ich kann dir ein paar begriffe zuwerfen von denen ich nicht weiß ob du damit was anfangen kannst, aber versuchen kann mans ja mal Zunge rausstrecken

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 Zunge rausstrecken
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz