绘制月亮被照亮的百分比

Plot illuminated percentage of the moon

获取给定日期月亮被照亮的百分比很容易

import ephem
a=ephem.Moon(datetime.now())
mn=a.moon_phase #illuminated percentage of the moon.

现在我想尝试绘制它来表示月相。但是我不知道如何只填充一个圆的百分比来模拟地球在月球上的阴影。

我最接近的尝试是这个:

首先绘制“满月”

fig, ax = plt.subplots()


theta=np.linspace(0, 2*np.pi, 100)
r = np.sqrt(1)
c1x = r*np.cos(theta)
c1y = r*np.sin(theta)
ax.plot(c1x, c1y,color='k',lw=2,zorder=0*a)

然后添加一个更大的黑色圆圈来模拟掠过月亮的阴影。偏移量“xmn”会将阴影移到一边,以便只有“n”百分比的满月可见

r = np.sqrt(2)
c2x = r*np.cos(theta)
c2y = r*np.sin(theta)
xmn=1.2
ax.fill(c2x+xmn, c2y,color='k',lw=2,zorder=1*a)

终于把“满月”圈外的一切都藏起来了

#Circle to hide all circles
theta=np.linspace(0, 2*np.pi, 100)
# the radius of the circle
r = np.sqrt(4)
c3x = r*np.cos(theta)
c3y = r*np.sin(theta)
ax.plot(c3x, c3y,color='w')

ax.fill_between(c3x,c3y,c1y,color='w',zorder=2)
ax.fill_betweenx(c1x,c1y,c3y,color='w',zorder=2)

ax.set_xlim(-1.1, 1.1)  
ax.set_ylim(-1.1, 1.1)

plt.show()

我找不到执行此操作的聪明方法。我怎样才能找到 xmn?

提前致谢

尤里卡!

我在 this site

上找到了答案

他们解题的方法是计算两个圆重叠的面积,然后减去月球圆的面积。为此,必须知道两个圆心之间的距离,这正是我所需要的(xmn)。

为此他们计算了大圆的新月面积,然后求出两者重叠的面积,最后是小圆的新月面积。然后我们可以求出占总面积的百分比。

不知何故,求大圆新月面积的方程式(lune_1 在网站上)却给出了小新月面积。不太明白为什么,但它符合我的目的。

要是我还有数学天赋就好了,求解方程 lune_1 以找到“d”会给我一个直接的答案,其中 lune_1= 照明面积和d=两个圆心之间的距离。

经过一些调整,我最终得到了这个代码

        def calc_crescent_pos(r1,r2,mn):
            # mn = Illuminated percentage of the moon
            # r1 = radius of the moon circle
            # r2 = radius of the shadow circle

            lune=0
            d=r2-r1
            area=np.pi*r1**2 # area of the moon circle
            while lune/area < mn: #increase separation between the 2 circles, until the area of the moon crescent is equal to the illuminated percentage of the moon
                d=d+0.01
                lune = 2*(np.sqrt( (r1+r2+d) * (r2+d-r1) * (d+r1-r2) * (r1+r2-d))/ 4) + r1**2 * math.acos( (r2**2-r1**2-d**2) / (2*r1*d) ) - r2**2 * math.acos( (r2**2+d**2-r1**2) / (2*r2*d))                                     
                 
            return d-0.01

        import ephem,math
        import matplotlib.pyplot as plt
        import numpy as np
        from datetime import *

        a=ephem.Moon(datetime.now())
        mn=a.moon_phase #illuminated percentage of the moon.

        fig, ax = plt.subplots()

        #Circle1; full moon
        theta=np.linspace(0, 2*np.pi, 100)
        # the radius of the circle
        r1 = np.sqrt(1)
        c1x = r1*np.cos(theta)
        c1y = r1*np.sin(theta)
        ax.plot(c1x, c1y,color='k',lw=2,zorder=0*a)
    
        #Circle 2; Shadow
        r2 = np.sqrt(2)
        c2x = r2*np.cos(theta)
        c2y = r2*np.sin(theta)

        xmn=calc_crescent_pos(r1,r2,mn)
        
        ax.fill(c2x+xmn, c2y,color='k',lw=2,zorder=1*a)

        #Circle to hide all circles
        theta=np.linspace(0, 2*np.pi, 100)
        # the radius of the circle
        r = np.sqrt(4)
        c3x = r*np.cos(theta)
        c3y = r*np.sin(theta)
        ax.plot(c3x, c3y,color='w')

        ax.fill_between(c3x,c3y,c1y,color='w',zorder=2)
        ax.fill_betweenx(c1x,c1y,c3y,color='w',zorder=2)

        ax.set_xlim(-1.1, 1.1)  
        ax.set_ylim(-1.1, 1.1)

        plt.show()

现在只需添加几行以确保每当月亏或新月时阴影都以正确的方式移动。