我正在试验用matplotlib
画一幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅幅。因为正方形是最直接的画法,所以我从正方形开始。最后,我想为具有一定宽度的多边形编写一个生成器。在给定的示例中,这将是一个4角多边形,具有直角和宽度1。你知道吗
我当前的代码绘制了以下内容,这与预期的一样,也几乎与预期的一样。你知道吗
注意在2,2
和2,3
之间有一行代码,如果使用正确的算法而不是当前的代码,我认为可以删除这行代码。你知道吗
上面的总结是一个方形框,两个框中的振幅随1
增加,假设较大的框在其余框的后面。你知道吗
我编写生成上述代码的方法,其实并不是一个函数。这是一个非常丑陋的点集合,恰好类似于空心正方形。你知道吗
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
INNER_AMPLITUDE = 1.0
OUTER_AMPLITUDE = 3.0
Path_in = mpath.Path
path_in_data = [
(Path_in.MOVETO, (INNER_AMPLITUDE, -INNER_AMPLITUDE)),
(Path_in.LINETO, (-INNER_AMPLITUDE, -INNER_AMPLITUDE)),
(Path_in.LINETO, (-INNER_AMPLITUDE, INNER_AMPLITUDE)),
(Path_in.LINETO, (INNER_AMPLITUDE, INNER_AMPLITUDE)),
(Path_in.CLOSEPOLY, (INNER_AMPLITUDE, -INNER_AMPLITUDE)),
]
codes, verts = zip(*path_in_data)
path_in = mpath.Path(verts, codes)
patch_in = mpatches.PathPatch(path_in, facecolor='g', alpha=0.3)
ax.add_patch(patch_in)
x, y = zip(*path_in.vertices)
line, = ax.plot(x, y, 'go-')
Path_out = mpath.Path
path_out_data = [
(Path_out.MOVETO, (OUTER_AMPLITUDE, -OUTER_AMPLITUDE)),
(Path_out.LINETO, (-OUTER_AMPLITUDE, -OUTER_AMPLITUDE)),
(Path_out.LINETO, (-OUTER_AMPLITUDE, OUTER_AMPLITUDE)),
(Path_out.LINETO, (OUTER_AMPLITUDE, OUTER_AMPLITUDE)),
(Path_out.LINETO, (OUTER_AMPLITUDE, OUTER_AMPLITUDE-INNER_AMPLITUDE)),
(Path_out.LINETO, (-(OUTER_AMPLITUDE-INNER_AMPLITUDE), OUTER_AMPLITUDE-INNER_AMPLITUDE)),
(Path_out.LINETO, (-(OUTER_AMPLITUDE-INNER_AMPLITUDE), -(OUTER_AMPLITUDE-INNER_AMPLITUDE))),
(Path_out.LINETO, (OUTER_AMPLITUDE-INNER_AMPLITUDE, -(OUTER_AMPLITUDE-INNER_AMPLITUDE))),
(Path_out.LINETO, (OUTER_AMPLITUDE-INNER_AMPLITUDE, OUTER_AMPLITUDE-INNER_AMPLITUDE)),
(Path_out.LINETO, (OUTER_AMPLITUDE, OUTER_AMPLITUDE-INNER_AMPLITUDE)),
(Path_out.CLOSEPOLY, (OUTER_AMPLITUDE, OUTER_AMPLITUDE-INNER_AMPLITUDE)),
]
codes, verts = zip(*path_out_data)
path_out = mpath.Path(verts, codes)
patch_out = mpatches.PathPatch(path_out, facecolor='r', alpha=0.3)
ax.add_patch(patch_out)
plt.title('Square in a square in a square')
ax.grid()
ax.axis('equal')
plt.show()
请注意,我认为这是代码审查的主题之外,因为我正在寻找扩展我的功能,而不仅仅是重新编写,这是最佳实践。我觉得我完全错了。第一件事。你知道吗
我应该如何使用matplotlib
绘制具有一定宽度的多边形,假设多边形的外部将被具有相同形式和至少相同宽度的条带包围,并在内部完全填充?你知道吗
纯粹在matplotlib中处理多边形可能相当乏味。幸运的是,有一个非常好的库用于此类操作:shapely。 就您的目的而言,
parallel_offset
函数是一种可行的方法。 您感兴趣的多边形的边界由ring1
、ring2
和ring3
定义:结果:
相关问题 更多 >
编程相关推荐