太阳系行星轨道及运行

太阳系行星轨道及运行

动画演示

本程序对太阳系行星、卫星运行情况进行动画演示。具有以下功能:

1.可单独(或全部)显示或隐藏某个天体、运行轨道、天体名称。

2.可调节演示速度、画面比列、观察角度(从天球赤道到天球北极观察太阳系)。

3.可将某个天体(例如月亮)设置为屏幕中间静止不动的天体,观察其他天体相对于该天体运行的情况。

本程序改进版见:太阳系行星轨道及运行-3D立体动画演示

通过设置不同的参数,可得到许多美丽而奇妙的图案,如下:

'需在窗体放置以下 3 个控件,所有控件均采用默认设置:

' Picture1,Command1,Timer1

' 注意:在属性窗口将 Command1 的 Index 属性设置为 0

'其次,为窗体添加一个名为 mFast 的菜单,再为 mFast 添加一个名为 mmFast 的下级子菜单,并将 mmFast 的索引设置为 0。

' 即:mmFast 是以序号 0 开头的菜单数组控件的第一个。

'以下是窗体代码,在 VB6.0 调试通过:

Dim ctD() As tyD, ctDs As Long, ctP As Single, ctCenter As Long

Dim ctBi As Single, ctV As Single, ctTrack As Boolean, ctBW As Long Dim ctSeeJ As Long, ctSeeBi As Single, ctSet As MenuSet

'定义表示天体的数据类型

Private Type tyD

Cap As String '天体名称

r As Long '天体半径(像素,下同)

a As Single '轨道:横半径

b As Single '轨道:纵半径

c As Single '轨道:焦点

e As Single '轨道:偏心率

IsHui As Boolean '是否彗星

Father As Long '父天体序号:轨道焦点上的天体

Se As Long '颜色

V As Single '运行角速度

Jiao As Single '某时刻的与父天体连线角度

X As Single '天体当前坐标

Y As Single

xUp As Single '上一时刻坐标

yUp As Single

Visible As Boolean '是否显示:球体

ShowCap As Boolean '是否显示:标题

GuiDao As Boolean '是否显示:轨道

End Type

Enum MenuSet

'以下为选项菜单标示

ms_All = -2

ms_NoAll = -1

'以下为按钮标示

ms_RunStop = 0 '开始/暂停

ms_Step '步进,下一位置

ms_UnRun '后退

ms_Track '轨迹:显示/隐藏

ms_DefSet '默认设置

ms_Center '参照系

ms_Visible '天体:显示/隐藏

ms_ShowCap '天体名称

ms_GuiDao '轨道

ms_Bi '缩放比

ms_V '速度

ms_SeeJ '视角

End Enum

Private Sub Form_Load()

Me.ScaleMode = 3: Me.Caption = "太阳系行星运行演示"

mFast.Visible = False: ctP = 3.1415926

Timer1.Interval = 25: Timer1.Enabled = True

Call Init

'Me.WindowState = vbMaximized '最大化窗体

'窗体大小为屏幕的 3/4,居中

Me.Move Screen.Width * 0.1, Screen.Height * 0.1, Screen.Width * 0.8, Screen.Height * 0.8

End Sub

Private Sub Form_Resize()

Dim I As Long, L As Single, T As Single, H As Single, H1 As Single, W As Single

'设置控件位置

H1 = Me.TextHeight("A"): L = H1 * 0.3: T = L

L = 3

For I = 0 To Command1.Count - 1

W = Me.TextWidth(Command1(I).Caption & "ab")

Command1(I).Move L, T, W, H1 * 2

L = L + W + 3

Next

T = T * 2 + Command1(0).Height: H = Me.ScaleHeight - T

If H > 0 Then Picture1.Move 0, T, Me.ScaleWidth, H

'将 Picture1 的中心设置为坐标原点

Picture1.ScaleMode = 3

Picture1.ScaleLeft = -Picture1.ScaleWidth * 0.5

Picture1.ScaleTop = -Picture1.ScaleHeight * 0.5

Picture1.Cls

Call Run1

End Sub

Private Sub Init()

'初始化天体参数

Dim I As Long, V As Single, J As Single

ctBW = 0 ' 40 '四周边界空白区,仅用于调试。调试完毕应设为 0 。调试代码**** Picture1.AutoRedraw = True

Picture1.BackColor = &H220000 '&HFFFFFF '

ctCenter = 0: ctBi = 1: ctV = 1 '参照系(位于中心的天体),缩放比列,速度 ctSeeJ = 30: ctSeeBi = ctSeeJ / 90 '视点角度,视角比

ctTrack = False '不显示运动轨迹(不是轨道)

'添加按钮

KjCls Command1

KjAdd Command1, "始/停(&K)", ms_RunStop, "天体的运动状态:开始/暂停" KjAdd Command1, "进(&J)", ms_Step, "步进,运行到下一位置"

KjAdd Command1, "退(&T)", ms_UnRun, "步进,后退到上一位置"

KjAdd Command1, "迹(&A)", ms_Track, "运动轨迹:显示/隐藏"

KjAdd Command1, "默(&D)", ms_DefSet, "将所有参数恢复为默认设置"

KjAdd Command1, "参照系(&C)", ms_Center, "设置参照系(位于中心的天体)"

KjAdd Command1, "天体(&X)", ms_Visible, "天体:显示/隐藏"

KjAdd Command1, "名称(&M)", ms_ShowCap, "天体名称:显示/隐藏" KjAdd Command1, "轨道(&G)", ms_GuiDao, "天体运行轨道:显示/隐藏" KjAdd Command1, "速度(&V)", ms_V, "设置速度"

KjAdd Command1, "视角(&L)", ms_SeeJ, "设置视点角度"

KjAdd Command1, "缩放(&S)", ms_Bi, "设置缩放比列"

'添加天体(演示比列状态下),半径以 100 像素为标准

'参数依次是:名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否

ctDs = -1: ReDim ctD(0)

AddCircle "太阳", "", 22, 2, 0, ctP * 0.008, RGB(255, 200, 0)

AddCircle "水星", "", 5, 0.5, 0.206, ctP * 0.03, &H999999

AddCircle "金星", "", 9, 0.8, 0.0068, ctP * 0.018, &H55AAAA

AddCircle "地球", "", 10, 1.2, 0.0167, ctP * 0.01, RGB(0, 0, 255)

AddCircle "月亮", "地球", 4, 0.2, 0, ctP * 0.06, &H888888

AddCircle "嫦娥1号", "月亮", 2, 0.06, 0, ctP * 0.12, &HCCCCCC

AddCircle "火星", "", 6, 1.8, 0.093, ctP * 0.005, &H1155FF

AddCircle "火卫1", "火星", 3, 0.1, 0, ctP * 0.1, &HFFFF00, ctP * 2 * 0.3 AddCircle "火卫2", "火星", 3, 0.15, 0, ctP * 0.1, &H7777FF, ctP * 2 * 0.7 AddCircle "木星", "", 16, 3, 0.0483, ctP * 0.003, &HEEDDCC

