亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Python畫一個絕美土星環

發布時間:2021-10-28 18:38:02 來源:億速云 閱讀:167 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何用Python畫一個絕美土星環,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

土星的行星環非常出名。雖然木星、土星、天王星和海王星也有環,但土星環是我們太陽系中最大、最亮、最廣為人知的行星環。

它由小到灰塵的顆粒,大到巨石的物體組成。這些物體的成分主要是冰,一般認為是彗星或較大的小行星與土星的一顆衛星相撞時產生的,兩者都撞成了小碎塊。在遠古時代,土星就已為人所知,但直到1610年,伽利略才首次用望遠鏡對它進行觀測。

這個行星以羅馬農業之神土星Saturn命名為,也就是我們每個星期的第六天Saturday。

圖1至圖5中的圖像是由本文文末的代碼生成的。每張圖都呈現不同的方向角,圖標題中有相應的說明。

圖標題中還列出了入射光線的單位矢量分量,例如lx=+0.707,ly=+0.707,lz=0  表示左上象限中的光源;lx=-1,ly=0,lz=0表示來自右側的光源。在圖像中請注意行星在環上投射的陰影,尤其是在圖5中能夠看到行星輪廓的曲率。

如何用Python畫一個絕美土星環

▲圖1 包含土星環和陰影的土星1:Rx=-20°, Ry=0, Rz=-10°, lx=1, ly=0, lz=0

如何用Python畫一個絕美土星環

▲圖2 包含土星環和陰影的土星2:Rx=-8°, Ry=0, Rz=-30°, lx=0.707, ly=.707, lz=0

如何用Python畫一個絕美土星環

▲圖3 包含土星環和陰影的土星3:Rx=20°, Ry=0, Rz=25°, lx=0.707, ly=0.707, lz=0

如何用Python畫一個絕美土星環

▲圖4 包含土星環和陰影的土星4:Rx=-10°, Ry=0, Rz=25°, lx=0.707, ly=-0.707, lz=0

如何用Python畫一個絕美土星環

▲圖5 包含土星環和陰影的土星5:Rx=20°, Ry=0, Rz=30°, lx=-1, ly=0, lz=0

為了進行比較,你可以在下面網址找到土星的攝像圖:

https://www.jpl.nasa.gov/spaceimages/?search=saturn&category=#submit

圖6所示為構建土星環所用的數學模型。這里介紹一種實現球體著色的算法。首先創建一個直立球體,也就是說,經度是垂直的,緯度是水平的(即平行于XZ平面),然后從初始方向開始,圍繞x,y和z軸對球體進行旋轉。

如何用Python畫一個絕美土星環

▲圖6 土星環模型:行星俯視圖和從XZ平面上Rx=0, Ry=0, Rz=0向下看環

我們對土星環也進行同樣的操作。我們可以創建平行于XZ平面的水平環,然后將它和土星一起旋轉相同的角度。土星環所處的平面穿過土星的球心,因此土星和環具有相同的旋轉中心。

土星環繪制為一系列相鄰的同心圓,每個同心圓由短線段組成。參考圖6和文末代碼,程序第42和43行設置了土星環的內半徑和外半徑,第44行設置同心圓的間距。土星環被分成七個同心環形帶(圖6中未畫出)且具有不同的顏色,第45行的deltar是它們的寬度。

構成同心圓的每個線段都單獨繪制。第48行從r1向r2進行繪制,通過徑向循環繪制圓弧段。第49行是繞圓周方向繪制的循環。第50-61行執行旋轉操作產生第62和63行中的全局繪圖坐標xpg和ypg,旋轉函數與先前程序中的相同。

接下來在第66-75行中設置線段的顏色。土星環是由不同顏色的條帶構成的,這和NASA觀測圖像中看到的物理組成結果一致。從r = r1到r1 +  deltar的第一個條帶具有顏色clr=(.63,.54,.18),剩余的條帶也是如此。

第五個條帶省略掉了,因為它是空的,背景顏色能顯示出來。第六個條帶的寬度是其他條帶的兩倍,并且為第七個條帶提供了顏色。

對于給定的光方向,從大多數角度上,行星體本身都會在環上投下陰影。參考圖7,我們的目標是確定點p到底位于行星陰影區域內部還是外部。

