You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算球面圆周曲率(弧)?实现月相光照占比弧绘制函数

实现带真实光照效果的月球绘制函数

核心原理

月球的可见光照占比和相位角θ的对应关系为:
可见占比 = (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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:30:49