AddCircle "木卫1", "木星", 2, 0.25, 0, ctP * 0.05, &H883487, ctP * 2 * 0.2 AddCircle "木卫2", "木星", 2, 0.3, 0, ctP * 0.035, &H348888, ctP * 2 * 0.4 AddCircle "木卫3", "木星", 3, 0.35, 0, ctP * 0.03, &HAA34CC, ctP * 2 * 0.6 AddCircle "木卫4", "木星", 4, 0.45, 0, ctP * 0.02, &H888888, ctP * 2 * 0.8 AddCircle "土星", "", 14, 5, 0.056, ctP * 0.002, &H5599FF

AddCircle "土卫6", "土星", 4, 0.25, 0, ctP * 0.055, &H99EEEE

AddCircle "天王星", "", 12, 6.5, 0.0461, ctP * 0.0015, &HFFCCCC

AddCircle "天卫3", "天王星", 3, 0.2, 0, ctP * 0.05, &H33FF88, ctP * 2 * 0.5 AddCircle "天卫4", "天王星", 3, 0.3, 0, ctP * 0.035, &HFF3311, ctP * 2 * 0.8 AddCircle "海王星", "", 12, 9, 0.0097, ctP * 0.001, &HFF7766

AddCircle "海卫1", "海王星", 3, 0.25, 0, -ctP * 0.03, &H882388

AddCircle "哈雷彗星", "", 2, 5.5, 0.83, ctP * 0.0012, &H777777, ctP * 1, True Call Form_Resize

End Sub

Private Sub Command1_Click(Index As Integer)

Dim I As Long, J As Long, nStr As String, Zu As Variant

Dim nSel As Long, nAll As Long, nNo As Long

ctSet = Val(Command1(Index).Tag) '得到按钮标示

KjCls mmFast '清除菜单

'装载快捷菜单,并勾选选定项目

Select Case ctSet

Case ms_DefSet: Call Init: Run1: Exit Sub '默认设置

Case ms_RunStop: Timer1.Enabled = Not Timer1.Enabled: Exit Sub '开始/暂停

Case ms_Track: ctTrack = Not ctTrack: Picture1.Cls: Call Run1 '保留运动轨迹

Case ms_Step '步进,前进到下一位置

If Not Timer1.Enabled Then Run1 True

Timer1.Enabled = False

Case ms_UnRun '步进,后退到下一位置

If Not Timer1.Enabled Then Run1 True, True

Timer1.Enabled = False

Case ms_Bi '缩放比列

Zu = Array(0.1, 0.2, 0.3, 0.4, "-", 0.5, 0.6, 0.7, 0.8, 0.9, "-", 1, 1.2, 1.5, 1.8, 2, 3, 5, 8, 10)

KjAddZu mmFast, Zu, ctBi, " 倍": GoTo Show1 '添加数组菜单,并勾选 ctBi Case ms_SeeJ '视点角度

Zu = Array("90 度(天球北极)", "80 度", "70 度", "60 度", "50 度", "45 度", "40 度", "30 度", "20 度", "15 度", "10 度", "5 度", "0 度(天球赤道)")

KjAddZu mmFast, Zu, ctSeeJ: GoTo Show1 '添加数组菜单,并勾选 ctSeeJ Case ms_V '速度

Zu = Array(0.1, 0.2, 0.3, 0.4, "-", 0.5, 0.6, 0.7, 0.8, 0.9, "-", 1, 1.5, 2, 2.5, 3, 4, 5,

7.5, 10)

KjAddZu mmFast, Zu, ctV, " 倍": GoTo Show1

Case Else '装载天体名称

For I = 0 To ctDs

J = Ji(I) '天体 I 的级别

KjAdd mmFast, "&" & I & " " & String(J * 2, " ") & ctD(I).Cap

Next

End Select

'勾选选定天体

Select Case ctSet

Case ms_Center: mmFast(ctCenter).Checked = True: GoTo Show1 '参照系(中心天体)

Case ms_ShowCap '显示天体名称

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).ShowCap: Next

Case ms_Visible '天体 是否可见

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).Visible: Next

Case ms_GuiDao '轨道

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).GuiDao: Next

Case Else: Exit Sub

End Select

KjAdd mmFast, "-"

nAll = KjAdd(mmFast, "全选", ms_All)

nNo = KjAdd(mmFast, "全不选", ms_NoAll)

For I = 0 To ctDs

If mmFast(I).Checked Then nSel = nSel + 1

Next

If nSel = 0 Then mmFast(nNo).Checked = True: mmFast(nNo).Enabled = False

If nSel = ctDs + 1 Then mmFast(nAll).Checked = True: mmFast(nAll).Enabled = False

Show1:

Command1(Index).BackColor = &HFFCCCC '将选中按钮设置为淡蓝色 Me.PopupMenu mFast, , Command1(Index).Left, Command1(Index).Top + Command1(Index).Height - 3

Command1(Index).BackColor = Me.BackColor

End Sub

Private Sub mmFast_Click(Index As Integer)

'通过快捷菜单设置天体有关参数

Dim nTag As MenuSet, I As Long, TF As Boolean

nTag = Val(mmFast(Index).Tag) '菜单标示:ms_All 全选,ms_NoAll 全不选

Select Case ctSet 'ctSet:按钮标示,在 Command1_Click 中设置 Case ms_V '速度

ctV = Val(mmFast(Index).Caption)

Case ms_SeeJ '视点角度

ctSeeJ = Val(mmFast(Index).Caption) '视点角度

ctSeeBi = ctSeeJ / 90 '视角比

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_Bi '缩放比列

ctBi = Val(mmFast(Index).Caption)

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_Center '参照系(中心天体)

ctCenter = Index

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_ShowCap '显示名称

If Index

ctD(Index).ShowCap = Not ctD(Index).ShowCap

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).ShowCap = TF: Next

End If

Case ms_Visible '天体 是否可见

If Index

ctD(Index).Visible = Not ctD(Index).Visible

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).Visible = TF: Next

End If

Case ms_GuiDao '轨道

If Index

ctD(Index).GuiDao = Not ctD(Index).GuiDao

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).GuiDao = TF: Next

End If

End Select

Picture1.Cls

Call Run1

End Sub

Private Sub AddCircle(nName As String, nFather As String, r As Long, a As Single, e As Single, V As Single, _

Optional Se As Long = 255, Optional Jiao As Single, Optional IsHui As Boolean)

'添加一个天体,参数依次是:

' 名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否

Dim I As Long, J As Long

a = a * 100 '半径以 100 像素为标准

ctDs = ctDs + 1: ReDim Preserve ctD(ctDs)

'设置父天体编号

For I = 0 To ctDs - 1

If LCase(ctD(I).Cap) = LCase(nFather) Then ctD(ctDs).Father = I: Exit For Next

ctD(ctDs).Cap = nName: ctD(ctDs).r = r: ctD(ctDs).a = a

ctD(ctDs).c = a * e: ctD(ctDs).b = Sqr(a ^ 2 - ctD(ctDs).c ^ 2)

ctD(ctDs).IsHui = IsHui: ctD(ctDs).V = V: ctD(ctDs).Se = Se

