溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用python畫出月亮和月餅代碼實例

發布時間:2021-09-15 20:08:58 來源:億速云 閱讀:469 作者:chen 欄目:開發技術
# 利用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()

1.3 使用Turtle圖形庫實現

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

二、繪制月餅圖案

2.1 月餅結構分析

傳統月餅通常包含以下視覺元素: 1. 圓形基礎形狀 2. 表面花紋裝飾 3. 邊緣波浪紋 4. 頂部文字圖案

2.2 完整Matplotlib實現

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

2.3 月餅繪制進階技巧

2.3.1 3D效果增強

通過添加漸變色彩和陰影增強立體感:

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

2.3.2 添加芝麻裝飾

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)

三、組合月亮與月餅

3.1 中秋主題組合圖

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

3.2 動畫效果實現

使用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)

四、技術總結

  1. 圖形繪制核心原理

    • 使用參數方程生成圓形/曲線
    • 通過路徑操作實現復雜形狀
    • 顏色填充與邊緣效果處理
  2. 性能優化技巧

    • 對于靜態圖,預計算所有頂點
    • 使用向量化操作代替循環
    • 適當減少采樣點提升渲染速度
  3. 擴展應用方向

    • 轉換為3D圖形(使用mpl_toolkits.mplot3d)
    • 添加交互功能(使用mpld3庫)
    • 導出為SVG矢量圖進行后期編輯

五、完整代碼打包

所有示例代碼已整理為可執行腳本,包含以下文件: - moon_plotting.py:月亮繪制實現 - mooncake_design.py:月餅繪制實現 - midautumn_art.py:組合場景生成

可通過以下命令獲取完整項目:

git clone https://github.com/example/midautumn-art.git

希望本文能幫助您使用Python創建精美的中秋主題圖形!通過調整參數和組合不同元素,您可以開發出更多富有創意的節日圖案。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女