gpt4 book ai didi

python - 绘制月亮被照亮的百分比

转载 作者:行者123 更新时间:2023-12-05 05:50:18 25 4
gpt4 key购买 nike

很容易得到某一天月亮被照亮的百分比

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()

moonphase

我找不到一个聪明的方法来做到这一点。我怎样才能找到 xmn?

提前致谢

最佳答案

Eureka !

我在 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()

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

关于python - 绘制月亮被照亮的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70534054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com