vad är problemet med följande kod... Konstig kod...noll-gravitation
den ska rita upp två cirklar som ska agera som planeter i ett gravistationsfält som utgår från mitten (0,0).
Jag får bara "planeterna" att gå rakt from... oavsett riktning.
gravitationen har jag satt som en kraft mot mitten.
<code>
Const PI As Single = 3.14159265358979
Private Type Obj
X As Long
Y As Long
Ang As Single
Spd As Long
Rad As Long
End Type
Dim Circles(0 To 1) As Obj
Private Sub Form_Load()
Randomize Timer
Dim sw As Long, sh As Long
With Picture1
sw = .ScaleWidth 'Få (0,0) i mitten
sh = .ScaleHeight
.ScaleMode = 0 'User
.ScaleLeft = -sw / 2
.ScaleTop = -sh / 2
.ScaleWidth = sw / 2
.ScaleHeight = sh / 2
End With
For i = 0 To UBound(Circles)
With Circles(i)
.X = Fix(Rnd * Picture1.ScaleHeight) + Picture1.ScaleLeft
.Y = Fix(Rnd * Picture1.ScaleHeight) + Picture1.ScaleTop
.Ang = Rnd * 2 * PI
.Spd = Rnd * 15
.Rad = Rnd * 300
End With
Next i
End Sub
Private Sub Form_Resize()
Picture1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
Private Sub Timer1_Timer()
On Error Resume Next
Dim X1 As Single, Y1 As Single, V1 As Single, S1 As Single 'Aktuella farten
Dim X2 As Single, Y2 As Single, V2 As Single, S2 As Single 'Gravitationskraften
Dim X3 As Single, Y3 As Single, V3 As Single, S3 As Single 'Nya riktningen
'V är riktningen (radianer)
'S är kraften/farten
'X och Y är kordinater
For i = 0 To UBound(Circles)
With Circles(i)
V1 = .Ang
S1 = .Spd
X1 = S1 * Cos(V1)
Y1 = S1 * Sin(V1)
V2 = Atn(.Y / .X)
S2 = 1.5
X2 = S2 * Cos(V2)
Y2 = S2 * Sin(V2)
X3 = X1 + X2
Y3 = Y1 + Y2
V3 = Atn(Y3 / X3)
S3 = Sqr(X3 ^ 2 + Y3 ^ 2)
Picture1.Circle (.X, .Y), .Rad, Picture1.BackColor
Picture1.Line (.X, .Y)-(X3, Y3), RGB(0, 255, 0)
.X = X3
.Y = Y3
.Ang = V3
.Spd = S3
Picture1.Circle (.X, .Y), .Rad, RGB(255, 0, 0)
End With
Next i
End Sub
</code>Sv: noll-gravitation
Vilken formel använder du dig av?
Jad skulle definiera Obj så här:
Type Obj
x As Single
y As Single
vx As Single
vy As Single
m As Single
End Type
Sedan hade jag gjort en typ för kraft:
Type Force
x As Single
y As Single
End Type
Sedan en funktion för att applicera en kraft på ett Obj under tiden t:
Sub ApplyForce (o As Object, f As Force, t As Single)
o.vx=o.vx+t*f.x/o.m
o.vy=o.vy+t*f.y/o.m
End Sub
och en funktion för att flytta ett objekt under tiden t:
Sub MoveObj (o As Object, t As Single)
o.x=o.x+t*o.vx
o.y=o.y+t*o.vy
End Sub
Och slutligen en funktion som ger kraften på ett objekt när det utsätts för ett annat - och detta får du med formeln:
F=k*m1*m2/(d*d)
där d är avståndet mellan. Jag är tyvärr inte säker på vilken metod att räkna ut det som är effektivast, men jag återkommer om du inte löser det själv.
/Niklas Jansson