ctD(ctDs).xUp = 0: ctD(ctDs).yUp = 0: ctD(ctDs).Visible = True ctD(ctDs).GuiDao = True

Randomize

If Jiao = 0 Then ctD(ctDs).Jiao = Rnd * ctP * 2 Else ctD(ctDs).Jiao = Jiao End Sub

Private Function KjAddZu(Kj, Zu As Variant, ByVal CheckStr As String, Optional SameStr As String)

'添加一个数组菜单,并勾选标题为 CheckStr 的条目

Dim I As Long, J As Long, nCap As String

If Left(CheckStr, 1) = "." Then CheckStr = "0" & CheckStr

For I = LBound(Zu) To UBound(Zu)

nCap = Zu(I)

If Left(nCap, 1) = "." Then nCap = "0" & nCap

If nCap = "-" Then J = KjAdd(Kj, nCap) Else J = KjAdd(Kj, nCap & SameStr) ' If LCase(CheckStr) = LCase(nCap) Then Kj(J).Checked = True

If Val(CheckStr) = Val(nCap) Then Kj(J).Checked = True

Next

End Function

Private Function KjAdd(Kj, nCap As String, Optional nTag As String, Optional nNote As String) As Long

'为数组控件添加一个成员,返回新添加的成员序号

Dim I As Long

I = Kj.Count - 1

If Kj(I).Caption "" Then I = I + 1: Load Kj(I)

On Error Resume Next

Kj(I).Checked = False

Kj(I).Caption = nCap

Kj(I).Tag = nTag

Kj(I).ToolTipText = nNote

Kj(I).Visible = True

KjAdd = I

End Function

Private Function KjCls(Kj) As Long

'卸载数组控件的所有成员(0号除外)

Dim I As Long

For I = Kj.Count - 1 To 1 Step -1

Unload Kj(I)

Next

On Error Resume Next

Kj(0).Caption = ""

Kj(0).Checked = False

End Function

Private Function CapToNum(nCap As String) As Long

'返回名称为 nCap 的天体编号

Dim I As Long

For I = 0 To ctDs

If LCase(ctD(I).Cap) = LCase(nCap) Then CapToNum = I: Exit Function Next

CapToNum = -1

End Function

Private Function Ji(ByVal D As Long) As Long

'返回天体级别(编号为 D )

Do

If ctD(D).Father = 0 Then Exit Do

D = ctD(D).Father: Ji = Ji + 1

Loop

End Function

Private Sub Timer1_Timer()

Run1 True

End Sub

Private Sub Run1(Optional nRun As Boolean, Optional UnRun As Boolean) '显示一次运行的瞬时状态

Dim wB As Single, hB As Single, X As Single, Y As Single, ZuY() As Long Dim I As Long, T As Long, Se As Long, r As Single

Dim CenX As Single, CenY As Single, InD As Boolean, InD1 As Boolean

'计算天体瞬时位置:相对与父天体的角度

For I = 0 To ctDs

If nRun Then

If UnRun Then X = ctD(I).Jiao - ctD(I).V * ctV Else X = ctD(I).Jiao + ctD(I).V * ctV

'保证数值在 0 到 ctP*2 的范围内

If X > ctP * 2 Then X = X - ctP * 2

If X

ctD(I).Jiao = X

End If

' If I = CapToNum("地球") Then Me.Caption = ctD(I).Jiao / ctP * 180 '调试代码****

ctD(I).X = ctBi * (ctD(I).a * Sin(ctD(I).Jiao) + ctD(I).c)

ctD(I).Y = ctBi * ctSeeBi * (ctD(I).b * Cos(ctD(I).Jiao))

'加上父天体的位置

ctD(I).X = ctD(I).X + ctD(ctD(I).Father).X: ctD(I).Y = ctD(I).Y +

ctD(ctD(I).Father).Y

Next

'移位参照系

CenX = ctD(ctCenter).X: CenY = ctD(ctCenter).Y '中心天体位置

For I = 0 To ctDs

ctD(I).X = CenX - ctD(I).X: ctD(I).Y = CenY - ctD(I).Y

Next

SortY ZuY '将天体按 Y 坐标排序,数组 ZuY() 返回排序后的天体序号

Picture1.Font.Size = 9: Picture1.ForeColor = &HFFFFFF

wB = Picture1.ScaleWidth * 0.5 - ctBW: hB = Picture1.ScaleHeight * 0.5 - ctBW '可视区大小

If Not ctTrack Then Picture1.Cls '保留轨迹,不擦除上次图像

If ctBW > 0 Then Picture1.Line (-wB, -hB)-(wB, hB), , B '可见区方框,调试代码****

For T = 0 To ctDs '按天体 Y 坐标依次画出各天体

I = ZuY(T) '天体实际编号

X = ctD(I).X: Y = ctD(I).Y: r = ctBi * ctD(I).r

If r

'画一个天体

Call SubGuiDao(I) '画 I 的卫星轨道:上半部分

InD = Not (X + r wB Or Y + r hB) '是否在可见区内

If ctD(I).Visible And InD Then

If ctD(I).IsHui Then Tail I, X, Y '画彗尾

Picture1.FillColor = ctD(I).Se: Picture1.FillStyle = 0 '打开填充

Picture1.Circle (X, Y), r, 0 '画天体

Picture1.FillStyle = 1 '关闭填充

End If

Call SubGuiDao(I, True) '画 I 的卫星轨道:下半部分

'显示天体名称

If ctD(I).ShowCap Then

If I = 0 Then

ShowStr wB, hB, ctD(I).Cap, X, Y - Picture1.TextHeight("A") * 0.5, True, 0

Else

ShowStr wB, hB, ctD(I).Cap, X, Y + r + 3, True

End If

End If

'画运动轨迹:上一个点和当前点的连线:有一个在可见区内

If ctTrack Then

InD1 = Not (ctD(I).xUp + r wB Or ctD(I).yUp + r hB)

If (InD Or InD1) And ctD(I).xUp 0 And ctD(I).yUp 0 Then

If ctBi

Picture1.DrawWidth = 1

End If

End If

'记忆上次位置

ctD(I).xUp = X: ctD(I).yUp = Y

Next

End Sub

Private Sub Tail(I As Long, X As Single, Y As Single)

'画天体 I 的 彗尾

Dim x0 As Single, y0 As Single, S As Single

Dim x1 As Single, y1 As Single, J As Single

'无压缩时的位置

x0 = ctD(I).a * Sin(ctD(I).Jiao): y0 = ctD(I).b * Cos(ctD(I).Jiao)

J = ctBi * Sqr((x0 + ctD(I).c) ^ 2 + y0 ^ 2) '与焦点(即:父天体)距离

S = ctBi * (ctD(I).a - ctD(I).c) ^ 2 / J - (ctD(I).a - ctD(I).c) / 5 '彗发长度:近日距离4/5

If S

S = S * ctBi

If S > Picture1.ScaleWidth Then S = Picture1.ScaleWidth

x1 = ctD(ctD(I).Father).X: y1 = ctD(ctD(I).Father).Y '父天体位置