球狀的行星將產生圓形的陰影,陰影的直徑與行星的尺寸相等,或者更準確地說,是球體的“大圓”。它是用通過圓心的平面切割球體而得到的最大圓,就像把橙子切成兩半,你看到的是一個橙子的最大圓。

在圖7中,這種陰影可能是由相同大小的圓盤投影產生的,也可能是由球狀行星投影產生的,兩種情況下,陰影的大小都是一樣的。在土星的側面圖中,大圓顯示為是一條通過平面中心的加粗線。

從圖7的幾何圖形中可以看出,如果p位于|B| > rs的位置,則它位于陰影區之外,其中rs是土星的半徑;如果|B| <  rs,則p位于在陰影區之中。在繪制條帶的時候,如果我們確定了p的位置在陰影區中,我們就把這個點涂成灰色,如果它在陰影區之外,我們就用第66-75行設置的條帶顏色給它著色。

如何用Python畫一個絕美土星環

▲圖7 陰影模型

我們的目標是求出給定位置p時的|B|值,由圖7可看出:

|B|=|V|sin(&phi;)

并且我們知道:

V&times;&ucirc;=|V||&ucirc;|sin(&phi;)

其中&ucirc;=-&icirc; 。將上述方程與|&ucirc;|=1合并得:

B=V&times;&ucirc;

|B|=|V&times;&ucirc;|

在代碼第78行中確定了入射光矢量&icirc; 的長度為1,但如果在第23-25行中輸入的分量不計算為1,即

如何用Python畫一個絕美土星環

則入射光矢量可能不等于1。有必要的話,需要在第79-81行進行重構。第82-84行建立矢量V的分量。第85-87行計算B的分量。第88行給出其幅度magB  = |B|。

第89行確定p是否位于陰影區內,如果是,則執行第90行V與&icirc;的點積。這是用來確定p是否位于行星朝向光源的一側,在這種情況下,它與行星的暗側相對,而不在陰影區。因為在第78-89行的陰影算法中并未區分p的位置,所以此處必須進行明確。如果p確實位于陰影區域內的暗側,則在第91行中將p設置為中等灰色。

相信你一定注意到,圖6的土星環上有一個暗色條帶,這是因為土星環在該位置上是空的:那里沒有固體顆粒物,不能反射陽光。因此我們透過條帶看到了背景顏色'midnightblue'。但這會產生一個問題,即陰影顏色的繪制會覆蓋該空白處的背景顏色,因此在第93和94行將其重置為'midnightblue'。

既然條帶的顏色都建立好了,我們就可以通過一個個短線段來繪制土星環了。第97-100行計算第一個線段的起始位置。參考圖6,第100-101行確定該線段與土星的遮擋關系,線段在前就會被繪制。

103-108行確定線段是否在土星后面,位于后面就不會被繪制。這種遮擋關系是通過計算點的全局坐標與土星中心之間的距離c來完成的。

第107行的意思是,如果c大于球體半徑的1.075倍,則繪制該段。因子1.075的作用是防止線段與球體的表面重合,這是有必要的,不然小于球體半徑的可見區段將不會被繪制。

本文代碼生成的圖像有兩點需要注意:首先是顏色。美國宇航局的攝影圖像呈現的是一種幾乎沒有顏色灰色,但是許多土星觀察者都將它描述為金黃色,因此我們選擇了金色。

所有攝影師都知道,在攝影圖像中呈現物體的真實顏色是十分困難的,顏色取決于入射光和物體本身的顏色,或許最好的方法是依靠肉眼觀察。

如果你不贊同本文代碼所生成的圖像中的顏色,可以通過更改程序中clr的定義來修改它們。需要注意的第二點,是圖5中土星表面陰影的曲率,它表示著色算法是否按預期工作。

在程序的使用上,你可以自行更改第24-26行中的入射光的方向和第32-34行中的旋轉角度。

運行代碼也需要一段時間,請耐心等待。

