vb.net 简单的方法模拟三体(有行星)
程序员文章站
2024-03-18 12:21:58
...
先上效果:
只有3颗恒星
3+3(3颗行星一开始重叠)
图是用Graphics画的,轨道计算采用经典力学计算(所以导致非常不准)。
以下代码仅供参考,有建议可以提出。
一、首先定义Graphics和坐标系:
Dim a As Graphics
a = Me.CreateGraphics
a.DrawLine(black, x, 0, x, 2 * y)
a.DrawLine(black, 0, y, x * 2, y)
二、然后计算。首先写三颗恒星。
1.先计算距离
r1f = (x20 - x10) * (x20 - x10) + (y20 - y10) * (y20 - y10)
r2f = (x20 - x30) * (x20 - x30) + (y20 - y30) * (y20 - y30)
r3f = (x30 - x10) * (x30 - x10) + (y30 - y10) * (y30 - y10)
r1 = Math.Sqrt(r1f)
r2 = Math.Sqrt(r2f)
r3 = Math.Sqrt(r3f)
2.计算每颗恒星的受力,以x,y轴方向的力表示。
a1m2 = g * m2 / r1
a1m3 = g * m3 / r3
a2m1 = g * m1 / r1
a2m3 = g * m3 / r2
a3m1 = g * m1 / r3
a3m2 = g * m2 / r2
sina1 = (y20 - y10) / r1
cosa1 = (x20 - x10) / r1
sina2 = (y20 - y30) / r2
cosa2 = (x30 - x20) / r2
sina3 = (y10 - y30) / r3
cosa3 = (x30 - x10) / r3
a1x = a1m2 * cosa1 + a1m3 * cosa3
a1y = a1m2 * sina1 - a1m3 * sina3
a2x = a2m3 * cosa2 - a2m1 * cosa1
a2y = -a2m3 * sina2 - a2m1 * sina1
a3x = -a3m1 * cosa3 - a3m2 * cosa2
a3y = a3m1 * sina3 + a3m2 * sina2
3.计算下一帧的位置
x1t = x10 + v1x0 * t + 0.5 * a1x * t * t
y1t = y10 + v1y0 * t + 0.5 * a1y * t * t
x2t = x20 + v2x0 * t + 0.5 * a2x * t * t
y2t = y20 + v2y0 * t + 0.5 * a2y * t * t
x3t = x30 + v3x0 * t + 0.5 * a3x * t * t
y3t = y30 + v3y0 * t + 0.5 * a3y * t * t
4.绘图a.DrawLine(red, x10 + x, y10 + y, x1t + x, y1t + y)
5.为下一帧初始化
x10 = x1t
y10 = y1t
x20 = x2t
y20 = y2t
x30 = x3t
y30 = y3t
v1x0 += a1x * t
v1y0 += a1y * t
v2x0 += a2x * t
v2y0 += a2y * t
v3x0 += a3x * t
v3y0 += a3y * t
然后写个for循环就行了。
接下来写行星。
按照上面同样的步骤。
r4 = Math.Sqrt((x40 - x10) * (x40 - x10) + (y40 - y10) * (y40 - y10))
r5 = Math.Sqrt((x20 - x40) * (x20 - x40) + (y20 - y40) * (y20 - y40))
r6 = Math.Sqrt((x30 - x40) * (x30 - x40) + (y30 - y40) * (y30 - y40))
a1m4 = 0
a4m1 = g * m1 / r4
a2m4 = 0
a4m2 = g * m2 / r5
a3m4 = 0
a4m3 = g * m3 / r6
sin4 = (y10 - y40) / r4
cos4 = (x10 - x40) / r4
sin5 = (y20 - y40) / r5
cos5 = (x20 - x40) / r5
sin6 = (y30 - y40) / r6
cos6 = (x30 - x40) / r6
a4x = a4m1 * cos4 + a4m2 * cos5 + a4m3 * cos6
a4y = a4m1 * sin4 + a4m2 * sin5 + a4m3 * sin6
x4t = x40 + v4x0 * t + 0.5 * a4x * t * t
y4t = y40 + v4y0 * t + 0.5 * a4y * t * t
a.DrawLine(purple, x40 + x, y40 + y, x4t + x, y4t + y)
x40 = x4t
y40 = y4t
v4x0 += a4x * t
v4y0 += a4y * t
最后将这部分复制3份即可模拟3颗行星。
三、美化
1.左上角显示数据
Dim s As String
s = i
Me.Text = "现在是第" + s + "步"
If i Mod 50 = 0 Then'防止运算过慢影响程序顺滑度
Label2.Text = x10 & vbCrLf & x20 & vbCrLf & x30 & vbCrLf &
x40 & vbCrLf & x402 & vbCrLf & x403
Label3.Text = y10 & vbCrLf & y20 & vbCrLf & y30 & vbCrLf &
y40 & vbCrLf & y402 & vbCrLf & y403
Label4.Text = Math.Sqrt(v1x0 * v1x0 + v1y0 * v1y0) & vbCrLf &
Math.Sqrt(v2x0 * v2x0 + v2y0 * v2y0) & vbCrLf &
Math.Sqrt(v3x0 * v3x0 + v3y0 * v3y0) & vbCrLf &
Math.Sqrt(v4x0 * v4x0 + v4y0 * v4y0) & vbCrLf &
Math.Sqrt(v4x02 * v4x02 + v4y02 * v4y02) & vbCrLf &
Math.Sqrt(v4x03 * v4x03 + v4y03 * v4y03)
End If
Application.DoEvents()'防止程序锁死
最后做一个启动器就成了。
完整程序下载://download.csdn.net/download/tanksheng545/12152877
想要源代码的可以私信我,也可以使用邮件,邮箱地址在程序的使用方法里面。