x1 = S / J * (X - x1): y1 = S / J * (Y - y1)

Picture1.DrawMode = 14: Picture1.DrawWidth = ctD(I).r * 3 * ctBi + 1 Picture1.Line (X, Y)-Step(x1, y1), &H999999

Picture1.Line (X, Y)-Step(x1, y1), &H999999

Picture1.DrawWidth = 1: Picture1.DrawMode = 13

End Sub

Private Sub ShowStr(wB As Single, hB As Single, nStr As String, ByVal X As Single, ByVal Y As Single, Optional CenLR As Boolean, Optional Se As Long = -1)

'显示字符 wB,hB:可见区边界 CenLR = T:左右居中

Dim W As Single, H As Single, nSe As Long

W = Picture1.TextWidth(nStr): H = Picture1.TextHeight(nStr)

If CenLR Then X = X - W * 0.5

If X wB Or Y hB Then Exit Sub

Picture1.CurrentX = X: Picture1.CurrentY = Y: Picture1.Print nStr

If Se = -1 Then Exit Sub

nSe = Picture1.ForeColor: Picture1.ForeColor = Se

Picture1.CurrentX = X + 1: Picture1.CurrentY = Y + 1

Picture1.Print nStr

Picture1.ForeColor = nSe

End Sub

Private Sub SortY(ZuY() As Long)

'将天体按 Y 坐标排序,数组 ZuY() 返回排序后的天体序号

Dim I As Long, J As Long, K As Long, S As Long, y1 As Single

Dim Y() As Single

ReDim Y(0 To ctDs) 'Y() 用于视角为 0 的情况

For I = 0 To ctDs

If ctSeeBi = 0 Then

If ctD(I).Jiao > ctP * 0.5 And ctD(I).Jiao

Y(I) = ctD(I).b

Else

Y(I) = -ctD(I).b

End If

Y(I) = Y(I) + Y(ctD(I).Father) '加上父天体的 Y 坐标

Else

Y(I) = ctD(I).Y

End If

Next

ReDim ZuY(0 To ctDs)

ZuY(0) = 0

For I = 1 To ctDs

y1 = Y(I)

For J = 0 To I - 1

If y1

For K = I - 1 To J Step -1 '下移动已排序数组 J 之后的

ZuY(K + 1) = ZuY(K)

Next

ZuY(J) = I: GoTo Next1

End If

Next

ZuY(I) = I

Next1:

Next

End Sub

Private Sub GetXY(ByVal I As Long, Jiao As Single, CenX As Single, CenY As Single, X As Single, Y As Single)

'获取某天体 I 在 Jiao 位置的绝对位置

'CenX,CenY:父天体的位置

X = CenX - ctBi * (ctD(I).a * Sin(Jiao) + ctD(I).c)

Y = CenY - ctBi * ctSeeBi * ctD(I).b * Cos(Jiao)

End Sub

Private Sub SubGuiDao(I As Long, Optional IsDown As Boolean)

'画天体 I 的卫星轨道的一半

Dim W As Long

For W = 0 To ctDs

If W I And ctD(W).GuiDao And ctD(W).Father = I Then GuiDao W, IsDown Next

End Sub

Private Sub GuiDao(I As Long, Optional IsDown As Boolean)

'画轨道

Dim J As Single, X As Single, Y As Single, CenX As Single, CenY As Single Dim W1 As Single, H1 As Single, xUp As Single, yUp As Single, Is2 As Boolean

Dim InD As Boolean, InUpD As Boolean, J1 As Single, J2 As Single

Picture1.DrawWidth = 1

W1 = Picture1.ScaleWidth * 0.5 - ctBW: H1 = Picture1.ScaleHeight * 0.5 - ctBW

CenX = ctD(ctD(I).Father).X: CenY = ctD(ctD(I).Father).Y '父天体的位置 If IsDown Then

J1 = ctP * 0.5: J2 = ctP * 1.5 '下半部分

Else

J1 = ctP * 1.5: J2 = ctP * 2.5 '上半部分

End If

For J = J1 To J2 Step 0.05

Call GetXY(I, J, CenX, CenY, X, Y)

InD = Not (X W1 Or Y H1) '点1是否在可见区内 If Is2 And (InD Or InUpD) Then Picture1.Line (X, Y)-(xUp, yUp), ctD(I).Se xUp = X: yUp = Y: InUpD = InD: Is2 = True

Next

'末点:将轨道封闭

Call GetXY(I, J2, CenX, CenY, X, Y)

InD = Not (X W1 Or Y H1)

If InD Or InUpD Then Picture1.Line (X, Y)-(xUp, yUp), ctD(I).Se

End Sub

当前位置:首页 > VB 小程序 > 太阳系行星轨道及运行动画演示

太阳系行星轨道及运行

动画演示

本程序对太阳系行星、卫星运行情况进行动画演示。具有以下功能:

1.可单独(或全部)显示或隐藏某个天体、运行轨道、天体名称。

2.可调节演示速度、画面比列、观察角度(从天球赤道到天球北极观察太阳系)。

3.可将某个天体(例如月亮)设置为屏幕中间静止不动的天体,观察其他天体相对于该天体运行的情况。

本程序改进版见:太阳系行星轨道及运行-3D立体动画演示

通过设置不同的参数,可得到许多美丽而奇妙的图案,如下:

'需在窗体放置以下 3 个控件,所有控件均采用默认设置:

' Picture1,Command1,Timer1

' 注意:在属性窗口将 Command1 的 Index 属性设置为 0

'其次,为窗体添加一个名为 mFast 的菜单,再为 mFast 添加一个名为 mmFast 的下级子菜单,并将 mmFast 的索引设置为 0。

' 即:mmFast 是以序号 0 开头的菜单数组控件的第一个。

'以下是窗体代码,在 VB6.0 调试通过:

Dim ctD() As tyD, ctDs As Long, ctP As Single, ctCenter As Long

Dim ctBi As Single, ctV As Single, ctTrack As Boolean, ctBW As Long Dim ctSeeJ As Long, ctSeeBi As Single, ctSet As MenuSet

'定义表示天体的数据类型

Private Type tyD

Cap As String '天体名称

r As Long '天体半径(像素,下同)

a As Single '轨道:横半径

b As Single '轨道:纵半径

c As Single '轨道:焦点

e As Single '轨道:偏心率

IsHui As Boolean '是否彗星

Father As Long '父天体序号:轨道焦点上的天体

Se As Long '颜色

V As Single '运行角速度

Jiao As Single '某时刻的与父天体连线角度

X As Single '天体当前坐标

Y As Single

xUp As Single '上一时刻坐标

yUp As Single

Visible As Boolean '是否显示:球体

ShowCap As Boolean '是否显示:标题

GuiDao As Boolean '是否显示:轨道

End Type

Enum MenuSet

'以下为选项菜单标示

ms_All = -2

ms_NoAll = -1

'以下为按钮标示

ms_RunStop = 0 '开始/暂停

ms_Step '步进,下一位置

ms_UnRun '后退

ms_Track '轨迹:显示/隐藏

ms_DefSet '默认设置

