欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vb.net 简单的方法模拟三体(有行星)

程序员文章站 2024-03-18 12:21:58
...

先上效果:
vb.net 简单的方法模拟三体(有行星)
只有3颗恒星vb.net 简单的方法模拟三体(有行星)
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
想要源代码的可以私信我,也可以使用邮件,邮箱地址在程序的使用方法里面。

相关标签: vb.net