python convexhull怎么用?python凸包算法原理详解

Python 计算凸包 (Convex Hull)

凸包是指包含所有给定点的最小凸多边形,以下是几种常用的 Python 实现方法:


使用 scipy.spatial.ConvexHull(推荐)

from scipy.spatial import ConvexHull
import numpy as np
import matplotlib.pyplot as plt
# 生成随机点
np.random.seed(42)
points = np.random.rand(30, 2)
# 计算凸包
hull = ConvexHull(points)
# 获取凸包顶点的索引
hull_indices = hull.vertices
# 获取凸包顶点坐标
hull_points = points[hull_indices]
# 可视化
plt.figure(figsize=(8, 8))
plt.scatter(points[:, 0], points[:, 1], c='blue', label='All Points')
# 绘制凸包边
for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'r-')
plt.plot(hull_points[:, 0], hull_points[:, 1], 'go-', label='Hull Vertices')
plt.legend()'Convex Hull using scipy')
plt.axis('equal')
plt.show()
# 凸包面积和周长
print(f"Convex Hull Area: {hull.volume}")       # 2D中volume即为面积
print(f"Convex Hull Perimeter: {hull.area}")    # 2D中area即为周长

使用 scipy.spatial.ConvexHull(简洁版)

python convexhull怎么用?python凸包算法原理详解

D.5.2.3.3D ConvexHull(通过输入点生成3维凸包)-20221219(0081)
加载中
D.5.2.3.3D ConvexHull(通过输入点生成3维凸包)-20221219(0081)
from scipy.spatial import ConvexHull import numpy as np points = np.array([[0, 0], [1, 0], [1, 1], [0, 1], [0.5, 0.5]]) hull = ConvexHull(points) # 凸包顶点(按逆时针顺序排列) vertices = points[hull.vertices] print("Hull vertices:n", vertices) print("Area:", hull.volume) print("Perimeter:", hull.area)

使用 shapely

from shapely.geometry import MultiPoint
import matplotlib.pyplot as plt
import numpy as np
# 生成随机点
np.random.seed(42)
points = np.random.rand(30, 2)
# 创建 MultiPoint 并计算凸包
multi_point = MultiPoint(points)
hull = multi_point.convex_hull
# 提取凸包坐标
x, y = hull.exterior.xy
# 可视化
plt.figure(figsize=(8, 8))
plt.scatter(points[:, 0], points[:, 1], c='blue', label='All Points')
plt.plot(x, y, 'r-', label='Convex Hull')
plt.legend()'Convex Hull using shapely')
plt.axis('equal')
plt.show()
print(f"Convex Hull Area: {hull.area}")
print(f"Convex Hull Perimeter: {hull.length}")

手动实现 Graham Scan 算法

import numpy as np
import matplotlib.pyplot as plt
def cross(

python convexhull怎么用?python凸包算法原理详解

o, a, b): """计算向量OA和OB的叉积""" return (a[0] - o[0]) (b[1] - o[1]) - (a[1] - o[1]) (b[0] - o[0]) def convex_hull_graham(points): """Graham Scan 算法求凸包""" points = sorted(set(points)) if len(points) <= 1: return points # 构建下凸包 lower = [] for p in points: while len(lower) >= 2 and cross(lower[-2], lower[-1], p) <= 0: lower.pop() lower.append(p) # 构建上凸包 upper = [] for p in reversed(points): while len(upper) >= 2 and cross(upper[-2], upper[-1], p) <= 0: upper.pop() upper.append(p) # 合并,去掉重复的端点 return lower[:-1] + upper[:-1] # 测试 np.random.seed(42) points = np.random.rand(30, 2) points_list = [tuple(p) for p in points] hull = convex_hull_graham(points_list) hull = np.array(hull) # 可视化 plt.figure(figsize=(8, 8)) plt.scatter(points[:, 0], points[:, 1], c='blue', label='All Points') # 闭合凸包 hull_closed = np.vstack([hull, hull[0]]) plt.plot(hull_closed[:, 0], hull_closed[:, 1], 'r-', label='Convex Hull') plt.legend()'Convex Hull using Graham Scan') plt.axis('equal') plt.show()

python convexhull怎么用?python凸包算法原理详解


各方法对比

方法 优点 缺点
scipy.spatial.ConvexHull 高效、稳定、返回面积/周长 需要安装 scipy
shapely 几何操作丰富、API 友好 需要安装 shapely
Graham Scan 无依赖、理解算法原理 代码较长、需自行处理面积/周长

注意事项

  1. 2D vs 3Dscipy.spatial.ConvexHull 支持 N 维,2D 中 volume 是面积,area 是周长;3D 中 volume 是体积,area 是表面积。
  2. 顶点顺序scipy 返回的顶点索引按逆时针排列。
  3. 共线点:凸包算法通常只返回顶点,共线点不在顶点列表中。
  4. 性能:对于大规模点集,scipy 使用 Qhull 库,时间复杂度约为 O(n log n)。

推荐使用 scipy.spatial.ConvexHull,它是最成熟、高效的解决方案。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/476827.html

(0)
python tocategorical怎么用?torch.nn.functional.one_hot长尾疑问
上一篇 2026年7月9日 23:11
Excel怎么取左边字符?Excel取左边函数公式
下一篇 2026年7月9日 23:12

相关推荐

  • 寻道大千服务器都有哪些?,哪个服务器最好

    寻道大千的服务器体系一直让不少刚入坑的玩家摸不着头脑,核心答案其实很简单:目前游戏按平台和渠道主要划分为微信区、QQ区、iOS区以及各安卓渠道服,其中微信区和QQ区是最主要的两大服务器阵营,且各服务器之间数据互不相通,服务器分类的底层逻辑按登录平台划分微信登录:对应微信专属服务器,是当前用户基数最大的分区阵营……

    2026年8月21日
    600
  • 个人信息安全数据泄露怎么办?如何保护个人隐私信息

    保护个人信息安全并非单纯依赖杀毒软件,而是需要建立“最小权限授权+多因素验证+定期清理”的综合防御体系,这是目前公认最有效的个人数据防护策略,个人信息泄露的常见场景与风险我们每天的生活都伴随着数据的流动,从扫码点餐到线上购物,每一次点击都在留下痕迹,很多人认为只有巨额财产才会成为黑客的目标,个人身份信息、社交关……

    2026年6月15日
    17400
  • 服务器强大有什么好处?高性能服务器配置推荐

    服务器强大是保障企业数字化业务连续性与高性能体验的基石,在当今瞬息万变的互联网环境中,服务器的性能直接决定了网站的加载速度、数据处理能力以及应对突发流量的稳定性,一个高性能的服务器架构,不仅仅是硬件参数的堆砌,更是系统架构、网络优化与安全防护的综合体现,核心结论在于:服务器强大能够显著降低延迟、提升并发处理能力……

    2026年3月24日
    8000
  • 高速公路视频折扣怎么享受?高速视频监控打折吗

    2026年高速公路视频折扣的获取核心在于绑定ETC设备、接入省级官方智慧高速小程序,并在特定节假日或非高峰时段通过视频AI核验通道享受最高达5折的通行费减免,2026高速公路视频折扣底层逻辑与政策溯源视频折扣的技术演进与政策支撑传统ETC折扣依赖门架计费,而2026年全面普及的“高速视频折扣”,本质是基……

    2026年4月24日
    5900
  • 高级计算机网络是什么?高级计算机网络怎么学

    2026年高级计算机网络的核心价值在于通过AI原生架构、确定性传输与零信任安全,彻底解决超大规模分布式系统的低延迟与高可靠诉求,是企业实现智能跃迁的关键基础设施,2026高级计算机网络核心架构演进从传统组网向AI原生网络跃迁传统TCP/IP架构在应对海量AI算力调度时已显疲态,2026年,高级网络不再只是数据的……

    2026年4月26日
    5700
  • 观远BI好不好用?2026年企业级BI工具选型指南

    观远BI好不好?结论是:它在零售、电商及快消行业表现优异,尤其擅长处理复杂数据建模与移动端可视化,但在通用型非结构化数据处理上并非全能,选择前需明确自身业务场景,在数字化浪潮席卷的今天,企业不再满足于简单的报表展示,而是渴望通过数据驱动决策,作为国内BI(商业智能)领域的头部玩家,观远数据(Guangyuan……

    2026年7月7日
    16900
  • 如何挑选靠谱的发送短信系统,哪个平台性价比高?

    发送短信系统的核心价值在于帮助企业快速、可靠地触达用户,选型时需综合评估到达率、稳定性、价格和场景适配,发送短信系统哪个好用?关键看这三点很多人在选型时感到纠结,其实只要盯住三个核心维度,就能快速筛选出靠谱的服务商,到达率是命门,但别只看宣传到达率受运营商通道质量、内容合规性、发送策略影响,行业共识认为,优质服……

    2026年8月7日
    400
  • 个人工作日志工时分析报表怎么做?如何高效统计团队工时

    个人工作日志工时分析报表的核心价值在于将模糊的“忙碌感”转化为可量化的效率数据,通过精准的时间分配诊断,帮助团队识别低效环节并优化资源配置,最终实现项目交付周期的缩短与人力成本的降低,在数字化管理日益精细化的今天,单纯依靠直觉判断工作效率已经行不通,许多管理者发现,员工每天看似忙忙碌碌,但核心产出却寥寥无几,这……

    服务器运维 2026年6月6日
    5500
  • GPU云计算主机优惠是真的吗?GPU云服务器租用价格多少

    2026年GPU云计算主机优惠的核心在于选择按需实例以应对突发算力需求,或购买预留实例以锁定长期成本,通常能比传统物理服务器降低30%-50%的总拥有成本,为什么2026年GPU云服务器成为企业标配随着大模型训练、AIGC内容生成以及科学计算的普及,算力已从“奢侈品”变为“必需品”,过去,企业需要自建机房,购买……

    2026年6月24日
    1700
  • go语言zlib压缩数据怎么实现?go语言zlib压缩数据教程

    Go语言通过zlib压缩数据的核心答案是使用标准库compress/zlib,配合gzip格式兼容性处理,可实现高效的数据体积缩减与传输加速,适用于API响应、日志存储及文件传输等场景,在数据爆炸的时代,带宽成本和存储压力是开发者无法回避的现实,Go语言作为现代后端开发的主流选择,其标准库中内置的compres……

    2026年6月25日
    1400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注