Physik-Simulation
Zum Code
Das hier ist mal eine komplexere Simulation, dabei werden nur elektronische Kräfte und die Gravitationskräfte beachtet, letztere standardmäßig nur zwischen den einzelnen Objekten. Auf Wunsch kann man die Erdgravitation (Erdoberfläche) anschalten. Auch alle Kräfte können als Kraftlinien eingezeichnet werden.

Zwei Modi sind möglich: Realtime und normale Berechnungen. Beim Realtime-Modus wird die Zeit von der letzten Simulation an gemessen. Beim normalen Modus beträgt die Zeit immer "dt" siehe die entsprechende Textbox. Um das ganze zu beschleunigen, gibt "n" (andere Textbox) an, wie oft dargestellt werden soll. Bei n=50 wird z.B. jede 50. Berechnung dargestellt.

Beide Berechnungen sind jedoch nicht exakt, egal wie klein die Zeitspanne zwischen den Berechnungen ist, es gibt immer Fehler. Diese sieht man vor allem in der Kreisbahn von Objekten -> dafür gibt es die Option "Cheat", wodurch die Formel s=1/2*a*t^2 angepasst wird zu s=1*a*t^2. Dadurch werden gerade Beschleunigen zu groß berechnet, jedoch klappt die Kreisbahn wieder.

Ganz rechts wird die Bahn der Objekte aufgezeichnet, in der Titelleiste steht die momentane Frameleistung.

Die meisten Buttons fügen Objekte in den Worldspace ein, manche mit negativen Ladungen, manche mit positiven, manchmal Fixsterne, je nachdem. Gerechnet wird immer in den korrekten physikalischen Masseinheiten, also Meter, Newton etc. Zudem sind einige unfertige Spielereien dabei, wie z.B. der Versuch, Kraftfelder einzeichnen zu lassen.

Viel Spaß damit, spielt einfach mal ein wenig rum und wenn ihr es hinkriegt, Kraftfelder einzuzeichnen, mailt mir :D

History
26.12.2002 Online gestellt

Autor: Dominik Auras <Dominik_auf_vbinside.de>

Code aus Module2.bas
Option Explicit

Public Type Beschleunigung
x As Double
y As Double
End Type

Public Type Bewegung
x As Double
y As Double
End Type

Public Type Geschwindigkeitsvektor
x As Double
y As Double
End Type

Public Type Grösse
width As Double
height As Double
End Type

Public Type Kraftvektor
x As Double
y As Double
End Type

Public Type Position
x As Double
y As Double
End Type

Public Type Objekt
Kräfte() As Kraftvektor
ResultierendeKraft As Kraftvektor
Masse As Double
Beschleunigung As Beschleunigung
Bewegung As Bewegung
Position As Position
Grösse As Grösse
Ladung As Double
Geschwindigkeit As Geschwindigkeitsvektor
Fixed As Boolean
Crashed As Boolean

DisplayVektoren() As Kraftvektor
LastPos As Position
TraceFarbe As Long
End Type

Public Sub AddObjekt(Objekt As Objekt, Worldspace() As Objekt)
Dim i As Long, r As Byte, g As Byte, b As Byte

ReDim Preserve Worldspace(UBound(Worldspace) + 1)

ReDim Objekt.DisplayVektoren(0)

Objekt.LastPos = Objekt.Position

r = Rnd * 255: g = Rnd * 255: b = Rnd * 255
Objekt.TraceFarbe = RGB(r, g, b)

i = UBound(Worldspace)
Worldspace(i) = Objekt
End Sub

Public Sub AddVektor(Vektor As Kraftvektor, Objekt As Objekt)
Dim i As Long

ReDim Preserve Objekt.Kräfte(UBound(Objekt.Kräfte) + 1)

i = UBound(Objekt.Kräfte)
Objekt.Kräfte(i) = Vektor
End Sub

Public Sub AddDVektor(Vektor As Kraftvektor, Objekt As Objekt)
Dim i As Long

ReDim Preserve _
Objekt.DisplayVektoren(UBound(Objekt.DisplayVektoren) + 1)

i = UBound(Objekt.DisplayVektoren)
Objekt.DisplayVektoren(i) = Vektor
End Sub