用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。

想象所有的星星都镶嵌在一个天球上,它们的位置是固定不变的,所以叫做恒星。星星的坐标用经纬度来表示,就如同地球上的位置用经纬度来表示。当地球旋转时,我们看到的是天球的旋转。我们所熟悉的北极星,就在非常靠近天球北极的位置上。在天球旋转的过程中,它的位置几乎不动。也就是说北极星的位置几乎在任何时候都保持在天空中固定的位置上。之所以能够用北极星来指示方向,也就是这个原理。

另外,星空是球形的,想把它显示在屏幕上,又涉及几组基本参数的设置:

观测地的经纬度

观测的日期和时间

观测者的观测角度和屏幕大小

这几组参数中,关系是这样的:观测地的维度是第一位的,观测地确定后,所能看到的星空就是确定的(天球倾角),只有在赤道上能够看到所有的星星,在其它维度都会有一些星星看不到。最极端的情况下是在两极地区,永远只能看到半个天球(即一半数量的星星)。观测地的经度、观测日期和观测时间这三者其实是等价的,因为地球的公转和自转对于遥远的星空来说,可以认为没有差别。当观测点和观测日期时间都确定后,理论可以认为所能看到的星空大约有全天中半数的星星。但能够显示在屏幕上的星星,则取决于你向哪里观看以及屏幕有多大。

如果能够理解上面这些基本知识,请继续往下看。

星空计算

计算经过这样几个步骤:

为了便于计算,首先将每颗星星的经纬度转换为xyz的三维坐标。在这种转换过程中,我们看到的是正立的天球,北极点向上,南极点在下。

将观测地的纬度引入每颗计算

将观测地经度、观测日期、观测时间三者结合起来,形成一个经度数据,引入每颗计算

将观测者的朝向引入每颗计算

将观测者的仰角引入每颗计算

向屏幕投影

代码如下:

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= Image.new('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, '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},

完整代码

完整代码与星星坐标数据,请见下载资源。

参考资源:

https://download.csdn.net/download/xiaorang/12505238

python运行星空_用Python显示真实的星空相关推荐

  1. python运行外部程序_在Python中运行外部程序(可执行文件)?

    在Python中运行外部程序(可执行文件)? 我刚刚开始研究Python,我一直在尝试从Python运行外部可执行文件. 我有一个用Fortran编写的程序的可执行文件. 假设可执行文件的名称是flo ...

  2. python运行命令_对python中执行DOS命令的3种方法总结

    1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. ...

  3. python运行方法_对python中执行DOS命令的3种方法总结

    1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. ...

  4. 在线的python运行环境_在线Python环境(Azure Notebooks)

    前言 上文说道了anaconda的安装和使用.对于动手能力较差的小伙伴们来说,安装还是太过麻烦,一出现问题也不知道如何查错,然后就从入门选择放弃. 说起编程的两个拦路虎,一个就是环境配置,另一个就是编 ...

  5. 用Python显示真实的星空

    用Python显示真实的星空 还是先上图 本文讲怎样画出真实的星空. 预备知识 如果想显示真实的星空,首先你得有真实恒星的位置坐标和亮度标记(全部数据,资源下载地址见文末).它的基本格式如下: {'l ...

  6. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python安装环境安装_安装Python运行环境

    可以直接在python的官网下载相应操作系统平台的python安装包:https://www.python.org/downloads 点击下载后出现的安装界面,建议选中界面下方的Add Python ...

  9. python代码变成运行程序_用Python脚本转换成windows的可执行程序

    下载并运行与你所安装的Python对应的py2exe版本的 installer,这将安装py2exe和相应的例子:这些例子被安装在lib\site-packages\py2exe\samples目录下 ...

最新文章

  1. MSP430低功耗模式-while循环失效
  2. linux下卸载自带的JDK和安装想要的JDK
  3. 【位运算DFS/DLX】【HDU1426】【数独】
  4. FreeMarker模板文件的组成(2)
  5. php yii2 finfo file,FileHelper:文件系统助手
  6. 总结:第一章~第五章
  7. java自定义异常报错
  8. winsw将命令部署为服务(比如springboot)
  9. linux java远程调试_idea远程linux代码调试
  10. sql 两个表列包含_Oracle数据库扩展语言PL/SQL之运算符
  11. saas java框架_XMReport-提供web项目Java套打解决方案
  12. 自适应粉色可爱棒棒糖倒立404错误页面源码
  13. j连接oracle数据库,JFinal连接Oracle数据库实战
  14. numpy 维度与轴的问题
  15. Mac os 进行Android开发笔记(1)
  16. 教你两招搞定百度文库无需下载券
  17. AI对话机器人实现原理
  18. 铁威马NAS使用docker安装全网音乐教程
  19. css和scss设置子元素样式
  20. Android 项目总结(实现捕捉人脸)

热门文章

  1. 初学者必看SSM基本项目(详细图解)
  2. win8打开默认的杀毒软件MSE
  3. 安科瑞交流三相表电表在越南光伏的应用(防逆变)
  4. 我的世界常用快捷键指令大全
  5. 火狐浏览器f12不显示firebug开发者模式问题总结
  6. 使用ChatGPT前应当学会提问
  7. 写一首50字蔡徐坤打篮球的歌。
  8. 作图:plt.scatter() “x and y must be the same size“
  9. HarmonyOS应用开发-剪切板
  10. 立志要引领电视行业趋势的荣耀,最终还是向价格“弯了腰”