基于 shapely.buffer 实现平面多边形的缩小和膨胀

shapely: python 中的图形处理功能包
buffer - 缓冲区,shrink / erode - 缩小,expand / dilate - 膨胀

Python 代码

运行前需确保引入的相关功能包都已安装:pip install shapely(包含 numpy),pip install matplotlib

import numpy as np
from shapely.geometry import LinearRing, Polygon
import matplotlib.pyplot as plt


distance    = 0.2
cap_style   = 2  # 1 (round), 2 (flat), 3 (square)
join_style  = 2  # 1 (round), 2 (mitre), and 3 (bevel)
mitre_limit = 5  # 默认是 5

polygon_np = np.array([
    [0, 0],
    [0.5, 0],
    [0.5, 0.5],
    [1, 0.5],
    [1, 1],
    [0, 1],
])  # 这里没有闭环,可以直接输入 shapely 的 LinearRing
polygon_shapely = Polygon(LinearRing(polygon_np))
# buffer 后得到的是闭环的结果,即第一个点和最后一个点相同
polygon_dilated_np = np.array(polygon_shapely.buffer(
    distance, cap_style=cap_style, join_style=join_style, mitre_limit=mitre_limit).exterior.coords)
polygon_shrunk_np = np.array(polygon_shapely.buffer(
    -distance, cap_style=cap_style, join_style=join_style, mitre_limit=mitre_limit).exterior.coords)

# 以下用于绘图
fig, ax = plt.subplots(figsize=(8, 6), dpi=80)
ax.plot(
    np.append(polygon_np[:,0], polygon_np[0,0]), 
    np.append(polygon_np[:,1], polygon_np[0,1]), 
    '.-', color='b', label='original', lw=3, ms=8, mew=3)
ax.plot(
    polygon_dilated_np[:,0], 
    polygon_dilated_np[:,1], 
    '.-', color='orange', label=' buffer (dilated)', lw=3, ms=8, mew=3)
ax.plot(
    polygon_shrunk_np[:,0], 
    polygon_shrunk_np[:,1], 
    '.-', color='r', label='buffer (shrunk)', lw=3, ms=8, mew=3)
ax.axis('equal')
ax.legend(loc='lower right', fontsize=14)
plt.tight_layout()
plt.show()

join_style 参数的影响

以下图中,蓝色为原始图形,红色为缩小后的图形,橙色为膨胀后的图形,都是由点的序列组成的。

join_style = 1丨round,圆角

在这里插入图片描述

join_style = 2丨mitre,单顶点

修改 mitre_limit 参数,一旦 buffer 前后顶点的距离超过 mitre_limit * distance,单顶点就会被截为倒角(bevel)。截为倒角后,倒角斜边到原始顶点的距离等于 mitre_limit * distance。

mitre_limit = 5

mitre_limit 也可以设置为 2 \sqrt{2} 2 ,同样不会产生倒角,因为对于直角多边形来说,缩小 / 膨胀后顶点到原顶点的距离即 2 \sqrt{2} 2 * distance。
在这里插入图片描述

mitre_limit = 1

此时单顶点被截为了倒角,倒角斜边到原始顶点的距离等于 mitre_limit * distance 即 distance。
在这里插入图片描述

join_style = 3丨bevel,倒角

直角处完全的倒角,倒角斜边到原始顶点的距离等于 1 / 2 1/\sqrt{2} 1/2 * distance。
在这里插入图片描述

cap_style 参数的影响

对于平面多边形这样的封闭图形,cap_style 参数没有影响,该参数用于指定非封闭图形线段末端缩小 / 膨胀后的形态,具体可以参考以下官方文档【链接】【链接】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值