如何计算球面圆周曲率(弧)?实现月相光照占比弧绘制函数
实现带真实光照效果的月球绘制函数
核心原理
月球的可见光照占比和相位角θ的对应关系为:可见占比 = (1 + cosθ) / 2
反向推导后,给定光照占比(如27%)可算出对应的相位角:θ = arccos(2 * 占比 - 1)
这个角度决定了光照弧的曲率——光照弧是月球圆被相位角切割后的亮区部分,完全匹配真实月相的视觉逻辑。
Python实现(基于Matplotlib)
以下函数接收0-100范围内的光照占比参数,直接绘制符合真实曲率的2D月球光照效果:
import matplotlib.pyplot as plt import numpy as np def draw_moon(illumination_percent): # 转换占比为0-1的浮点数 illum = illumination_percent / 100.0 if not (0 <= illum <= 1): raise ValueError("光照占比必须在0-100之间") # 计算相位角(弧度) phase_angle = np.arccos(2 * illum - 1) # 设置正方形画布,避免圆形拉伸变形 fig, ax = plt.subplots(figsize=(5,5)) ax.set_aspect('equal') # 绘制月球轮廓圆 moon_circle = plt.Circle((0, 0), 1, edgecolor='black', facecolor='#e0e0e0') ax.add_artist(moon_circle) # 绘制光照亮区:从左侧-π/2到右侧π/2 - phase_angle,填充暖黄色模拟反光 theta = np.linspace(-np.pi/2, np.pi/2 - phase_angle, 100) x = np.cos(theta) y = np.sin(theta) # 闭合路径,连接弧的两端到圆心 x = np.append(x, [0]) y = np.append(y, [0]) ax.fill(x, y, '#fff9c4', alpha=0.9) # 隐藏坐标轴,聚焦月球效果 ax.set_xlim(-1.2, 1.2) ax.set_ylim(-1.2, 1.2) plt.axis('off') plt.show() # 示例:绘制27%光照的月球 draw_moon(27)
关键细节说明
- 默认光照方向为右侧入射(符合常规观测视角),若需调整方向,修改
theta的起始/结束角度即可 - 亮区使用半透明暖黄色,模拟月球真实的反光质感
- 内置参数校验,避免无效输入导致的绘制错误
- 强制正方形画布,保证月球轮廓不会被拉伸
内容的提问来源于stack exchange,提问作者Sarcastic Bender
相关产品推荐
相关产品推荐

