玩玩Python中的画画函数——画点丑丑的小玩意er

目录

1. 抽象小蛋糕

2.极简花花

3.抽象小恐龙

4.一个小树帐篷

5.另一个画法的高级花花


1. 抽象小蛋糕

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Rectangle, Polygon

def draw_layer_cake(ax, position, size):
    """绘制分层蛋糕"""
    layers = 3
    layer_height = size[1] / layers
    colors = ['#FFD700', '#FFA07A', '#FF69B4']
    
    for i in range(layers):
        bottom = position[1] + i * layer_height
        rect = Rectangle((position[0], bottom), size[0], layer_height, 
                         facecolor=colors[i], edgecolor='black')
        ax.add_patch(rect)
    
    # 蜡烛
    candle_x = position[0] + size[0] / 2
    candle_top = position[1] + size[1]
    ax.plot([candle_x, candle_x], [candle_top, candle_top + size[1]*0.2], 
            color='red', linewidth=3)
    ax.add_patch(Circle((candle_x, candle_top + size[1]*0.2), 0.05, 
                        color='yellow'))
    
    # 装饰
    for i in range(5):
        x = position[0] + size[0] * (i+1)/6
        y = position[1] + size[1] - 0.05
        ax.add_patch(Circle((x, y), 0.03, color='white'))

# 创建画布
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_aspect('equal')
ax.axis('off')
ax.set_xlim(0, 12)
ax.set_ylim(0, 6)

# 绘制三种蛋糕
draw_layer_cake(ax, (1, 1), (2, 3))

# 添加标题
plt.title("Three Different Cakes", fontsize=16, pad=20)

plt.tight_layout()
plt.show()

 1. 导入库
- 导入了NumPy(虽然代码中未直接使用)
- 导入了Matplotlib的pyplot模块
- 从matplotlib.patches导入了几种形状绘制工具:扇形(Wedge)、圆形(Circle)、矩形(Rectangle)和多边形(Polygon)

 2. 定义绘制分层蛋糕的函数

def draw_layer_cake(ax, position, size):
    """绘制分层蛋糕"""
    layers = 3
    layer_height = size[1] / layers
    colors = ['#FFD700', '#FFA07A', '#FF69B4']

- 定义了一个绘制分层蛋糕的函数,接收三个参数:
  - `ax`:Matplotlib的坐标轴对象
  - `position`:蛋糕的起始位置(左下角坐标)
  - `size`:蛋糕的尺寸(宽度,高度)
- 设置蛋糕有3层(`layers = 3`)
- 计算每层的高度(`layer_height`)
- 定义每层的颜色(金色、浅橙红色、热粉色)

 3. 绘制蛋糕层

    for i in range(layers):
        bottom = position[1] + i * layer_height
        rect = Rectangle((position[0], bottom), size[0], layer_height, 
                         facecolor=colors[i], edgecolor='black')
        ax.add_patch(rect)

- 循环绘制每一层蛋糕
- 计算当前层的底部y坐标
- 创建矩形对象表示蛋糕层,设置颜色和边框
- 将矩形添加到坐标轴中

4. 绘制蜡烛

    # 蜡烛
    candle_x = position[0] + size[0] / 2
    candle_top = position[1] + size[1]
    ax.plot([candle_x, candle_x], [candle_top, candle_top + size[1]*0.2], 
            color='red', linewidth=3)
    ax.add_patch(Circle((candle_x, candle_top + size[1]*0.2), 0.05, 
                        color='yellow'))

- 计算蜡烛的x位置(蛋糕中央)
- 计算蜡烛顶部位置(蛋糕顶部)
- 用`plot`绘制蜡烛的线(红色)
- 用`Circle`绘制蜡烛火焰(黄色)

 5. 绘制装饰

    # 装饰
    for i in range(5):
        x = position[0] + size[0] * (i+1)/6
        y = position[1] + size[1] - 0.05
        ax.add_patch(Circle((x, y), 0.03, color='white'))

- 在蛋糕顶部均匀分布5个装饰点
- 每个装饰点是一个白色小圆

6. 创建画布和坐标轴

# 创建画布
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_aspect('equal')
ax.axis('off')
ax.set_xlim(0, 12)
ax.set_ylim(0, 6)

- 创建12x6英寸的画布
- 设置坐标轴比例为等比例(`equal`)
- 关闭坐标轴显示(`axis('off')`)
- 设置x和y轴的显示范围

7. 绘制蛋糕
- 调用`draw_layer_cake`函数绘制一个蛋糕
- 位置在(1,1),尺寸为宽2高3

8. 添加标题和显示
- 添加标题"Three Different Cakes"
- `tight_layout()`自动调整子图参数
- `show()`显示图形


 2.极简花花

import numpy as np
import matplotlib.pyplot as plt

# 设置参数
theta = np.linspace(0, 12 * np.pi, 1000)  # 角度范围
k = 5  # 花瓣数量参数
r = np.cos(k * theta)  # 极坐标方程

# 转换为笛卡尔坐标
x = r * np.cos(theta)
y = r * np.sin(theta)

# 绘制图形
plt.figure(figsize=(8, 8))
plt.plot(x, y, color='red', linewidth=3)
plt.title('Mathematical Rose Curve', fontsize=16)
plt.axis('equal')
plt.axis('off')
plt.show()

1. 导入库
- `numpy`:用于数学计算和数组操作
- `matplotlib.pyplot`:用于数据可视化

 2. 参数设置

theta = np.linspace(0, 12 * np.pi, 1000)  # 角度范围
k = 5  # 花瓣数量参数
r = np.cos(k * theta)  # 极坐标方程

- `theta`:创建一个从0到12π的等间距数组,共1000个点
  - 12π大约等于6个完整的圆周(2π为一个圆周)
  - 1000个点保证了曲线平滑
- `k = 5`:控制花瓣数量的参数
- `r = np.cos(k * theta)`:极坐标下的玫瑰曲线方程
  - 当k为整数时,如果k为奇数,曲线有k个花瓣;如果k为偶数,有2k个花瓣
  - 这里k=5,将产生5个花瓣

 3. 转换为笛卡尔坐标

x = r * np.cos(theta)
y = r * np.sin(theta)

- 将极坐标(r, θ)转换为笛卡尔坐标(x, y)
- 转换公式:
  - x = r * cos(θ)
  - y = r * sin(θ)

 4. 绘制图形
- 创建一个8×8英寸的图形
- 用红色线条绘制曲线,线宽为3

5. 图形美化
- 设置标题为"Mathematical Rose Curve",字体大小16
- `axis('equal')`:使x和y轴比例相同,保证图形不变形
- `axis('off')`:隐藏坐标轴
- `show()`:显示图形

 数学原理
玫瑰曲线的极坐标方程为:
r = a * cos(kθ) 或 r = a * sin(kθ)

其中:
- a控制曲线的大小
- k控制花瓣的数量和形状
- 当k为有理数时,曲线是闭合的且有有限个花瓣
- 当k为无理数时,曲线永远不会闭合


3.抽象小恐龙

简单直接的一段代码嘿嘿

def ascii_dino():
    print("""
           __
          / _)
     .-^^^-/ /
  __/       /
 /__.|_|-|_|
    """)

ascii_dino()

4.一个小树帐篷

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Rectangle, Polygon

def draw_fancy_cake(ax, position, size):
    """绘制花式蛋糕"""
    # 底部
    bottom_points = [
        (position[0], position[1]),
        (position[0] + size[0]*0.3, position[1] - size[1]*0.1),
        (position[0] + size[0]*0.7, position[1] - size[1]*0.1),
        (position[0] + size[0], position[1]),
        (position[0] + size[0]*0.7, position[1] + size[1]*0.1),
        (position[0] + size[0]*0.3, position[1] + size[1]*0.1)
    ]
    ax.add_patch(Polygon(bottom_points, facecolor='#D2B48C', edgecolor='black'))
    
    # 中间层
    middle_points = [
        (position[0] + size[0]*0.1, position[1] + size[1]*0.1),
        (position[0] + size[0]*0.4, position[1] + size[1]*0.4),
        (position[0] + size[0]*0.6, position[1] + size[1]*0.4),
        (position[0] + size[0]*0.9, position[1] + size[1]*0.1)
    ]
    ax.add_patch(Polygon(middle_points + middle_points[-2::-1], 
                         facecolor='#FFB6C1', edgecolor='black'))
    
    # 顶层
    top_points = [
        (position[0] + size[0]*0.3, position[1] + size[1]*0.4),
        (position[0] + size[0]*0.5, position[1] + size[1]*0.7),
        (position[0] + size[0]*0.7, position[1] + size[1]*0.4)
    ]
    ax.add_patch(Polygon(top_points, facecolor='#98FB98', edgecolor='black'))
    
    # 装饰
    ax.add_patch(Circle((position[0] + size[0]*0.5, position[1] + size[1]*0.7), 
                 0.05*size[0], color='gold'))
    for i in range(5):
        x = position[0] + size[0] * (i+1)/6
        ax.add_patch(Circle((x, position[1] + size[1]*0.1), 0.03*size[0], 
                           color='white'))

# 创建画布
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_aspect('equal')
ax.axis('off')
ax.set_xlim(0, 12)
ax.set_ylim(0, 6)

# 绘制三种蛋糕
draw_fancy_cake(ax, (8, 1), (3, 3))

# 添加标题
plt.title("Three Different Cakes", fontsize=16, pad=20)

plt.tight_layout()
plt.show()

1. 代码结构分析
导入模块:
  - `matplotlib.patches` 提供基本几何形状绘制能力
  - 虽然导入了`Wedge`和`Rectangle`但未实际使用

def draw_fancy_cake(ax, position, size):

函数定义:
  - 接收绘图轴对象`ax`、蛋糕位置`position`和尺寸`size`参数
  - 采用模块化设计,便于复用

2. 绘图逻辑分析

 (1) 蛋糕底部绘制

bottom_points = [...]  # 6个顶点坐标
ax.add_patch(Polygon(bottom_points, facecolor='#D2B48C', edgecolor='black'))

- 形状设计:
  - 使用六边形模拟波浪形蛋糕底
  - 通过`size[0]*0.3`等比例计算确保缩放一致性
  - 颜色`#D2B48C`是浅棕色(咖啡奶油色)

(2) 中间层绘制

middle_points = [...]  # 4个顶点
ax.add_patch(Polygon(middle_points + middle_points[-2::-1], ...)

  - `middle_points[-2::-1]`实现顶点逆序,形成闭合多边形
  - 粉色(`#FFB6C1`)填充体现奶油层质感

 (3) 顶层绘制

top_points = [...]  # 三角形顶点
ax.add_patch(Polygon(top_points, facecolor='#98FB98'))

  - 绿色(`#98FB98`)三角形模拟抹茶层
  - 顶点计算采用`size[1]*0.7`等比例参数

3. 可视化效果分析

坐标系设置

ax.set_aspect('equal')  # 保持纵横比
ax.axis('off')          # 隐藏坐标轴
ax.set_xlim(0, 12)      # 坐标系范围
ax.set_ylim(0, 6)

  - 12x6的坐标系为多蛋糕排列预留空间
  - 实际只绘制了1个位于(8,1)的蛋糕

 4. 关键算法分析

顶点计算算法

position[0] + size[0]*0.3  # X坐标计算
position[1] + size[1]*0.1  # Y坐标计算

 装饰物分布算法

position[0] + size[0] * (i+1)/6  # 等距分布

数学原理:
  - 将蛋糕宽度6等分
  - `(i+1)/6`实现5个装饰的均匀分布


5.另一个画法的高级花花

import numpy as np
import matplotlib.pyplot as plt

def fast_matplotlib_rose():
    # 预计算所有点
    theta = np.linspace(0, 12 * np.pi, 500)  # 减少点数
    k = 5
    r = np.cos(k * theta)
    x = r * np.cos(theta)
    y = r * np.sin(theta)
    
    # 创建颜色渐变
    colors = np.linspace(0, 1, len(theta))
    
    # 绘制
    fig, ax = plt.subplots(figsize=(6, 6))
    ax.scatter(x, y, c=colors, cmap='RdPu', s=10, alpha=0.8)  # 使用散点代替线条
    
    # 花茎
    ax.plot([0, 0], [min(y)-0.5, min(y)-2], color='green', linewidth=3)
    
    ax.axis('equal')
    ax.axis('off')
    plt.tight_layout()
    plt.show()

fast_matplotlib_rose()

1. 核心数学原理

theta = np.linspace(0, 12*np.pi, 500)  # 极角范围:6个完整圆周(12π)
k = 5                                  # 花瓣数量参数
r = np.cos(k*theta)                    # 极径方程:r = cos(5θ)
x = r * np.cos(theta)                  # 极坐标转笛卡尔坐标
y = r * np.sin(theta)

玫瑰曲线特性:当k为奇数时,曲线有k个花瓣;k为偶数时,有2k个花瓣。此处k=5生成5瓣玫瑰。
采样优化:`500`个点(原代码1000点)在平滑度和性能间取得平衡。

 2. 可视化优化技巧

colors = np.linspace(0, 1, len(theta))  # 创建渐变颜色值
ax.scatter(x, y, c=colors, cmap='RdPu', s=10, alpha=0.8)

散点图替代线图:`scatter()`比`plot()`更适合:
颜色渐变(`cmap='RdPu'`)增强立体感
设置透明度(`alpha=0.8`)避免密集点重叠
点大小(`s=10`)控制花瓣粗细
颜色映射:`RdPu`(红-紫)色系模拟真实玫瑰色彩渐变。

3. 花茎绘制逻辑

ax.plot([0, 0], [min(y)-0.5, min(y)-2], color='green', linewidth=3)

 4. 图形参数设置

ax.axis('equal')  # 保持纵横比,防止图形变形
ax.axis('off')    # 隐藏坐标轴,突出艺术效果
plt.tight_layout() # 自动调整边距


希望你玩的开心哦~之后还会更新一些好玩的代码(❁´◡`❁) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值