python星空代码_Python中的唯美星空代码详解!
⽤Python显⽰真实的星空
还是先上图
本
⽂讲怎样画出真实的星空。
预备知识如果想显⽰真实的星空,⾸先你得有真实恒星的位置坐标和亮度标记。它的基本格式如下:
{'long': 0.023278328898474372, 'lat': -0.09961466705757636, 'light': 46, 'const': 66},
{'long': 0.024870941840919196, 'lat': 0.2338062439126301, 'light': 55, 'const': 62},
{'long': 0.028107061526797, 'lat': 1.1204335039257496, 'light': 56, 'const': 18},
{'long': 0.03660100303760025, 'lat': 0.5077259659824991, 'light': 21, 'const': 1},
{'long': 0.04004802831028905, 'lat': 1.0323574005393255, 'light': 23, 'const': 18},
{'long': 0.03944444109507185, 'lat': 0.3178583859888262, 'light': 55, 'const': 62},
{'long': 0.040797071265367454, 'lat': -0.488478858963941, 'light': 54, 'const': 74},
{'long': 0.0410661312228549, 'lat': -0.798444499556106, 'light': 39, 'const': 64},
{'long': 0.043800486202076855, 'lat': 0.1945266317121166, 'light': 55, 'const': 66},
{'long': 0.045036755271142, 'lat': 0.804111967609767, 'light': 50, 'const': 1},
{'long': 0.043785947609407745, 'lat': -1.4350775693910554, 'light': 53, 'const': 58},
{'long': 0.04915283505929031, 'lat': -0.2699684886295715, 'light': 49, 'const': 21},
{'long': 0.050498187206605094, 'lat': -0.4851966800391031, 'light': 54, 'const': 74},
每颗星星包含4个信息:天球经度long、天球纬度lat、亮度light(越⼩越亮)、所属星座const。
想象所有的星星都镶嵌在⼀个天球上,它们的位置是固定不变的,所以叫做恒星。
星星的坐标⽤经纬度来表⽰,就如同地球上的位置⽤经纬度来表⽰。当地球旋转时,我们看到的是天球的旋转。
我们所熟悉的北极星,就在⾮常靠近天球北极的位置上。
在天球旋转的过程中,它的位置⼏乎不动。也就是说北极星的位置⼏乎在任何时候都保持在天空中固定的位置上。之所以能够⽤北极星来指⽰⽅向,也就是这个原理。
另外,星空是球形的,想把它显⽰在屏幕上,⼜涉及⼏组基本参数的设置:
观测地的经纬度
观测的⽇期和时间
观测者的观测⾓度和屏幕⼤⼩
这⼏组参数中,关系是这样的:观测地的维度是第⼀位的,观测地确定后,所能看到的星空就是确定的(天球倾⾓),只有在⾚道上能够看到所有的星星,在其它维度都会有⼀些星星看不到。
最极端的情况下是在两极地区,永远只能看到半个天球(即⼀半数量的星星)。
观测地的经度、观测⽇期和观测时间这三者其实是等价的,因为地球的公转和⾃转对于遥远的星空来说,可以认为没有差别。
当观测点和观测⽇期时间都确定后,理论可以认为所能看到的星空⼤约有全天中半数的星星。但能够显⽰在屏幕上的星星,则取决于你向哪⾥观看以及屏幕有多⼤。
如果能够理解上⾯这些基本知识,请继续往下看。
星空计算
计算经过这样⼏个步骤:
1、为了便于计算,⾸先将每颗星星的经纬度转换为xyz的三维坐标。在这种转换过程中,我们看到的是正⽴的天球,北极点向上,南极点在下。
2、将观测地的纬度引⼊每颗计算
3、将观测地经度、观测⽇期、观测时间三者结合起来,形成⼀个经度数据,引⼊每颗计算
4、将观测者的朝向引⼊每颗计算
5、将观测者的仰⾓引⼊每颗计算
6、向屏幕投影
代码如下:def calcStar(stars,Long,Lat,winLong,winLat,eyeDistant):
Long= radians(Long)
Lat= radians(Lat)
winLong= radians(winLong)
winLat= radians(winLat)
for star in stars:
# print(star)
# 经纬度转换为xyz的三维坐标
x0= cos(star['long'])* cos(star['lat'])
y0= sin(star['long'])* cos(star['lat'])
z0= sin(star['lat'])
# 观测地经度及⽇期时间的合并
x1= x0*cos(Long)- y0*sin(Long)
y1= x0*sin(Long)+ y0*cos(Long)
z1= z0
# 观测地纬度
x2= x1* sin(Lat)- z1* cos(Lat)
y2= y1;
z2= x1* cos(Lat)+ z1* sin(Lat)
# 观测者转⾝
x3= x2* cos(winLong)+ y2* sin(winLong)
y3= -x2* sin(winLong)+ y2* cos(winLong)
z3= z2
# 观测者俯仰
x4= x3* sin(winLat)- z3* cos(winLat)
y4= y3
z4= x3* cos(winLat)+ z3* sin(winLat)
# 屏幕投影
star['visible']= (z2> 0 and z4>0)
star['x']= x4* eyeDistant/z4
star['y']= y4* eyeDistant/z4
star['z']= z4
星星可见的条件是:在地平线之上(z2>0)并且在观测者⾯前(z4>0),⽽可见的星星是否真正显⽰在屏幕上的则取决于它是否在屏幕显⽰范围内。
显⽰代码如下:img= w('RGBA', (1280,720), (0,0,120,255)) # 深蓝⾊天空
draw = ImageDraw.Draw(img)
color= (255,255,0,255) # 黄⾊星星
for star in stars:
# 屏幕中⼼
x= round(-star['y']+ 640)
y= round(star['x']+ 360)
# 亮度值越⼩越亮,这⾥⽤⼤⼩来表⽰
r= round(6-star['light']/10)
if visible(star):
# print(x,y)
draw.ellipse((x-r, y-r, x+r, y+r), fill=color)
img.show()
怎样将经度、观测⽇期和观测时间结合起来
这个问题⽐想象的复杂太多。如果想做到真正的精确,会涉及平太阳⽇、真太阳⽇、恒星⽇、岁差、经度与本地时间的差异,等等很多细节。
不过,好在这些误差并不太⼤,如果你的⽬标不是科研,并且只考虑近代⽽不是远古和未来,有些误差即使忽略也没有太⼤的影响。
这⾥我⽤⼀个虽然简略,但⾜够精确的⼀个经验公式来计算。输⼊观测地经度、观测⽇期和时间,返
回⼀个所谓的绝对经度,以这个经度作为我们计算星空位置所使⽤的经度值。
代码如下:def getAbsLong(aLong, ayy, amm, add, ahh, amin):
# 年的影响忽略
# ⽉⽇的影响,⾸先计算太阳⾚经
# 春分点3⽉21⽇为经度0,⼀年平均365.25天,旋转360度,⽤插值⽅法简单计算
a= julianDay(ayy, amm, add)
b= julianDay(ayy, 3, 21)
v= 0- (a-b)/365.25*360
# 因为使⽤本地时间,基本可以忽略经度+时区的影响(互相抵消)
# 时分的影响,中午12点,正对太阳⾚经,⼀天24⼩时,旋转360度,⽤插值简单计算
c= ahh*60+amin
d= 12*60
v= v- (c-d)/(24*60)*360
return v
星座连线是怎么来的
星座连线⽤于辅助我们理解星座形状。结构很简单,就是指明⼀条线关联哪两个点。这⾥不展开了,详见代码。{'star1': 61, 'star2': 4,
python代码转换'const': 1},
{'star1': 60, 'star2': 61, 'const': 1},
{'star1': 83, 'star2': 60, 'const': 1},
{'star1': 83, 'star2': 109, 'const': 1},
{'star1': 61, 'star2': 58, 'const': 1},
{'star1': 58, 'star2': 22, 'const': 1},
{'star1': 22, 'star2': 3097, 'const': 1},
{'star1': 3097, 'star2': 3097, 'const': 1}, {'star1': 3097, 'star2': 3088, 'const': 1}, {'star1': 3007, 'star2': 3090, 'const': 1}, {'star1': 142, 'star2': 61, 'const': 1},
更多Python知识,请关注Python视频教程!!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论