首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图形中的图形

图形中的图形
EN

Stack Overflow用户
提问于 2015-08-06 21:19:17
回答 1查看 125关注 0票数 3

我正在用matplotlib做实验,用数字绘制数字。因为正方形是画得最直的,所以我就从这些开始。最后,我想为一定宽度的多边形编写一个生成器。在给定的例子中,这将是一个直角和宽度为1的4角多边形.

我的当前代码绘制了以下代码,这与预期的大致相同。

注意,在2,22,3之间有一行,如果用正确的算法而不是当前的代码来完成,我认为可以删除。

上面的总结是一个方框在两个盒子中,振幅随着1的增加而增加,假设较大的盒子在其余的盒子‘后面’。

我编写的生成上述代码的方法实际上并不是一个函数。这是一个非常丑陋的点集合,恰巧类似于中空的方块。

代码语言:javascript
复制
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绘制具有一定宽度的多边形,假设多边形将在外部以相同的形状和至少相同的宽度被包围,并在内部完全填充?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 13:15:08

纯粹在matplotlib中处理多边形可能非常繁琐。幸运的是,有一个非常好的库用于这类操作:修长。就您的目的而言,parallel_offset函数是可行的。您感兴趣的多边形的边界由ring1ring2ring3定义

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import shapely.geometry as sg
from descartes.patch import PolygonPatch

# if I understood correctly you mainly need the difference d here
INNER_AMPLITUDE = 0.1
OUTER_AMPLITUDE = 0.2
d = OUTER_AMPLITUDE - INNER_AMPLITUDE

# fix seed, for reproducability
np.random.seed(11111)

# a function to produce a "random" polygon
def random_polygon():
    nr_p = np.random.randint(7,15)
    angle = np.sort(np.random.rand(nr_p)*2*np.pi)
    dist = 0.3*np.random.rand(nr_p) + 0.5
    return np.vstack((np.cos(angle)*dist, np.sin(angle)*dist)).T

# your input polygon
p = random_polygon()

# create a shapely ring object
ring1 = sg.LinearRing(p)
ring2 = ring1.parallel_offset(d, 'right', join_style=2, mitre_limit=10.)
ring3 = ring1.parallel_offset(2*d, 'right', join_style=2, mitre_limit=10.)

# revert the third ring. This is necessary to use it to procude a hole
ring3.coords = list(ring3.coords)[::-1]

# inner and outer polygon
inner_poly = sg.Polygon(ring1)
outer_poly = sg.Polygon(ring2, [ring3])

# create the figure
fig, ax = plt.subplots(1)

# convert them to matplotlib patches and add them to the axes
ax.add_patch(PolygonPatch(inner_poly, facecolor=(0,1,0,0.4),
    edgecolor=(0,1,0,1), linewidth=3))
ax.add_patch(PolygonPatch(outer_poly, facecolor=(1,0,0,0.4),
    edgecolor=(1,0,0,1), linewidth=3))

# cosmetics
ax.set_aspect(1)
plt.axis([-1.5, 1.5, -1.5, 1.5])
plt.grid()
plt.show()

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31865990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档