您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 利用Python画出月亮和月饼代码实例
本文将详细介绍如何使用Python的Matplotlib和Turtle库绘制月亮和月饼图案,包含完整代码实现、数学原理讲解以及可视化技巧。通过本教程,您将掌握基本的几何图形绘制、自定义形状创建以及色彩填充技巧。
## 一、绘制月亮图案
### 1.1 数学原理分析
月亮的绘制主要基于圆形叠加和布尔运算。我们通过两个圆形相交实现月牙形状:
- 主圆:半径R,中心点(0,0)
- 次圆:半径r,中心点(d,0)
当d = R - r时,两圆内切形成完美月牙
### 1.2 使用Matplotlib实现
```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, PathPatch
from matplotlib.path import Path
def draw_moon(ax, color='gold', size=1):
R = 1.0 * size # 主圆半径
r = 0.8 * size # 次圆半径
d = 0.2 * size # 圆心距
# 创建两个圆形路径
theta = np.linspace(0, 2*np.pi, 100)
main_circle = np.column_stack([R*np.cos(theta), R*np.sin(theta)])
second_circle = np.column_stack([d + r*np.cos(theta), r*np.sin(theta)])
# 组合路径实现布尔差集
vertices = np.vstack([main_circle, second_circle[::-1]])
codes = [Path.MOVETO] + [Path.LINETO]*99 + [Path.CURVE4]*100
path = Path(vertices, codes)
# 添加路径并设置颜色
patch = PathPatch(path, facecolor=color, edgecolor='none')
ax.add_patch(patch)
# 设置坐标轴
ax.set_xlim(-1.5*size, 1.5*size)
ax.set_ylim(-1.5*size, 1.5*size)
ax.set_aspect('equal')
ax.axis('off')
fig, ax = plt.subplots(figsize=(8,8))
draw_moon(ax, color='#FFD700', size=1.5)
plt.title('Golden Moon', fontsize=16)
plt.show()
import turtle
import math
def draw_moon_turtle(color='gold', size=100):
R = size # 主圆半径
r = 0.8 * size # 次圆半径
d = 0.2 * size # 圆心距
turtle.speed(0)
turtle.fillcolor(color)
turtle.begin_fill()
# 绘制主圆上半部分
turtle.penup()
turtle.goto(0, -R)
turtle.pendown()
turtle.circle(R, 180)
# 绘制次圆下半部分(反向)
turtle.penup()
turtle.goto(d, r)
turtle.pendown()
turtle.circle(r, -180)
turtle.end_fill()
turtle.hideturtle()
turtle.setup(800, 600)
draw_moon_turtle('#FFD700', 150)
turtle.done()
传统月饼通常包含以下视觉元素: 1. 圆形基础形状 2. 表面花纹装饰 3. 边缘波浪纹 4. 顶部文字图案
from matplotlib import pyplot as plt
from matplotlib.patches import Circle, Wedge, Polygon
import numpy as np
def draw_mooncake(ax, size=1):
# 基础圆形
base = Circle((0,0), size, fc='#E6B85C', ec='#8B4513', lw=4)
ax.add_patch(base)
# 边缘花纹(波浪形)
theta = np.linspace(0, 2*np.pi, 36)
wave_r = size * 1.05
wave_x = wave_r * np.cos(theta)
wave_y = wave_r * np.sin(theta) + 0.05*size*np.sin(8*theta)
ax.plot(wave_x, wave_y, color='#8B4513', lw=3)
# 中心花纹(四叶草)
leaf_theta = np.linspace(0, 2*np.pi, 5)[:-1]
for angle in leaf_theta:
# 每个花瓣由贝塞尔曲线组成
path_data = [
(Path.MOVETO, (0,0)),
(Path.CURVE4, (0.2*size*np.cos(angle), 0.2*size*np.sin(angle))),
(Path.CURVE4, (0.5*size*np.cos(angle+0.2), 0.5*size*np.sin(angle+0.2))),
(Path.CURVE4, (0.7*size*np.cos(angle), 0.7*size*np.sin(angle)))
]
verts, codes = zip(*[(p[1], p[0]) for p in path_data])
path = Path(verts, codes)
patch = PathPatch(path, fc='#D4A017', ec='none')
ax.add_patch(patch)
# 添加文字
ax.text(0, 0, '福', fontsize=size*30,
ha='center', va='center', color='#8B0000')
# 设置坐标轴
ax.set_xlim(-1.5*size, 1.5*size)
ax.set_ylim(-1.5*size, 1.5*size)
ax.set_aspect('equal')
ax.axis('off')
fig, ax = plt.subplots(figsize=(10,10))
draw_mooncake(ax, size=1.8)
plt.title('Traditional Mooncake', fontsize=18, pad=20)
plt.show()
通过添加渐变色彩和阴影增强立体感:
from matplotlib.colors import LinearSegmentedColormap
def add_3d_effect(ax, size):
# 创建径向渐变
cmap = LinearSegmentedColormap.from_list(
'mooncake', ['#F5DEB3', '#D2B48C', '#8B4513'])
# 生成网格
x = np.linspace(-size, size, 100)
y = np.linspace(-size, size, 100)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
# 绘制渐变
mask = R <= size
ax.imshow(np.where(mask, R, np.nan),
cmap=cmap,
extent=[-size,size,-size,size],
alpha=0.4,
origin='lower')
def add_sesame(ax, size, count=30):
for _ in range(count):
# 随机位置(确保在圆内)
angle = np.random.uniform(0, 2*np.pi)
r = np.random.uniform(0.7, 0.95) * size
x, y = r*np.cos(angle), r*np.sin(angle)
# 随机大小和旋转
sesame_size = np.random.uniform(0.02, 0.05) * size
rot = np.random.uniform(0, 360)
# 绘制椭圆模拟芝麻
sesame = Ellipse((x,y), sesame_size, sesame_size*0.6,
angle=rot, color='#2F1B0A')
ax.add_patch(sesame)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16,8))
# 左侧绘制月亮
draw_moon(ax1, color='#FFD700', size=1.5)
ax1.set_title('Mid-Autumn Moon', fontsize=16)
# 右侧绘制月饼
draw_mooncake(ax2, size=1.5)
add_sesame(ax2, size=1.5, count=40)
ax2.set_title('Festival Mooncake', fontsize=16)
plt.suptitle('Mid-Autumn Festival Celebration', fontsize=20)
plt.tight_layout()
plt.show()
使用Matplotlib的动画模块创建月亮渐现效果:
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots(figsize=(8,8))
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_aspect('equal')
ax.axis('off')
def update(frame):
ax.clear()
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
size = frame/30 # 逐渐增大
draw_moon(ax, size=size)
return []
ani = FuncAnimation(fig, update, frames=range(0,31),
interval=100, blit=True)
plt.close()
ani.save('moon_growing.gif', writer='pillow', fps=10)
图形绘制核心原理:
性能优化技巧:
扩展应用方向:
所有示例代码已整理为可执行脚本,包含以下文件:
- moon_plotting.py
:月亮绘制实现
- mooncake_design.py
:月饼绘制实现
- midautumn_art.py
:组合场景生成
可通过以下命令获取完整项目:
git clone https://github.com/example/midautumn-art.git
希望本文能帮助您使用Python创建精美的中秋主题图形!通过调整参数和组合不同元素,您可以开发出更多富有创意的节日图案。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。