ms_Center '参照系

ms_Visible '天体:显示/隐藏

ms_ShowCap '天体名称

ms_GuiDao '轨道

ms_Bi '缩放比

ms_V '速度

ms_SeeJ '视角

End Enum

Private Sub Form_Load()

Me.ScaleMode = 3: Me.Caption = "太阳系行星运行演示"

mFast.Visible = False: ctP = 3.1415926

Timer1.Interval = 25: Timer1.Enabled = True

Call Init

'Me.WindowState = vbMaximized '最大化窗体

'窗体大小为屏幕的 3/4,居中

Me.Move Screen.Width * 0.1, Screen.Height * 0.1, Screen.Width * 0.8, Screen.Height * 0.8

End Sub

Private Sub Form_Resize()

Dim I As Long, L As Single, T As Single, H As Single, H1 As Single, W As Single

'设置控件位置

H1 = Me.TextHeight("A"): L = H1 * 0.3: T = L

L = 3

For I = 0 To Command1.Count - 1

W = Me.TextWidth(Command1(I).Caption & "ab")

Command1(I).Move L, T, W, H1 * 2

L = L + W + 3

Next

T = T * 2 + Command1(0).Height: H = Me.ScaleHeight - T

If H > 0 Then Picture1.Move 0, T, Me.ScaleWidth, H

'将 Picture1 的中心设置为坐标原点

Picture1.ScaleMode = 3

Picture1.ScaleLeft = -Picture1.ScaleWidth * 0.5

Picture1.ScaleTop = -Picture1.ScaleHeight * 0.5

Picture1.Cls

Call Run1

End Sub

Private Sub Init()

'初始化天体参数

Dim I As Long, V As Single, J As Single

ctBW = 0 ' 40 '四周边界空白区,仅用于调试。调试完毕应设为 0 。调试代码**** Picture1.AutoRedraw = True

Picture1.BackColor = &H220000 '&HFFFFFF '

ctCenter = 0: ctBi = 1: ctV = 1 '参照系(位于中心的天体),缩放比列,速度 ctSeeJ = 30: ctSeeBi = ctSeeJ / 90 '视点角度,视角比

ctTrack = False '不显示运动轨迹(不是轨道)

'添加按钮

KjCls Command1

KjAdd Command1, "始/停(&K)", ms_RunStop, "天体的运动状态:开始/暂停" KjAdd Command1, "进(&J)", ms_Step, "步进,运行到下一位置"

KjAdd Command1, "退(&T)", ms_UnRun, "步进,后退到上一位置"

KjAdd Command1, "迹(&A)", ms_Track, "运动轨迹:显示/隐藏"

KjAdd Command1, "默(&D)", ms_DefSet, "将所有参数恢复为默认设置"

KjAdd Command1, "参照系(&C)", ms_Center, "设置参照系(位于中心的天体)"

KjAdd Command1, "天体(&X)", ms_Visible, "天体:显示/隐藏"

KjAdd Command1, "名称(&M)", ms_ShowCap, "天体名称:显示/隐藏" KjAdd Command1, "轨道(&G)", ms_GuiDao, "天体运行轨道:显示/隐藏" KjAdd Command1, "速度(&V)", ms_V, "设置速度"

KjAdd Command1, "视角(&L)", ms_SeeJ, "设置视点角度"

KjAdd Command1, "缩放(&S)", ms_Bi, "设置缩放比列"

'添加天体(演示比列状态下),半径以 100 像素为标准

'参数依次是:名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否

ctDs = -1: ReDim ctD(0)

AddCircle "太阳", "", 22, 2, 0, ctP * 0.008, RGB(255, 200, 0)

AddCircle "水星", "", 5, 0.5, 0.206, ctP * 0.03, &H999999

AddCircle "金星", "", 9, 0.8, 0.0068, ctP * 0.018, &H55AAAA

AddCircle "地球", "", 10, 1.2, 0.0167, ctP * 0.01, RGB(0, 0, 255)

AddCircle "月亮", "地球", 4, 0.2, 0, ctP * 0.06, &H888888

AddCircle "嫦娥1号", "月亮", 2, 0.06, 0, ctP * 0.12, &HCCCCCC

AddCircle "火星", "", 6, 1.8, 0.093, ctP * 0.005, &H1155FF

AddCircle "火卫1", "火星", 3, 0.1, 0, ctP * 0.1, &HFFFF00, ctP * 2 * 0.3 AddCircle "火卫2", "火星", 3, 0.15, 0, ctP * 0.1, &H7777FF, ctP * 2 * 0.7 AddCircle "木星", "", 16, 3, 0.0483, ctP * 0.003, &HEEDDCC

AddCircle "木卫1", "木星", 2, 0.25, 0, ctP * 0.05, &H883487, ctP * 2 * 0.2 AddCircle "木卫2", "木星", 2, 0.3, 0, ctP * 0.035, &H348888, ctP * 2 * 0.4 AddCircle "木卫3", "木星", 3, 0.35, 0, ctP * 0.03, &HAA34CC, ctP * 2 * 0.6 AddCircle "木卫4", "木星", 4, 0.45, 0, ctP * 0.02, &H888888, ctP * 2 * 0.8 AddCircle "土星", "", 14, 5, 0.056, ctP * 0.002, &H5599FF

AddCircle "土卫6", "土星", 4, 0.25, 0, ctP * 0.055, &H99EEEE

AddCircle "天王星", "", 12, 6.5, 0.0461, ctP * 0.0015, &HFFCCCC

AddCircle "天卫3", "天王星", 3, 0.2, 0, ctP * 0.05, &H33FF88, ctP * 2 * 0.5 AddCircle "天卫4", "天王星", 3, 0.3, 0, ctP * 0.035, &HFF3311, ctP * 2 * 0.8 AddCircle "海王星", "", 12, 9, 0.0097, ctP * 0.001, &HFF7766

AddCircle "海卫1", "海王星", 3, 0.25, 0, -ctP * 0.03, &H882388

AddCircle "哈雷彗星", "", 2, 5.5, 0.83, ctP * 0.0012, &H777777, ctP * 1, True Call Form_Resize

End Sub

Private Sub Command1_Click(Index As Integer)

Dim I As Long, J As Long, nStr As String, Zu As Variant

Dim nSel As Long, nAll As Long, nNo As Long

ctSet = Val(Command1(Index).Tag) '得到按钮标示

KjCls mmFast '清除菜单

'装载快捷菜单,并勾选选定项目

Select Case ctSet

Case ms_DefSet: Call Init: Run1: Exit Sub '默认设置

Case ms_RunStop: Timer1.Enabled = Not Timer1.Enabled: Exit Sub '开始/暂停

Case ms_Track: ctTrack = Not ctTrack: Picture1.Cls: Call Run1 '保留运动轨迹

Case ms_Step '步进,前进到下一位置

If Not Timer1.Enabled Then Run1 True

Timer1.Enabled = False

Case ms_UnRun '步进,后退到下一位置

If Not Timer1.Enabled Then Run1 True, True

Timer1.Enabled = False

Case ms_Bi '缩放比列

