太阳系行星轨道及运行_第1页
太阳系行星轨道及运行_第2页
太阳系行星轨道及运行_第3页
太阳系行星轨道及运行_第4页
太阳系行星轨道及运行_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

太阳系行星轨道及运行动画演示本程序对太阳系行星、卫星运行情况进行动画演示。具有以下功能:可单独(或全部)显示或隐藏某个天体、运行轨道、天体名称。可调节演示速度、画面比列、观察角度(从天球赤道到天球北极观察太阳系)。可将某个天体(例如月亮)设置为屏幕中间静止不动的天体,观察其他天体相对于该天体运行的情况。本程序改进版见:太阳系行星轨道及运行-3D立体动画演示通过设置不同的参数,可得到许多美丽而奇妙的图案,如下:

'需在窗体放置以下3个控件,所有控件均采用默认设置:'Picturel,Commandl,Timerl'注意:在属性窗口将Commandl的Index属性设置为0'其次,为窗体添加一个名为mFast的菜单,再为mFast添加一个名为mmFast的下级子菜单,并将mmFast的索引设置为0。,艮即mmFast是以序号0开头的菜单数组控件的第一个。'以下是窗体代码,在VB6.0调试通过:DimctD()AstyD,ctDsAsLong,ctPAsSingle,ctCenterAsLongDimctBiAsSingle,ctVAsSingle,ctTrackAsBoolean,ctBWAsLongDimctSeeJAsLong,ctSeeBiAsSingle,ctSetAsMenuSet'定义表示天体的数据类型PrivateTypetyDCapAsString'天体名称rAsLong '天体半径(像素,下同)aAsSingle '轨道:横半径bAsSingle 轨道:纵半径cAsSingle 轨道:焦点eAsSingle 轨道:偏心率IsHuiAsBoolean'是否彗星FatherAsLong'父天体序号:轨道焦点上的天体SeAsLong '颜色AsSingle '运行角速度JiaoAsSingle'某时刻的与父天体连线角度XAsSingle '天体当前坐标AsSinglexUpAsSingle '上一时刻坐标yUpAsSingleVisibleAsBoolean'是否显示:球体ShowCapAsBoolean'是否显示:标题GuiDaoAsBoolean'是否显示:轨道EndTypeEnumMenuSet'以下为选项菜单标示ms_All=-2ms_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'视角EndEnumPrivateSubForm_Load()Me.ScaleMode=3:Me.Caption="太阳系行星运行演示mFast.Visible=False:ctP=3.1415926Timerl.Interval=25:Timerl.Enabled=TrueCallInit'Me.WindowState=vbMaximized'最大化窗体'窗体大小为屏幕的3/4,居中Me.MoveScreen.Width*0.1,Screen.Height*0.1,Screen.Width*0.8,Screen.Height*0.8EndSubPrivateSubForm_Resize()DimIAsLong,LAsSingle,TAsSingle,HAsSingle,H1AsSingle,WAsSingle'设置控件位置H1=Me.TextHeight("A"):L=H1*0.3:T=LL=3ForI=0ToCommand1.Count-1W=Me.TextWidth(Command1(I).Caption&"ab")Command1(I).MoveL,T,W,H1*2L=L+W+3NextT=T*2+Command1(0).Height:H=Me.ScaleHeight-TIfH>0ThenPicture1.Move0,T,Me.ScaleWidth,H'将Picture1的中心设置为坐标原点Picture1.ScaleMode=3Picture1.ScaleLeft=-Picture1.ScaleWidth*0.5Picture1.ScaleTop=-Picture1.ScaleHeight*0.5Picture1.ClsCallRun1EndSubPrivateSubInit()'初始化天体参数DimIAsLong,VAsSingle,JAsSinglectBW=0'40'四周边界空白区,仅用于调试。调试完毕应设为0。调试代码****Picture1.AutoRedraw=TruePicture1.BackColor=&H220000'&HFFFFFF'ctCenter=0:ctBi=1:ctV=1'参照系(位于中心的天体),缩放比列,速度ctSeeJ=30:ctSeeBi=ctSeeJ/90'视点角度,视角比ctTrack=False'不显示运动轨迹(不是轨道)'添加按钮KjClsCommand1KjAddCommand1,"始/停(&K)”,ms_RunStop,”天体的运动状态:开始/暂停”KjAddCommand1,”进(&J)”,ms_Step,"步进,运行到下一位置”KjAddCommandl,"退(&T)",ms_UnRun,"步进,后退到上一位置"KjAddCommandl,"迹(&A)",ms_Track,"运动轨迹:显示/隐藏"KjAddCommand1,"默(&D)",ms_DefSet,"将所有参数恢复为默认设置"KjAddCommand1,"参照系(&C)",ms_Center,"设置参照系(位于中心的天体)"KjAddCommand1,"天体(&X)",ms_Visible,"天体:显示/隐藏"KjAddCommand1,"名称(&M)",ms_ShowCap,"天体名称:显示/隐藏"KjAddCommand1,"轨道(&G)",ms_GuiDao,"天体运行轨道:显示/隐藏"KjAddCommand1,"速度(&V)",ms_V,"设置速度"KjAddCommand1,"视角(&L)",ms_SeeJ,"设置视点角度"KjAddCommand1,"缩放(&S)",ms_Bi,"设置缩放比列"'添加天体(演示比列状态下),半径以100像素为标准'参数依次是:名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否ctDs=-1:ReDimctD(0)AddCircle”太阳”,二22,2,0,ctP*0.008,RGB(255,200,0)AddCircle”水星","",5,0.5,0.206,ctP*0.03,&H999999AddCircle”金星”,二9,0.8,0.0068,ctP*0.018,&H55AAAAAddCircle”地球”,二10,1.2,0.0167,ctP*0.01,RGB(0,0,255)AddCircle”月亮”,”地球”,4,0.2,0,ctP*0.06,&H888888AddCircle”嫦娥1号”,”月亮”,2,0.06,0,ctP*0.12,&HCCCCCCAddCircle”火星”,二6,1.8,0.093,ctP*0.005,&H1155FFAddCircle”火卫1",”火星”,3,0.1,0,ctP*0.1,&HFFFF00,ctP*2*0.3AddCircle”火卫2”,”火星”,3,0.15,0,ctP*0.1,&H7777FF,ctP*2*0.7AddCircle"木星","",16,3,0.0483,ctP*0.003,&HEEDDCCTOC\o"1-5"\h\zAddCircle”木卫 1”,”木星”,2,0.25, 0, ctP *0.05, &H883487, ctP *2* 0.2AddCircle”木卫 2”,”木星”,2,0.3,0,ctP* 0.035, &H348888, ctP *2* 0.4AddCircle”木卫 3",”木星”,3,0.35, 0, ctP *0.03, &HAA34CC,ctP*2 *0.6AddCircle”木卫 4",”木星”,4,0.45, 0, ctP *0.02, &H888888, ctP *2* 0.8AddCircle"土星","",14,5,0.056,ctP*0.002,&H5599FFAddCircle”土卫6",”土星”,4,0.25,0,ctP*0.055,&H99EEEEAddCircle”天王星”,"",12,6.5,0.0461,ctP*0.0015,&HFFCCCCAddCircle”天卫3",”天王星”,3,0.2,0,ctP*0.05,&H33FF88,ctP*2*0.5AddCircle”天卫4",”天王星”,3,0.3,0,ctP*0.035,&HFF3311,ctP*2*0.8AddCircle”海王星”,"",12,9,0.0097,ctP*0.001,&HFF7766AddCircle”海卫1”,”海王星”,3,0.25,0,-ctP*0.03,&H882388AddCircle”哈雷彗星”,"",2,5.5,0.83,ctP*0.0012,&H777777,ctP*1,TrueCallForm_ResizeEndSubPrivateSubCommand1_Click(IndexAsInteger)DimIAsLong,JAsLong,nStrAsString,ZuAsVariantDimnSelAsLong,nAllAsLong,nNoAsLongctSet=Val(Command1(Index).Tag)'得到按钮标示KjClsmmFast '清除菜单'装载快捷菜单,并勾选选定项目SelectCasectSetCasems_DefSet:CallInit:Run1:ExitSub '默认设置Casems_RunStop:Timer1.Enabled=NotTimer1.Enabled:ExitSub'开始/暂停Casems_Track:ctTrack=NotctTrack:Picture1.Cls:CallRun1'保留运动轨迹Casems_Step'步进,前进到下一位置IfNotTimer1.EnabledThenRun1TrueTimer1.Enabled=FalseCasems_UnRun'步进,后退到下一位置IfNotTimer1.EnabledThenRun1True,TrueTimer1.Enabled=FalseCasems_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)KjAddZummFast,Zu,ctBi,"倍":GoToShow1'添加数组菜单,并勾选ctBiCasems_SeeJ'视点角度Zu=Array("90度(天球北极)","80度","70度","60度","50度","45度","40度”,"30度”,"20度”,"15度”,"10度”,"5度”,"0度(天球赤道)")KjAddZummFast,Zu,ctSeeJ:GoToShow1'添加数组菜单,并勾选ctSeeJCasems_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)KjAddZummFast,Zu,ctV,”倍”:GoToShow1CaseElse'装载天体名称ForI=0ToctDsJ=Ji(I)'天体I的级别KjAddmmFast,"&"&I&""&String(J*2,"")&ctD(I).CapNextEndSelect'勾选选定天体SelectCasectSetCasems_Center:mmFast(ctCenter).Checked=True:GoToShow1'参照系(中心天体)Casems_ShowCap'显示天体名称ForI=0ToctDs:mmFast(I).Checked=ctD(I).ShowCap:NextCasems_Visible'天体是否可见ForI=0ToctDs:mmFast(I).Checked=ctD(I).Visible:NextCasems_GuiDao'轨道ForI=0ToctDs:mmFast(I).Checked=ctD(I).GuiDao:NextCaseElse:ExitSubEndSelectKjAddmmFast,"-"nAll=KjAdd(mmFast,"全选”,ms_All)nNo=KjAdd(mmFast,"全不选",ms_NoAll)ForI=0ToctDsIfmmFast(I).CheckedThennSel=nSel+1NextIfnSel=0ThenmmFast(nNo).Checked=True:mmFast(nNo).Enabled=FalseIfnSel=ctDs+1ThenmmFast(nAll).Checked=True:mmFast(nAll).Enabled=FalseShow1:Command1(Index).BackColor=&HFFCCCC'将选中按钮设置为淡蓝色Me.PopupMenumFast,,Command1(Index).Left,Command1(Index).Top+Command1(Index).Height-3Command1(Index).BackColor=Me.BackColorEndSubPrivateSubmmFast_Click(IndexAsInteger)'通过快捷菜单设置天体有关参数DimnTagAsMenuSet,IAsLong,TFAsBooleannTag=Val(mmFast(Index).Tag)'菜单标示:ms_All全选,ms_NoAll全不选SelectCasectSet'ctSet:按钮标示,在Command1_Click中设置Casems_V'速度ctV=Val(mmFast(Index).Caption)Casems_SeeJ'视点角度ctSeeJ=Val(mmFast(Index).Caption)'视点角度ctSeeBi=ctSeeJ/90'视角比ForI=0ToctDs:ctD(I).xUp=0:ctD(I).yUp=0:NextCasems_Bi'缩放比列ctBi=Val(mmFast(Index).Caption)ForI=0ToctDs:ctD(I).xUp=0:ctD(I).yUp=0:NextCasems_Center'参照系(中心天体)ctCenter=IndexForI=0ToctDs:ctD(I).xUp=0:ctD(I).yUp=0:NextCasems_ShowCap'显示名称IfIndex<=ctDsThenctD(Index).ShowCap=NotctD(Index).ShowCapElseTF=nTag=ms_AllForI=0ToctDs:ctD(I).ShowCap=TF:NextEndIfCasems_Visible'天体是否可见IfIndex<=ctDsThenctD(Index).Visible=NotctD(Index).VisibleElseTF=nTag=ms_AllForI=0ToctDs:ctD(I).Visible=TF:NextEndIfCasems_GuiDao'轨道IfIndex<=ctDsThenctD(Index).GuiDao=NotctD(Index).GuiDaoElseTF=nTag=ms_AllForI=0ToctDs:ctD(I).GuiDao=TF:NextEndIfEndSelectPicture1.ClsCallRun1EndSubPrivateSubAddCircle(nNameAsString,nFatherAsString,rAsLong,aAsSingle,eAsSingle,VAsSingle,_OptionalSeAsLong=255,OptionalJiaoAsSingle,OptionalIsHuiAsBoolean)'添加一个天体,参数依次是:'名称,父天体名称,天体半径,轨道长半轴,轨道偏心率,运动角速度,天体颜色,初始角度,彗星否DimIAsLong,JAsLonga=a*100'半径以100像素为标准ctDs=ctDs+1:ReDimPreservectD(ctDs)'设置父天体编号ForI=0ToctDs-1IfLCase(ctD(I).Cap)=LCase(nFather)ThenctD(ctDs).Father=I:ExitForNextctD(ctDs).Cap=nName:ctD(ctDs).r=r:ctD(ctDs).a=actD(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=SectD(ctDs).xUp=0:ctD(ctDs).yUp=0:ctD(ctDs).Visible=TruectD(ctDs).GuiDao=TrueRandomizeIfJiao=0ThenctD(ctDs).Jiao=Rnd*ctP*2ElsectD(ctDs).Jiao=JiaoEndSubPrivateFunctionKjAddZu(Kj,ZuAsVariant,ByValCheckStrAsString,OptionalSameStrAsString)'添加一个数组菜单,并勾选标题为CheckStr的条目DimIAsLong,JAsLong,nCapAsStringIfLeft(CheckStr,1)="."ThenCheckStr="0"&CheckStrForI=LBound(Zu)ToUBound(Zu)nCap=Zu(I)IfLeft(nCap,1)="."ThennCap="0"&nCapIfnCap="-"ThenJ=KjAdd(Kj,nCap)ElseJ=KjAdd(Kj,nCap&SameStr)'IfLCase(CheckStr)=LCase(nCap)ThenKj(J).Checked=TrueIfVal(CheckStr)=Val(nCap)ThenKj(J).Checked=TrueNextEndFunctionPrivateFunctionKjAdd(Kj,nCapAsString,OptionalnTagAsString,OptionalnNoteAsString)AsLong'为数组控件添加一个成员,返回新添加的成员序号DimIAsLongI=Kj.Count-1IfKj(I).Caption<>""ThenI=I+1:LoadKj(I)OnErrorResumeNextKj(I).Checked=FalseKj(I).Caption=nCapKj(I).Tag=nTagKj(I).ToolTipText=nNoteKj(I).Visible=TrueKjAdd=IEndFunctionPrivateFunctionKjCls(Kj)AsLong'卸载数组控件的所有成员(0号除外)DimIAsLongForI=Kj.Count-1To1Step-1UnloadKj(I)NextOnErrorResumeNextKj(0).Caption=""Kj(0).Checked=FalseEndFunctionPrivateFunctionCapToNum(nCapAsString)AsLong'返回名称为nCap的天体编号DimIAsLongForI=0ToctDsIfLCase(ctD(I).Cap)=LCase(nCap)ThenCapToNum=I:ExitFunctionNextCapToNum=-1EndFunctionPrivateFunctionJi(ByValDAsLong)AsLong'返回天体级别(编号为D)DoIfctD(D).Father=0ThenExitDoD=ctD(D).Father:Ji=Ji+1LoopEndFunctionPrivateSubTimer1_Timer()Run1TrueEndSubPrivateSubRun1(OptionalnRunAsBoolean,OptionalUnRunAsBoolean)'显示一次运行的瞬时状态DimwBAsSingle,hBAsSingle,XAsSingle,YAsSingle,ZuY()AsLongDimIAsLong,TAsLong,SeAsLong,rAsSingleDimCenXAsSingle,CenYAsSingle,InDAsBoolean,InD1AsBoolean'计算天体瞬时位置:相对与父天体的角度ForI=0ToctDsIfnRunThenIfUnRunThenX=ctD(I).Jiao-ctD(I).V*ctVElseX=ctD(I).Jiao+ctD(I).V*ctV'保证数值在0到ctP*2的范围内IfX>ctP*2ThenX=X-ctP*2IfX<0ThenX=X+ctP*2ctD(I).Jiao=XEndIf'IfI=CapToNum("地球")ThenMe.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).YNext'移位参照系CenX=ctD(ctCenter).X:CenY=ctD(ctCenter).Y'中心天体位置ForI=0ToctDsctD(I).X=CenX-ctD(I).X:ctD(I).Y=CenY-ctD(I).YNextSortYZuY'将天体按Y坐标排序,数组ZuY()返回排序后的天体序号Picture1.Font.Size=9:Picture1.ForeColor=&HFFFFFFwB=Picture1.ScaleWidth*0.5-ctBW:hB=Picture1.ScaleHeight*0.5-ctBW'可视区大小IfNotctTrackThenPicture1.Cls'保留轨迹,不擦除上次图像IfctBW>0ThenPicture1.Line(-wB,-hB)-(wB,hB),,B可见区方框,调试代码****ForT=0ToctDs'按天体Y坐标依次画出各天体I=ZuY(T)'天体实际编号X=ctD(I).X:Y=ctD(I).Y:r=ctBi*ctD(I).rIfr<2Thenr=2'画一个天体CallSubGuiDao(I)'画I的卫星轨道:上半部分InD=Not(X+r<-wBOrX-r>wBOrY+r<-hBOrY-r>hB)'是否在可见区内IfctD(I).VisibleAndInDThenIfctD(I).IsHuiThenTailI,X,Y'画彗尾Picture1.FillColor=ctD(I).Se:Picture1.FillStyle=0'打开填充Picture1.Circle(X,Y),r,0 '画天体Picture1.FillStyle=1 '关闭填充EndIfCallSubGuiDao(I,True)'画I的卫星轨道:下半部分'显示天体名称IfctD(I).ShowCapThenIfI=0ThenShowStrwB,hB,ctD(I).Cap,X,Y-Picture1.TextHeight("A")*0.5,True,0ElseShowStrwB,hB,ctD(I).Cap,X,Y+r+3,TrueEndIfEndIf'画运动轨迹:上一个点和当前点的连线:有一个在可见区内IfctTrackThenInD1=Not(ctD(I).xUp+r<-wBOrctD(I).xUp-r>wBOrctD(I).yUp+r<-hBOrctD(I).yUp-r>hB)If(InDOrInD1)AndctD(I).xUp<>0AndctD(I).yUp<>0ThenIfctBi<1ThenPicture1.DrawWidth=1ElsePicture1.DrawWidth=ctBi*2Picturel.Line(X,Y)-(ctD(I).xUp,ctD(I).yUp),ctD(I).SePicture1.DrawWidth=1EndIfEndIf'记忆上次位置ctD(I).xUp=X:ctD(I).yUp=YNextEndSubPrivateSubTail(IAsLong,XAsSingle,YAsSingle)'画天体I的彗尾Dimx0AsSingle,y0AsSingle,SAsSingleDimx1AsSingle,y1AsSingle,JAsSingle'无压缩时的位置x0=ctD(I).a*Sin(ctD(I).Jiao):y0=ctD(I).b*Cos(ctD(I).Jiao)J=ctBi*Sqr((x0+ctD(I).c)A2+y0八2) '与焦点(即:父天体)距离S=ctBi*(ctD(I).a-ctD(I).c)A2/J-(ctD(I).a-ctD(I).c)/5'彗发长度:近日距离4/5IfS<0ThenExitSubS=S*ctBiIfS>Picture1.ScaleWidthThenS=Picture1.ScaleWidthx1=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+1Picture1.Line(X,Y)-Step(x1,y1),&H999999Picture1.Line(X,Y)-Step(x1,y1),&H999999Picture1.DrawWidth=1:Picture1.DrawMode=13EndSubPrivateSubShowStr(wBAsSingle,hBAsSingle,nStrAsString,ByValXAsSingle,ByValYAsSingle,OptionalCenLRAsBoolean,OptionalSeAsLong=T)'显示字符wB,hB:可见区边界CenLR=T:左右居中DimWAsSingle,HAsSingle,nSeAsLongW=Picturel.TextWidth(nStr):H=Picturel.TextHeight(nStr)IfCenLRThenX=X-W*0.5IfX<-wB-WOrX>wBOrY<-hB-HOrY>hBThenExitSubPicturel.CurrentX=X:Picturel.CurrentY=Y:Picturel.PrintnStrIfSe=-1ThenExitSubnSe=Picturel.ForeColor:Picturel.ForeColor=SePicturel.CurrentX=X+1:Picturel.CurrentY=Y+1Picturel.PrintnStrPicturel.ForeColor=nSeEndSubPrivateSubSortY(ZuY()AsLong)'将天体按Y坐标排序,数组ZuY()返回排序后的天体序号DimIAsLong,JAsLong,KAsLong,SAsLong,y1AsSingleDimY()AsSingleReDimY(0ToctDs)'Y()用于视角为0的情况ForI=0ToctDsIfctSeeBi=0ThenIfctD(I).Jiao>ctP*0.5AndctD(I).Jiao<ctP*1.5ThenY(I)=ctD(I).bElseY(I)=-ctD(I).bEndIfY(I)=Y(I)+Y(ctD(I).Father)'加上父天体的Y坐标ElseY(I)=ctD(I).YEndIfNextReDimZuY(0ToctDs)ZuY(0)=0ForI=1ToctDsy1=Y(I)ForJ=0ToI-1I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论