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://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

相关推荐

  • 服务器怎么开启任务管理器?远程桌面快捷键是什么

    服务器开启任务管理器的核心在于根据不同的操作系统环境(Windows或Linux)以及当前的会话状态(图形界面或命令行),选择最高效的触发路径,最关键的操作原则是:在拥有图形界面时优先使用快捷键组合,在远程命令行环境下必须依赖系统命令或工具链,切忌盲目操作导致服务中断,对于服务器管理员而言,熟练掌握多种开启方式……

    2026年3月16日
    10500
  • 国际域名服务商怎么选才靠谱,国外域名注册商哪个好

    新手选国际域名服务商,核心就一句话:优先选成立时间久、续费价格透明、自带永久隐私保护的大型注册商,别贪首年低价,更别在来路不明的小平台裸奔注册,为什么别在小平台或代理商手里买域名?很多新手第一次注册域名,习惯直接在网站建设公司、淘宝店或者某些云服务器商的页面里顺手买一个,行业共识认为,这种做法踩坑概率相当高,域……

    2026年9月10日
    200
  • 个人网站关于页面怎么写,个人网站关于页面

    个人网站关于页面不仅是信息的展示窗口,更是建立访客信任、提升转化率的关键枢纽,其核心价值在于通过真实、透明且专业的内容呈现,让陌生访客在几秒钟内确认“你是谁”以及“为何值得信任”,在2026年的数字生态中,用户对于信息的获取不再满足于简单的罗列,而是追求深度的连接与真实的共鸣,一个优秀的“页面,应当像一位经验丰……

    服务器运维 2026年5月25日
    5200
  • 服务器怎么开启curl?详细步骤教程分享

    开启服务器curl功能的核心在于正确安装curl扩展并修改PHP配置文件,重启服务后即可生效,不同操作系统环境下的操作路径虽有差异,但本质流程一致:环境检测、依赖安装、配置开启、服务重启、功能验证, 环境检测与准备工作在执行任何安装操作前,必须先确认服务器的现有环境,盲目安装可能导致环境冲突或重复配置,检查现有……

    2026年3月17日
    12200
  • 个人电脑虚拟主机厂家哪家靠谱?虚拟主机租用价格是多少

    个人电脑虚拟主机厂家通过提供基于云原生架构的轻量级服务器解决方案,以低于传统物理服务器的成本和高于共享主机的性能稳定性,成为中小型网站及初创企业的首选基础设施,在2026年的数字化浪潮中,个人电脑(PC)不再仅仅是办公或娱乐的工具,其闲置算力与存储资源正被重新定义,对于许多开发者、独立博主以及小型电商卖家而言……

    服务器运维 2026年5月27日
    3700
  • 女仆桌游都有哪些服务器值得推荐,哪个好?

    国内云服务器、香港/海外服务器以及高防物理机,其中国内BGP云服务器是大多数店家的首选方案,女仆桌游店和其他线上桌游平台不一样,它承载的不仅仅是游戏逻辑,还有实时语音、虚拟形象互动、以及可能存在的直播推流,服务器选不好,顾客一多就卡顿,体验感直接崩塌,这篇内容我会把服务器类型的区别、适用场景、以及怎么选服务商一……

    2026年9月17日
    300
  • 服务器搭建vps教程,vps服务器怎么搭建最稳定

    服务器搭建VPS的核心在于精准规划硬件资源、严选操作系统与虚拟化技术,并构建严密的安全防护体系,这不仅是技术部署的过程,更是构建稳定、高效网络基础设施的关键决策,成功的搭建方案能够实现资源利用率最大化,同时确保数据的安全性与业务的连续性,前期规划与硬件资源选型搭建VPS的首要任务是明确业务需求,这直接决定了硬件……

    2026年3月8日
    15000
  • 网站提示暂时无法访问怎么办?网站无法访问的常见原因及解决方法

    该网站暂时无法访问通常由服务器宕机、DNS解析故障或本地网络配置错误引起,用户应优先检查自身网络连接,若问题持续则需联系网站管理员或等待服务自动恢复,当你满怀期待地点击一个链接,屏幕却只留下一片空白或“无法访问”的提示时,这种挫败感确实让人抓狂,这不仅仅是技术故障,更是数字时代我们与信息之间的一道隐形屏障,理解……

    2026年7月3日
    1100
  • python fp=是什么意思?,怎么用

    在Python中,fp=通常表示将文件对象赋值给变量fp,这是文件操作的标准写法,fp常被用作“file pointer”或“file path”的缩写,python fp是什么?文件操作的代名词很多初学者在接触Python文件操作时,都会遇到fp = open(…)这样的代码,这里的fp并不是关键字,而是……

    2026年7月22日
    800
  • 服务器维修工具有哪些值得入手,服务器维护常用工具有哪些

    一套合格的服务器维修工具分为诊断测试、硬件拆装、数据救援和环境保障四大类,具体包含命令行检测软件、防静电拆装套装、网络测试仪、U盘启动盘以及智能PDU等设备,很多新手刚接触服务器运维时,总觉得维修是个纯技术活儿,靠一双手就能走天下,但真正到了机房,你才会发现,没有趁手的工具,面对红灯报警的硬盘或者宕机的节点,你……

    2026年9月15日
    200

发表回复

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