Zu = Array(0.1, 0.2, 0.3, 0.4, "-", 0.5, 0.6, 0.7, 0.8, 0.9, "-", 1, 1.2, 1.5, 1.8, 2, 3, 5, 8, 10)

KjAddZu mmFast, Zu, ctBi, " 倍": GoTo Show1 '添加数组菜单,并勾选 ctBi Case ms_SeeJ '视点角度

Zu = Array("90 度(天球北极)", "80 度", "70 度", "60 度", "50 度", "45 度", "40 度", "30 度", "20 度", "15 度", "10 度", "5 度", "0 度(天球赤道)")

KjAddZu mmFast, Zu, ctSeeJ: GoTo Show1 '添加数组菜单,并勾选 ctSeeJ Case ms_V '速度

Zu = Array(0.1, 0.2, 0.3, 0.4, "-", 0.5, 0.6, 0.7, 0.8, 0.9, "-", 1, 1.5, 2, 2.5, 3, 4, 5,

7.5, 10)

KjAddZu mmFast, Zu, ctV, " 倍": GoTo Show1

Case Else '装载天体名称

For I = 0 To ctDs

J = Ji(I) '天体 I 的级别

KjAdd mmFast, "&" & I & " " & String(J * 2, " ") & ctD(I).Cap

Next

End Select

'勾选选定天体

Select Case ctSet

Case ms_Center: mmFast(ctCenter).Checked = True: GoTo Show1 '参照系(中心天体)

Case ms_ShowCap '显示天体名称

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).ShowCap: Next

Case ms_Visible '天体 是否可见

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).Visible: Next

Case ms_GuiDao '轨道

For I = 0 To ctDs: mmFast(I).Checked = ctD(I).GuiDao: Next

Case Else: Exit Sub

End Select

KjAdd mmFast, "-"

nAll = KjAdd(mmFast, "全选", ms_All)

nNo = KjAdd(mmFast, "全不选", ms_NoAll)

For I = 0 To ctDs

If mmFast(I).Checked Then nSel = nSel + 1

Next

If nSel = 0 Then mmFast(nNo).Checked = True: mmFast(nNo).Enabled = False

If nSel = ctDs + 1 Then mmFast(nAll).Checked = True: mmFast(nAll).Enabled = False

Show1:

Command1(Index).BackColor = &HFFCCCC '将选中按钮设置为淡蓝色 Me.PopupMenu mFast, , Command1(Index).Left, Command1(Index).Top + Command1(Index).Height - 3

Command1(Index).BackColor = Me.BackColor

End Sub

Private Sub mmFast_Click(Index As Integer)

'通过快捷菜单设置天体有关参数

Dim nTag As MenuSet, I As Long, TF As Boolean

nTag = Val(mmFast(Index).Tag) '菜单标示:ms_All 全选,ms_NoAll 全不选

Select Case ctSet 'ctSet:按钮标示,在 Command1_Click 中设置 Case ms_V '速度

ctV = Val(mmFast(Index).Caption)

Case ms_SeeJ '视点角度

ctSeeJ = Val(mmFast(Index).Caption) '视点角度

ctSeeBi = ctSeeJ / 90 '视角比

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_Bi '缩放比列

ctBi = Val(mmFast(Index).Caption)

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_Center '参照系(中心天体)

ctCenter = Index

For I = 0 To ctDs: ctD(I).xUp = 0: ctD(I).yUp = 0: Next

Case ms_ShowCap '显示名称

If Index

ctD(Index).ShowCap = Not ctD(Index).ShowCap

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).ShowCap = TF: Next

End If

Case ms_Visible '天体 是否可见

If Index

ctD(Index).Visible = Not ctD(Index).Visible

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).Visible = TF: Next

End If

Case ms_GuiDao '轨道

If Index

ctD(Index).GuiDao = Not ctD(Index).GuiDao

Else

TF = nTag = ms_All

For I = 0 To ctDs: ctD(I).GuiDao = TF: Next

End If

End Select

Picture1.Cls

Call Run1

End Sub

Private Sub AddCircle(nName As String, nFather As String, r As Long, a As Single, e As Single, V As Single, _

Optional Se As Long = 255, Optional Jiao As Single, Optional IsHui As Boolean)

'添加一个天体,参数依次是:

' 名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否

Dim I As Long, J As Long

a = a * 100 '半径以 100 像素为标准

ctDs = ctDs + 1: ReDim Preserve ctD(ctDs)

'设置父天体编号

For I = 0 To ctDs - 1

If LCase(ctD(I).Cap) = LCase(nFather) Then ctD(ctDs).Father = I: Exit For Next

ctD(ctDs).Cap = nName: ctD(ctDs).r = r: ctD(ctDs).a = a

ctD(ctDs).c = a * e: ctD(ctDs).b = Sqr(a ^ 2 - ctD(ctDs).c ^ 2)

ctD(ctDs).IsHui = IsHui: ctD(ctDs).V = V: ctD(ctDs).Se = Se

ctD(ctDs).xUp = 0: ctD(ctDs).yUp = 0: ctD(ctDs).Visible = True ctD(ctDs).GuiDao = True

Randomize

If Jiao = 0 Then ctD(ctDs).Jiao = Rnd * ctP * 2 Else ctD(ctDs).Jiao = Jiao End Sub

Private Function KjAddZu(Kj, Zu As Variant, ByVal CheckStr As String, Optional SameStr As String)

'添加一个数组菜单,并勾选标题为 CheckStr 的条目

Dim I As Long, J As Long, nCap As String

If Left(CheckStr, 1) = "." Then CheckStr = "0" & CheckStr

For I = LBound(Zu) To UBound(Zu)

nCap = Zu(I)

If Left(nCap, 1) = "." Then nCap = "0" & nCap

If nCap = "-" Then J = KjAdd(Kj, nCap) Else J = KjAdd(Kj, nCap & SameStr) ' If LCase(CheckStr) = LCase(nCap) Then Kj(J).Checked = True

If Val(CheckStr) = Val(nCap) Then Kj(J).Checked = True

Next

End Function

Private Function KjAdd(Kj, nCap As String, Optional nTag As String, Optional nNote As String) As Long

'为数组控件添加一个成员,返回新添加的成员序号

Dim I As Long

I = Kj.Count - 1

If Kj(I).Caption "" Then I = I + 1: Load Kj(I)

On Error Resume Next

Kj(I).Checked = False

Kj(I).Caption = nCap

Kj(I).Tag = nTag

Kj(I).ToolTipText = nNote

Kj(I).Visible = True

KjAdd = I

End Function

Private Function KjCls(Kj) As Long

'卸载数组控件的所有成员(0号除外)

Dim I As Long

For I = Kj.Count - 1 To 1 Step -1

Unload Kj(I)

Next

On Error Resume Next

Kj(0).Caption = ""

Kj(0).Checked = False

End Function

Private Function CapToNum(nCap As String) As Long

'返回名称为 nCap 的天体编号

Dim I As Long

For I = 0 To ctDs

If LCase(ctD(I).Cap) = LCase(nCap) Then CapToNum = I: Exit Function Next

