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

相关推荐

  • 广东GPU服务器租用哪家最合适,哪家便宜?

    广东GPU服务器租用哪家合适,答案取决于你的具体任务——模型训练首选腾讯云,推理和渲染可以考虑阿里云或华为云,而中小团队则更适合UCloud或本地IDC服务商,这个结论基于广东地区的数据中心分布、网络延迟以及各厂商的GPU实例性价比,如果你正在调研广东GPU服务器租用,不妨先明确自己的使用场景,再对比主流厂商的……

    2026年8月12日
    700
  • 服务器搭建软件有哪些免费版本,哪个最好用?

    搭建服务器,选择合适的软件是核心,对于绝大多数场景,推荐使用Nginx 搭配宝塔面板,这套组合兼顾高性能与易管理,是目前最主流且经过验证的方案,服务器搭建软件哪个好?主流选择与对比搭建服务器的人常问“服务器搭建软件哪个好”,答案取决于你的具体需求,Web 服务器是基础,数据库、缓存、面板管理软件也需要一并考虑……

    2026年7月23日
    1600
  • 高精准api查询怎么用?高精准api查询接口推荐

    2026年实现高精准api查询的核心在于:选择具备毫秒级响应、智能路由与动态负载均衡的标准化接口平台,并结合业务场景匹配高并发架构与数据合规标准,方能彻底消除数据延迟与调用偏差,高精准api查询的底层逻辑与行业重构告别“数据黑盒”,精准度如何重塑业务在数字化深度融合的今天,接口调用已从单纯的“数据获取”跃升为……

    2026年4月28日
    5300
  • 规划大力发展智慧医疗,未来智慧医疗发展趋势如何

    智能分诊与精准导流在门诊入口处,智能导诊系统通过自然语言处理技术,根据患者描述的 symptoms(症状)初步判断科室,减少挂错号的情况,这种前置筛选机制,让专家资源集中在真正需要的患者身上,提升了整体接诊效率,症状自查:患者输入主诉,系统推荐对应科室及专家,智能预约:根据医生空闲时段和患者病情紧急程度,自动匹……

    2026年7月5日
    12810
  • 服务器怎么按流量计费?服务器流量计费方式有哪些

    服务器按流量计费的核心逻辑在于“按需付费”,即用户仅为实际传输的数据量买单,而非固有的带宽峰值,这种模式最适合流量波动大、带宽利用率低的业务场景,能有效降低成本,但必须配合严格的流量监控与防盗链机制,避免因恶意攻击或非预期高峰导致费用失控, 核心计费模式深度解析要理解服务器怎么按流量计费,首先需要厘清其与固定带……

    2026年3月17日
    10000
  • 高级网络安全是什么?企业如何构建高级网络安全防护体系

    2026年高级网络安全的核心在于以零信任架构为底座,融合AI驱动的自适应防御体系,实现从被动拦截向主动免疫的实战化跨越,2026高级网络安全演进:从合规驱动到实战对抗威胁态势的质变根据Gartner 2026年最新预测,超过75%的企业将面临由AI生成的自动化攻击,传统基于边界的静态防御已彻底失效,攻击者利用大……

    2026年4月25日
    5300
  • 服务器带宽怎么查看?Linux查看带宽命令详解

    服务器带宽直接决定网站访问速度与用户体验,精准查看并监控带宽使用情况是服务器运维的核心工作,最有效的带宽查看方式是结合系统原生命令行工具与专业监控软件,前者用于实时故障排查,后者用于长期趋势分析,两者互为补充,构建完整的带宽监控体系,Linux系统原生命令行工具:实时排查的首选对于运维人员而言,命令行工具是最高……

    2026年3月31日
    8200
  • 服务器监控系统如何选?实时告警稳定运行就选它!

    服务器监控系统是现代IT基础设施的核心支柱,用于实时跟踪服务器性能、预防故障并优化资源利用率,本调研基于行业实践和深度分析,旨在为IT管理人员提供全面的选择指南和实施策略,通过评估功能需求、市场工具比较及最佳实践,我们揭示高效监控系统的关键要素,帮助您提升系统可靠性和运营效率,服务器监控系统概述服务器监控系统通……

    2026年2月8日
    11130
  • 48核96线程CPU有哪些服务器型号,哪种性价比高

    市场上提供48核96线程计算能力的服务器主要基于AMD EPYC 7643、EPYC 7763(通过配置调整)或Intel Xeon Platinum 8480+等处理器,典型机型包括戴尔PowerEdge R7625、HPE ProLiant DL385 Gen11、联想ThinkSystem SR655,以……

    2026年8月6日
    1700
  • 服务器最低续费多少天,云服务器能按天续费吗?

    服务器续费周期的设定并非由单一标准决定,而是取决于云服务商的计费模式、实例类型以及具体的业务合同条款,通常情况下,主流云服务器的最低续费周期为1天或1个月,而物理服务器或特定促销机型可能要求更长的续费时长,对于企业用户而言,理解并掌握这些规则,是保障业务连续性、优化成本结构的关键所在,云服务器续费规则详解云服务……

    2026年2月26日
    13700

发表回复

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