用python画地球_如何用PYTHON程序模拟一个太阳系?
描述一個星系和描述一所學校有的思維方式是一樣的,其實和python關系不大。都可用面向對象思維來抽象。描述某個物體通常都要先思考幾個問題:該物體是什么?
該物體有什么特征?
該物體有什么能力?
該物體的關系網?
等等。
以此來看看太陽系!由于對天文知識不是很熟,所以去百度百科了解一下:太陽系(太陽和所有受到太陽的引力約束天體的集合體)_百度百科?baike.baidu.com
描述完整的太陽系需要多方面的知識。我是沒有這個能力的。所以就截取部分來說吧。如下:太陽系是以太陽為中心,和所有受到太陽的引力約束天體的集合體。包括八大行星(由離太陽從近到遠的順序:水星、金星、地球、火星、木星、土星、天王星、海王星)、以及至少173顆已知的衛星、5顆已經辨認出來的矮行星和數以億計的太陽系小天體。
廣義上,太陽系的領域包括太陽,四顆像地球的內行星,由許多小巖石組成的小行星帶,四顆充滿氣體的巨大外行星和充滿冰凍小巖石被稱為柯伊伯帶的第二顆小天體區。其中目前太陽系有八大行星,分別是水星,金星,地球,火星,木星,土星,天王星,海王星。
銀河系是一個棒旋星系,[1]直徑約10萬光年,包括一千億到四千億恒星。太陽是銀河系較典型的恒星,位于分支懸臂獵戶臂上,離銀河系中心有2.61萬光年,太陽系移動速度約240㎞/s,2.26億年轉一圈。
根據上面的內容,下面來逐步推演,并最終轉化成相應的代碼。推演的過程從空間角度展開。
太陽系
先從太陽系談起。以開頭說的三個思考角度來說這個問題。
是什么?
太陽系以太陽為中心,和所有受到太陽的引力約束的天體組成的集合體。
簡單抽象,圖示如下:
代碼描述如下:
class SolarSystem:
center = "太陽"
celestial_bodies = ["金星", "水星", "木星", "月亮", ...]
太陽系只有一個,也可以做成單例。如果再往高層次去看,比如銀河系,太陽系就是由星系類產生的對象。
有什么特征?
這里有一句話描述了太陽系的部分特征。太陽系移動速度約240㎞/s,2.26億年轉一圈。修改代碼如下:
class SolarSystem:
def __init__(self):
self.center = "太陽"
self.celestial_bodies = ["金星", "水星", "木星", "月亮", ...]
self.speed_per_second = 240000
self.revolution_cycle = 2.26 * 1e8
這里只列舉了部分。當然還有其他一些特征,比如三維空間的長寬高。
有什么能力
"太陽系移動速度約240㎞/s" 這句話表明了太陽系有移動的能力。下面給太陽系加上移動的能力:
class SolarSystem:
def __init__(self):
self.center = "太陽"
self.celestial_bodies = ["金星", "水星", "木星", "月亮", ...]
self.speed_per_second = 240000
self.revolution_cycle = 2.26 * 1e8
def move(self, duration):
print("太陽系移動了", duration * self.speed_per_second)
這么介紹太陽系感覺也太簡單了,下面來繼續說說它內部的組成。
天體
太陽系是由太陽和其他被太陽吸引的天氣組成的集合。既然太陽系中那么多天體,那么可以為天體建議一個通用的類模板:
class CelestialBody:
pass
不過這里有個問題,我們來重讀一遍開頭的描述,太陽系是:包括八大行星(由離太陽從近到遠的順序:水星、金星、地球、火星、木星、土星、天王星、海王星)、以及至少173顆已知的衛星、5顆已經辨認出來的矮行星和數以億計的太陽系小天體。
雖然都是天體,但是它們都有著不同的分類。再按之前的思路開始天體的描述:
是什么
描述中沒有說明什么是天體,可知的是恒星(太陽)、行星(水星、金星、地球、火星、木星、土星、天王星、海王星)、衛星、矮行星等都是天體。
雖然大家都是天體,但是各自的特征并不相同,需要單獨定義它們。
class Sun:
"""太陽"""
def __init__(self):
self.name = "太陽"
class Planet:
"""行星"""
def __init__(self, name):
self.name = name
class DwarfPlanet:
"""矮行星"""
def __init__(self, name):
self.name = name
class Satellite:
"""衛星"""
def __init__(self, name):
self.name = name
太陽因為其特殊性,沒有定義恒星的類。就像沒有定義星系類,只定義了太陽系一樣,因為我們關注的重點僅限于太陽系。
注意,此處不同類型的天體沒有像Java和C++定義一個天體基類。python不強調嚴格的接口繼承關系,而是用的一種叫做鴨子模型的設計思想,你有鴨子的能力你就是鴨子。有興趣可以去搜一下。
有什么特征和能力
這兩個問題就不展開了,因為要涉及到各類型天體的具體情況。思路是和描述太陽系一樣的。
其他組成
摘取的百度百科中有個廣義的描述,如下:太陽系的領域包括太陽,四顆像地球的內行星,由許多小巖石組成的小行星帶,四顆充滿氣體的巨大外行星和充滿冰凍小巖石被稱為柯伊伯帶的第二顆小天體區。其中目前太陽系有八大行星,分別是水星,金星,地球,火星,木星,土星,天王星,海王星。
太陽系中還有內行星,小行星帶,巨大外行星,以及由巨大外行星和充滿冰凍小巖石被稱為柯伊伯帶的第二顆小天體區。也可以定義相應的類。
class InnerPlanet:
"""內行星"""
def __init__(self, name):
self.name = name
class AsteroidBelt
"""小行星帶"""
def __init__(self, name):
self.name = name
class SecondCelestialBodyArea:
""""第二天體區"""
關系網
剛開始,我們描述太陽中的天體簡單,下面按不同關系整理出來的太陽系:
class SolarSystem:
def __init__(self):
self.center = Sun()
self.celestial_bodies = [Planet(), "水星", "木星", "月亮", ...]
self.secondCelestial_body_area = SecondCelestialBodyArea()
self.asteroid_belt = []
self.speed_per_second = 240000
self.revolution_cycle = 2.26 * 1e8
def move(self, duration):
print("太陽系移動了", duration * self.speed_per_second)
還有第二天體區,內行星屬于第二天體區:
class SecondCelestialBodyArea:
""""第二天體區"""
def __init__(self):
self.inner_planets = [InnerPlanet("1"), InnerPlanet("2"), InnerPlanet("3")]
還有衛星圍繞著行星運動:
class Planet:
"""行星"""
def __init__(self, name):
self.name = name
self.Satellite = []
繼續的話還需要提供很多方法給響應的類,以方便我們獲取相應的數據。
就寫到這里吧,感覺有點暈了。感覺自己也是挺閑的。
總結
以上是生活随笔為你收集整理的用python画地球_如何用PYTHON程序模拟一个太阳系?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【运营】新品推广方案整理
- 下一篇: 关于Python打包文件的步骤