CapToNum = -1

End Function

Private Function Ji(ByVal D As Long) As Long

'返回天体级别(编号为 D )

Do

If ctD(D).Father = 0 Then Exit Do

D = ctD(D).Father: Ji = Ji + 1

Loop

End Function

Private Sub Timer1_Timer()

Run1 True

End Sub

Private Sub Run1(Optional nRun As Boolean, Optional UnRun As Boolean) '显示一次运行的瞬时状态

Dim wB As Single, hB As Single, X As Single, Y As Single, ZuY() As Long Dim I As Long, T As Long, Se As Long, r As Single

Dim CenX As Single, CenY As Single, InD As Boolean, InD1 As Boolean

'计算天体瞬时位置:相对与父天体的角度

For I = 0 To ctDs

If nRun Then

If UnRun Then X = ctD(I).Jiao - ctD(I).V * ctV Else X = ctD(I).Jiao + ctD(I).V * ctV

'保证数值在 0 到 ctP*2 的范围内

If X > ctP * 2 Then X = X - ctP * 2

If X

ctD(I).Jiao = X

End If

' If I = CapToNum("地球") Then Me.Caption = ctD(I).Jiao / ctP * 180 '调试代码****

ctD(I).X = ctBi * (ctD(I).a * Sin(ctD(I).Jiao) + ctD(I).c)

ctD(I).Y = ctBi * ctSeeBi * (ctD(I).b * Cos(ctD(I).Jiao))

'加上父天体的位置

ctD(I).X = ctD(I).X + ctD(ctD(I).Father).X: ctD(I).Y = ctD(I).Y +

ctD(ctD(I).Father).Y

Next

'移位参照系

CenX = ctD(ctCenter).X: CenY = ctD(ctCenter).Y '中心天体位置

For I = 0 To ctDs

ctD(I).X = CenX - ctD(I).X: ctD(I).Y = CenY - ctD(I).Y

Next

SortY ZuY '将天体按 Y 坐标排序,数组 ZuY() 返回排序后的天体序号

Picture1.Font.Size = 9: Picture1.ForeColor = &HFFFFFF

wB = Picture1.ScaleWidth * 0.5 - ctBW: hB = Picture1.ScaleHeight * 0.5 - ctBW '可视区大小

If Not ctTrack Then Picture1.Cls '保留轨迹,不擦除上次图像

If ctBW > 0 Then Picture1.Line (-wB, -hB)-(wB, hB), , B '可见区方框,调试代码****

For T = 0 To ctDs '按天体 Y 坐标依次画出各天体

I = ZuY(T) '天体实际编号

X = ctD(I).X: Y = ctD(I).Y: r = ctBi * ctD(I).r

If r

'画一个天体

Call SubGuiDao(I) '画 I 的卫星轨道:上半部分

InD = Not (X + r wB Or Y + r hB) '是否在可见区内

If ctD(I).Visible And InD Then

If ctD(I).IsHui Then Tail I, X, Y '画彗尾

Picture1.FillColor = ctD(I).Se: Picture1.FillStyle = 0 '打开填充

Picture1.Circle (X, Y), r, 0 '画天体

Picture1.FillStyle = 1 '关闭填充

End If

Call SubGuiDao(I, True) '画 I 的卫星轨道:下半部分

'显示天体名称

If ctD(I).ShowCap Then

If I = 0 Then

ShowStr wB, hB, ctD(I).Cap, X, Y - Picture1.TextHeight("A") * 0.5, True, 0

Else

ShowStr wB, hB, ctD(I).Cap, X, Y + r + 3, True

End If

End If

'画运动轨迹:上一个点和当前点的连线:有一个在可见区内

If ctTrack Then

InD1 = Not (ctD(I).xUp + r wB Or ctD(I).yUp + r hB)

If (InD Or InD1) And ctD(I).xUp 0 And ctD(I).yUp 0 Then

If ctBi

Picture1.DrawWidth = 1

End If

End If

'记忆上次位置

ctD(I).xUp = X: ctD(I).yUp = Y

Next

End Sub

Private Sub Tail(I As Long, X As Single, Y As Single)

'画天体 I 的 彗尾

Dim x0 As Single, y0 As Single, S As Single

Dim x1 As Single, y1 As Single, J As Single

'无压缩时的位置

x0 = ctD(I).a * Sin(ctD(I).Jiao): y0 = ctD(I).b * Cos(ctD(I).Jiao)

J = ctBi * Sqr((x0 + ctD(I).c) ^ 2 + y0 ^ 2) '与焦点(即:父天体)距离

S = ctBi * (ctD(I).a - ctD(I).c) ^ 2 / J - (ctD(I).a - ctD(I).c) / 5 '彗发长度:近日距离4/5

If S

S = S * ctBi

If S > Picture1.ScaleWidth Then S = Picture1.ScaleWidth

x1 = ctD(ctD(I).Father).X: y1 = ctD(ctD(I).Father).Y '父天体位置

x1 = S / J * (X - x1): y1 = S / J * (Y - y1)

Picture1.DrawMode = 14: Picture1.DrawWidth = ctD(I).r * 3 * ctBi + 1 Picture1.Line (X, Y)-Step(x1, y1), &H999999

Picture1.Line (X, Y)-Step(x1, y1), &H999999

Picture1.DrawWidth = 1: Picture1.DrawMode = 13

End Sub

Private Sub ShowStr(wB As Single, hB As Single, nStr As String, ByVal X As Single, ByVal Y As Single, Optional CenLR As Boolean, Optional Se As Long = -1)

'显示字符 wB,hB:可见区边界 CenLR = T:左右居中

Dim W As Single, H As Single, nSe As Long

W = Picture1.TextWidth(nStr): H = Picture1.TextHeight(nStr)

If CenLR Then X = X - W * 0.5

If X wB Or Y hB Then Exit Sub

Picture1.CurrentX = X: Picture1.CurrentY = Y: Picture1.Print nStr

If Se = -1 Then Exit Sub

nSe = Picture1.ForeColor: Picture1.ForeColor = Se

Picture1.CurrentX = X + 1: Picture1.CurrentY = Y + 1

Picture1.Print nStr

Picture1.ForeColor = nSe

End Sub

Private Sub SortY(ZuY() As Long)

'将天体按 Y 坐标排序,数组 ZuY() 返回排序后的天体序号

Dim I As Long, J As Long, K As Long, S As Long, y1 As Single

Dim Y() As Single

ReDim Y(0 To ctDs) 'Y() 用于视角为 0 的情况

For I = 0 To ctDs

If ctSeeBi = 0 Then

If ctD(I).Jiao > ctP * 0.5 And ctD(I).Jiao

Y(I) = ctD(I).b

Else

Y(I) = -ctD(I).b

End If

Y(I) = Y(I) + Y(ctD(I).Father) '加上父天体的 Y 坐标

Else

Y(I) = ctD(I).Y

End If

Next

ReDim ZuY(0 To ctDs)

ZuY(0) = 0

For I = 1 To ctDs

y1 = Y(I)

For J = 0 To I - 1

If y1