1"""   2SATURN   3"""   4   5import numpy as np   6import matplotlib.pyplot as plt   7from math import sin, cos, radians, sqrt   8   9plt.axis([0,150,100,0])  10plt.axis('off')  11plt.grid(False)  12  13print('running')  14#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;parameters  15g=[0]*3  16  17xc=80 #&mdash;&mdash;&mdash;sphere center  18yc=50  19zc=0  20  21rs=25 #&mdash;&mdash;&mdash;sphere radius  22  23lx=-1 #&mdash;&mdash;&mdash;light ray unit vector components  24ly=0  25lz=0  26  27IA=0  28IB=.8  29+n=2  30  31Rx=radians(-20)  32Ry=radians(0)  33Rz=radians(30)  34  35#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;same as SHADESPHERE&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;  36  37#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;rings  38alpha1=radians(-10)  39alpha2=radians(370)  40dalpha=radians(.5)  41  42r1=rs*1.5  43r2=rs*2.2  44dr=rs*.02  45deltar=(r2-r1)/7 #&mdash;&mdash;&mdash;ring band width  46  47#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;rotate ring point p which is at r, alpha  48for r in np.arange(r1,r2,dr):  49    for alpha in np.arange(alpha1,alpha2,dalpha):  50        xp=r*cos(alpha)  51        yp=0  52        zp=-r*sin(alpha)  53        rotx(xc,yc,zc,xp,yp,zp,Rx)  54        xp=g[0]-xc  55        yp=g[1]-yc  56        zp=g[2]-zc  57        roty(xc,yc,zc,xp,yp,zp,Ry)  58        xp=g[0]-xc  59        yp=g[1]-yc  60        zp=g[2]-zc  61        rotz(xc,yc,zc,xp,yp,zp,Rz)  62        xpg=g[0]  63        ypg=g[1]  64  65#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;select ring band color  66    if r1 <= r < r1+1*deltar:  67        clr=(.63,.54,.18)  68    if r1+1*deltar <= r <= r1+2*deltar:  69        clr=(.78,.7,.1)  70    if r1+2*deltar <= r <= r1+3*deltar:  71        clr=(.95,.85,.1)  72    if r1+3*deltar <= r <= r1+4*deltar:  73        clr=(.87,.8,.1)  74    if r1+5*deltar <= r <= r1+7*deltar:  75        clr=(.7,.6,.2)  76  77#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;shadow  78    magu=sqrt(lx*lx+ly*ly+lz*lz)  79    ux=-lx/magu  80    uy=-ly/magu  81    uz=-lz/magu  82    vx=xc-xpg  83    vy=yc-ypg  84    vz=zc-zpg  85    Bx=uy*vz-uz*vy  86    By=uz*vx-ux*vz  87    Bz=ux*vy-uy*vx  88    magB=sqrt(Bx*Bx+By*By+Bz*Bz)  89    if magB < rs: #&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;if in the shadow region  90        if vx*lx+vy*ly+vz*lz <= 0: #&mdash;&mdash;&mdash;if v points toward light source  91            clr=(.5,.5,.2) #&mdash;&mdash;&mdash;shadow color  92  93    if r1+4*deltar <= r <= r1+5*deltar: #&mdash;&mdash;&mdash;overplot empty band  94        clr='midnightblue' #&mdash;&mdash;&mdash;with background color  95  96#&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;plot line segment  97    if alpha == alpha1:  98        xstart=xpg  99        ystart=ypg 100    if zpg <= zc: #&ndash;front (z axis points into the screen) 101        plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr) 102 103    if zpg >= zc: #&ndash;back 104        a=xpg-xc 105        b=ypg-yc 106        c=sqrt(a*a+b*b) 107        if c > rs*1.075: #&mdash;&mdash;plot only the visible portion of rings 108            plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr) 109        xstart=xpg 110        ystart=ypg 111 112plt.show()

上述內容就是如何用Python畫一個絕美土星環,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌乐县| 交口县| 长丰县| 海宁市| 南通市| 东辽县| 大化| 门源| 迁安市| 南京市| 西充县| 鸡西市| 江安县| 东乡县| 灌阳县| 大港区| 高州市| 五原县| 衢州市| 深水埗区| 高密市| 左云县| 内乡县| 和静县| 偏关县| 棋牌| 马关县| 沙湾县| 桑日县| 柞水县| 洛川县| 扶风县| 安丘市| 鸡西市| 朝阳县| 平罗县| 丽江市| 大英县| 乳山市| 靖安县| 社旗县|