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

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

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.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

相关推荐

  • Flash网站设计欣赏的要点是什么,有哪些设计技巧?

    Flash网站虽然已经退出历史舞台,但当年那些惊艳世人的设计思路和交互创意,至今仍是网页设计领域值得深挖的宝藏,如果你正在寻找flash网站设计欣赏的灵感,或者想了解那个黄金时代的设计如何反哺现代网页,这篇文章会给你一个清晰的答案,为什么Flash网站设计至今仍被反复提及2000年代中后期,Flash几乎是高端……

    2026年8月7日
    500
  • 免费个人web服务器有哪些类型,哪个好?

    免费个人web服务器大体分为本地自建服务器、云服务商短期免费试用、静态托管平台、免费VPS(虚拟专用服务器)以及免费虚拟主机五大类,选择时需根据技术栈、流量预期和管理成本综合权衡,本地服务器:最适合开发调试的免费方案本地服务器指在个人电脑或旧设备上安装Web服务软件,直接对外提供服务,这是最基础、最可控的免费方……

    2026年8月23日
    100
  • 防火墙设置疑问,应用软件的允许规则具体该如何配置?

    防火墙允许应用的设置位置取决于您使用的操作系统和防火墙类型,您可以在系统安全设置、控制面板或专用防火墙软件中找到相关选项,以下是针对不同系统的详细设置指南,Windows系统防火墙设置在Windows系统中,防火墙允许应用的设置主要通过“Windows安全中心”或“控制面板”进行,通过Windows安全中心设置……

    2026年2月3日
    13650
  • 仿70网站分类目录源码值得下载吗?,怎么下载安装

    仿70网站分类目录源码是搭建分类导航网站最直接的选择,但不同版本在功能、价格和SEO支持上差异明显,选对源码才能少走弯路,仿70网站分类目录源码哪家好:三大版本对比市面上标榜仿70的源码主要分为免费开源、商业授权和定制开发三类,**你的需求直接决定哪家更适合你**,而不是盲目追求功能堆砌,免费开源版:适合练手和……

    2026年7月25日
    1100
  • 个人博客数据库怎么建?个人博客数据库推荐

    转化为可检索、可关联的知识资产,通过本地化部署或私有云存储,实现数据主权完全归个人所有,彻底摆脱第三方平台的算法限制与封号风险,在信息爆炸的2026年,内容创作者面临的最大危机并非流量枯竭,而是数据资产的脆弱性,许多博主习惯了依赖微信公众号、知乎或海外平台作为唯一发布渠道,一旦账号因违规被封或平台政策调整,多年……

    2026年6月12日
    4400
  • 服务器干什么用的?服务器主要用途详解

    服务器干的本质是提供计算、存储与网络资源的集中化管理与分发,其核心价值在于通过高性能硬件与软件架构,确保数据请求的即时响应与业务连续性,企业选择与运维服务器的关键,在于精准匹配业务负载与服务器性能,同时构建高可用与安全防护体系,以实现降本增效,服务器核心功能与业务价值服务器不同于普通个人计算机,其设计初衷是为了……

    2026年4月10日
    9100
  • 藁城润沃智慧物流园到底行不行,入驻物流园要注意哪些坑

    藁城润沃智慧物流园整体实力处于石家庄东部物流板块的中上游水平,适合对京津冀配送时效有要求、需要现代化仓储设施的中型以上物流企业入驻,但在高端供应链金融配套上相对常规,区位交通与辐射能力解析物流园区的核心价值在于“通”,藁城润沃智慧物流园位于石家庄市藁城区,这里不仅是石家庄的东大门,更是连接京津冀的重要节点,对于……

    2026年7月8日
    8000
  • 服务器设备it的选型标准有哪些,怎么选?

    服务器设备IT是支撑企业数字化业务的核心基础设施,选型时需从实际负载出发,优先考虑扩展性与可靠性,而非单纯堆砌参数,服务器设备IT怎么选?这三点决定成败选型误导是常见问题,许多人只看CPU核心数或内存大小,忽略了业务场景匹配,服务器设备IT怎么选,核心在于平衡算力、存储和冗余,算力匹配:CPU和内存不是越多越好……

    2026年8月8日
    400
  • 服务器怎么选配置?2026服务器选购指南与性能评测

    核心趋势、挑战与未来架构演进服务器技术演进的核心趋势异构计算成为主流: CPU+GPU/DPU/FPGA的混合架构普及,满足AI训练推理、科学计算、视频处理等场景对算力密度和效率的爆发式需求,Gartner预测,到2025年,超过80%的企业将部署异构计算服务器处理特定负载,液冷技术从边缘走向中心: 高密度计算……

    2026年2月7日
    18700
  • aws云服务器购买工具有哪些,哪个性价比高?

    AWS云服务器购买工具有哪些?核心答案就一句话:官方提供了管理控制台、CLI、CloudFormation、SDK等工具,第三方则有Terraform、Ansible等,选择上主要看你的自动化需求和团队技术栈,官方工具:从图形界面到代码化AWS管理控制台:可视化操作的基础登录AWS账户后,进入EC2控制台,点击……

    2026年8月17日
    600

发表回复

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