Python画太阳,python模拟太阳系

  Python画太阳,python模拟太阳系

  资源素材

  太阳系只有8颗行星,包括太阳在内,一共9张图。如果没有朋友,可以从文末的下载地址下载。

  defopenSolor(太阳能):

  卸载(名称):

  str1=os.path.join(basePath,name 。png’)

  img=Image.open(str1)

  solar[name]=img

  BasePath=rD:\太阳系\材料

  #

  加载(太阳)

  装载(“金星”)

  装载(“木星”)

  负载(“地球”)

  装载(“火星”)

  装载(“水银”)

  装载(“海王星”)

  加载(冥王星)

  装载(“天王星”)

  装载(“土星”)基本运动原理

  每颗行星的轨迹都是椭圆形的。这里,我们使用一个参数方程来计算坐标:

  x=cos(弧)*a

  y=sin(弧)*b

  其中a,b是椭圆的长轴和短轴,arc是运行角,x,y是水平面坐标。

  让我们从静态渲染开始!

  参数的设置

  为了好看,实际参数不能真实。但至少应该满足几个关键条件。首先,不要搞错行星的顺序。行星轨道之间的距离不是等距的,而是逐渐增加的。

  其次,火星和木星直接有一个小行星带,这两颗行星的轨道之间最好留个空隙。有些行星离得越远,它们绕得越慢。

  definitSolar(posList):

  defgetNumber():

  returnrandom.randint(0,35)*10

  posList[sun]={pos:(0,360), rate:2, scale:1, radx:1, layer:360}

  pos list[ mercury ]={ rate :0.15, radx:500, arc:getNumber(), rady:200, speed:15}

  pos list[ venus ]={ rate :0.2, radx:550, arc:getNumber(), rady:250, speed:10}

  (=NationalBureauofStandards)国家标准局

  p;posList['earth']={'rate':0.2,'radx':630,'arc':getNumber(),'rady':320,'speed':8}

  posList['mars']={'rate':0.2,'radx':740,'arc':getNumber(),'rady':410,'speed':6}

  posList['jupiter']={'rate':0.7,'radx':1050,'arc':getNumber(),'rady':650,'speed':4}

  posList['saturn']={'rate':1,'radx':1250,'arc':getNumber(),'rady':800,'speed':3}

  posList['uranus']={'rate':0.3,'radx':1480,'arc':getNumber(),'rady':970,'speed':2}

  posList['neptune']={'rate':0.3,'radx':1740,'arc':getNumber(),'rady':1160,'speed':2}投影

  一般的效果是将行星围绕太阳的公转面至于一个水平面上,然后投影到垂直的屏幕上。投影算法不难。

  

x=math.sin(math.radians(a))*radx+x0

  y=math.cos(math.radians(a))*rady+y0

  showX=x

  showY=midY-H/(D+y)*y

其中,x,y是公转平面坐标,showX,showY是投影到垂直平面的坐标。H是平面的高度,D是屏幕到太阳系的距离。

  从数据来看,我们的太阳系模型是一个非常小的模型,或者电脑屏幕非常大。因为这两者实际差不多大,以至于从观察者的视角就可以出现很明显的近大远小效果。从这种效果就可以知道,数据与真实值差别极为巨大。

  近大远小的效果,只与y相关。

  

data['scale']=(y0+D)/(y+D)
遮挡效果

  为了有真实感,行星之间、行星与轨道之间,轨道与太阳之间等等的遮挡效果是最关键的。

  我们的做法是先画后半区,再画太阳,再画前半区。后半区中,远日行星先画;前半区中,近日行星先画。以保证正确的遮挡效果。

  

drawOrb(img,solar,posList,0,90,True)

  pasteSolor(img,solar,posList)

  drawOrb(img,solar,posList,90,180,False)

比较复杂一点的是行星与自身轨道之间的遮挡关系。必须实现一线穿一球的效果才好看。而且穿球位置不是固定不变的。这里,我们根据行星所在角度的不同,将轨道拆分为两半来画。

  一部分轨道是被行星遮挡的,另一部分轨道遮挡行星,但留一些空间,以实现比较自然的穿球效果。

  

drawArc(arc1,arc)

  rate=posList[name]['rate']*posList[name]['scale']

  pic=solarImg[name].resize(effect.tupleRound(effect.tupleMul(solarImg[name].size,rate)),Image.ANTIALIAS)

  pos=effect.tupleRound(effect.tupleAdd(posList[name]['pos'],effect.tupleMul(pic.size,-0.5)))

  r,g,b,alpha=pic.split()

  img.paste(pic,pos,mask=alpha)

  #穿球点,随arc不同而不同

  #90度位置,在中心穿球,

  #越接近0或180度,越接近球边缘

  #根据这种性质,采用cos来模拟

  darc=abs(round(math.cos(math.radians(arc))*solarImg[name].size[1]*rate/50))

  #darc=abs(round(math.cos(math.radians(arc))*5))

  #print(name,arc,darc)

  drawArc(arc+darc,arc2)

素材链接:https://pan.baidu.com/s/18ELL4aL-jHbIbIacMpVbjA

  提取码:5bjj

  更多Python知识,请关注Python视频教程!!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: