Python使用matplotlib的fill函数填充多边形-以科赫雪花(Koch snowflake)为例

使用 matplotlib.pyplot 填充多边形,以填充科赫雪花(Koch snowflake)为例,它是一个分形几何图形。
在这里插入图片描述

  1. 导入库:

    import matplotlib.pyplot as plt
    import numpy as np
    
  2. 定义 koch_snowflake 函数:

    def koch_snowflake(order, scale=10):
        # ...
    

    这个函数生成科赫雪花的点坐标。order 参数表示递归深度,scale 参数表示雪花的范围。

  3. 定义内部函数 _koch_snowflake_complex

    def _koch_snowflake_complex(order):
        # ...
    

    这个函数是一个递归函数,生成复数表示的科赫雪花的点坐标。

  4. 生成初始三角形的点坐标:

    if order == 0:
        angles = np.array([0, 120, 240]) + 90
        return scale / np.sqrt(3) * np.exp(np.deg2rad(angles) * 1j)
    

    如果递归深度为0,生成初始的等边三角形的点坐标。

  5. 生成递归深度大于0时的点坐标:

    else:
        ZR = 0.5 - 0.5j * np.sqrt(3) / 3
    
        p1 = _koch_snowflake_complex(order - 1)  # 起始点
        p2 = np.roll(p1, shift=-1)  # 结束点
        dp = p2 - p1  # 连接向量
    
        new_points = np.empty(len(p1) * 4, dtype=np.complex128)
        new_points[::4] = p1
        new_points[1::4] = p1 + dp / 3
        new_points[2::4] = p1 + dp * ZR
        new_points[3::4] = p1 + dp / 3 * 2
        return new_points
    

    如果递归深度大于0,通过递归生成新的点坐标,构建科赫雪花。

  6. 调用 _koch_snowflake_complex 生成雪花的点坐标:

    points = _koch_snowflake_complex(order)
    x, y = points.real, points.imag
    
  7. 绘制科赫雪花:

    plt.figure(figsize=(8, 8))
    plt.axis('equal')
    plt.fill(x, y)
    plt.show()
    

    使用 matplotlib 绘制雪花,通过 fill 函数填充生成的点坐标。

  • 完整代码
import matplotlib.pyplot as plt
import numpy as np

def koch_snowflake(order, scale=10):
    """
    返回科赫雪花的点坐标列表 x, y。

    参数
    ----------
    order : int
        递归深度。
    scale : float
        雪花的范围(基本三角形的边长)。
    """
    def _koch_snowflake_complex(order):
        if order == 0:
            # 初始三角形
            angles = np.array([0, 120, 240]) + 90
            return scale / np.sqrt(3) * np.exp(np.deg2rad(angles) * 1j)
        else:
            ZR = 0.5 - 0.5j * np.sqrt(3) / 3

            p1 = _koch_snowflake_complex(order - 1)  # 起始点
            p2 = np.roll(p1, shift=-1)  # 结束点
            dp = p2 - p1  # 连接向量

            new_points = np.empty(len(p1) * 4, dtype=np.complex128)
            new_points[::4] = p1
            new_points[1::4] = p1 + dp / 3
            new_points[2::4] = p1 + dp * ZR
            new_points[3::4] = p1 + dp / 3 * 2
            return new_points

    points = _koch_snowflake_complex(order)
    x, y = points.real, points.imag
    return x, y

# 调用函数生成科赫雪花的点坐标
x, y = koch_snowflake(order=5)

# 绘制雪花
plt.figure(figsize=(8, 8))
plt.axis('equal')
plt.fill(x, y)
plt.show()

使用关键字参数facecolor和edgecolor来修改多边形的颜色。由于默认 Matplotlib 样式中边缘的线宽为 0,因此也必须对其进行设置才能使边缘可见。
在这里插入图片描述

x, y = koch_snowflake(order=2)

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(9, 3),
                                    subplot_kw={'aspect': 'equal'})
ax1.fill(x, y)
ax2.fill(x, y, facecolor='lightsalmon', edgecolor='orangered', linewidth=3)
ax3.fill(x, y, facecolor='none', edgecolor='purple', linewidth=3)

plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pandas120

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值