使用 matplotlib.pyplot
填充多边形,以填充科赫雪花(Koch snowflake)为例,它是一个分形几何图形。
导入库:
import matplotlib.pyplot as plt
import numpy as np
定义 koch_snowflake
函数:
def koch_snowflake(order, scale=10):
# ...
这个函数生成科赫雪花的点坐标。order
参数表示递归深度,scale
参数表示雪花的范围。
定义内部函数 _koch_snowflake_complex
:
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)
如果递归深度为0,生成初始的等边三角形的点坐标。
生成递归深度大于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,通过递归生成新的点坐标,构建科赫雪花。
调用 _koch_snowflake_complex
生成雪花的点坐标:
points = _koch_snowflake_complex(order)
x, y = points.real, points.imag
绘制科赫雪花:
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()