For K = I - 1 To J Step -1 '下移动已排序数组 J 之后的

ZuY(K + 1) = ZuY(K)

Next

ZuY(J) = I: GoTo Next1

End If

Next

ZuY(I) = I

Next1:

Next

End Sub

Private Sub GetXY(ByVal I As Long, Jiao As Single, CenX As Single, CenY As Single, X As Single, Y As Single)

'获取某天体 I 在 Jiao 位置的绝对位置

'CenX,CenY:父天体的位置

X = CenX - ctBi * (ctD(I).a * Sin(Jiao) + ctD(I).c)

Y = CenY - ctBi * ctSeeBi * ctD(I).b * Cos(Jiao)

End Sub

Private Sub SubGuiDao(I As Long, Optional IsDown As Boolean)

'画天体 I 的卫星轨道的一半

Dim W As Long

For W = 0 To ctDs

If W I And ctD(W).GuiDao And ctD(W).Father = I Then GuiDao W, IsDown Next

End Sub

Private Sub GuiDao(I As Long, Optional IsDown As Boolean)

'画轨道

Dim J As Single, X As Single, Y As Single, CenX As Single, CenY As Single Dim W1 As Single, H1 As Single, xUp As Single, yUp As Single, Is2 As Boolean

Dim InD As Boolean, InUpD As Boolean, J1 As Single, J2 As Single

Picture1.DrawWidth = 1

W1 = Picture1.ScaleWidth * 0.5 - ctBW: H1 = Picture1.ScaleHeight * 0.5 - ctBW

CenX = ctD(ctD(I).Father).X: CenY = ctD(ctD(I).Father).Y '父天体的位置 If IsDown Then

J1 = ctP * 0.5: J2 = ctP * 1.5 '下半部分

Else

J1 = ctP * 1.5: J2 = ctP * 2.5 '上半部分

End If

For J = J1 To J2 Step 0.05

Call GetXY(I, J, CenX, CenY, X, Y)

InD = Not (X W1 Or Y H1) '点1是否在可见区内 If Is2 And (InD Or InUpD) Then Picture1.Line (X, Y)-(xUp, yUp), ctD(I).Se xUp = X: yUp = Y: InUpD = InD: Is2 = True

Next

'末点:将轨道封闭

Call GetXY(I, J2, CenX, CenY, X, Y)

InD = Not (X W1 Or Y H1)

If InD Or InUpD Then Picture1.Line (X, Y)-(xUp, yUp), ctD(I).Se

End Sub

当前位置:首页 > VB 小程序 > 太阳系行星轨道及运行动画演示


相关内容

  • 行星的运动导学案
  • 文萃中学高一物理研学稿 主备人:朱锋 审稿人:王礼义 闫登峰 §6.2行星的运动导学案 一.导入明标 [学习目标] (1)了解地心说和日心说. (2)知道开普勒行星三大运动定律的内容. (3)理解开普勒行星运动定律内容,能用定律解决相关问题. 重点:开普勒行星三大运动定律 难点:对开普勒行星运动定律 ...

  • 开普勒第一.二.三定律
  • 开普勒第一定律 开普勒第一定律,也称椭圆定律.轨道定律.行星定律.每一行星沿一个椭圆轨道环绕太阳,而太阳则处在椭圆的一个焦点上.开普勒第一定律是由德国天文学家约翰尼斯·开普勒提出的.在此定律以前,人们认为天体的运行轨道是: "完美的圆形". 1定律定义 开普勒在<宇宙和谐论 ...

  • 61行星的运动
  • 6.1行星的运动 1.下列说法正确的是( ) A. 地球是宇宙的中心,太阳.月亮及其他行星都绕地球运动 B. 太阳是宇宙的中心,所有天体都绕太阳运动 C. 太阳是静止不动,地球和其他行星都绕太阳运动 D. "地心说"和哥白尼提出的"日心说"现在看来都是不正确的 ...

  • 行星的运动学案
  • 6.1行星的运动 姓名: 小组: 分层: [学习目标] 1.(AB)知道地心说和日心说的基本内容. 2.(AB)知道所有行星绕太阳运动的轨道都是椭圆,太阳处在椭圆的一个焦点上. 3.(AB)知道所有行星的轨道的半长轴的三次方跟它的公转周期的二次方的比值 都相等,且这个比值与行星的质量无关,但与太阳的 ...

  • 万有引力与航天单元测试题1
  • 万有引力与航天单元测试题1 一.选择题(每小题5分,共50分) 1.下列说法符合史实的是( ) A.牛顿发现了行星的运动规律 B.开普勒发现了万有引力定律 C.卡文迪许第一次在实验室里测出了万有引力常量 D.牛顿发现了海王星和冥王星 ( ) 2.下列说法正确的是 A.第一宇宙速度是人造卫星环绕地球运 ...

  • 高一物理万有引力与航天(2)
  • 1.关于日心说被人们接受的原因是 ( )A.太阳总是从东面升起,从西面落下B.若以地球为中心来研究的运动有很多无法解决的问题 C.若以太阳为中心许多问题都可以解决,对行星的描述也变得简单D.地球是围绕太阳运转的 2.有关开普勒关于行星运动的描述,下列说法中正确的是( ) A所有的行星绕太阳运动的轨道 ...

  • 开普勒三大定律和万有引力定律
  • 开普勒三大定律和万有引力定律 一.开普勒三定律 1.开普勒第一定律:所有行星绕太阳运动的轨道都是椭圆_,太阳处在椭圆的一个焦点_上. 2.开普勒第二定律:对任意一个行星来说,它与太阳的连线在相同的时间内扫过相等的面积. 3.开普勒第三定律:所有行星的轨道的半长轴的三次方跟它的周期的平方的比值都相等, ...

  • 开普勒行星运动定律
  • 高中物理必修2 第一节 行星的运动导学提纲 [自主学思] 一.地心说与日心说 1.地心说 是宇宙的中心,且是静止不动的,太阳.月亮以及其他行星都绕运动. 2.日心说 是宇宙的中心,且是静止不动的,地球和其他行星都绕运动. 3.两种学说的局限性 两种学说都认为天体的运动必然是最完美.最和谐的运动,而这 ...

  • 高中物理--万有引力部分
  • 2012版物理讲义 主编 佟争 绝密私自翻印必追究责任 万有引力高考讲义 一.开普勒定律 1.开普勒第一定律 2.开普勒第二定律 3.开普勒第三定律 二.万有引力与圆周运动 2012版物理讲义 主编 佟争 私自翻印必追究责任 1.第一宇宙速度 2.第二宇宙速度 3.第三宇宙速度 四.人造卫星 1.近 ...

  • 卫星是指在围绕行星轨道上运行的
  • 卫星是指在围绕行星轨道上运行的天然天体或人造天体. (1) 彗星是太阳系中天体的残骸.它和一般的星星不一样,是由气体和冰粒组成的.彗星也围绕着太阳运动,但跟地球绕太阳运行的轨道是不一样的. (2)彗星是星际间物质,俗称"扫把星".在<天文略论>这本书中写道:彗星为怪异 ...