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

相关推荐

  • 个人云服务器怎么买才划算?新手选购云服务器避坑指南

    个人云服务器购买的核心在于明确自身需求,通过对比阿里云、腾讯云等主流厂商的优惠活动,选择地域近、配置匹配且售后完善的实例,并务必开启安全组防护,对于许多刚接触云计算的个人开发者或小型创业者来说,面对琳琅满目的服务器配置单和复杂的计费模式,往往感到无从下手,这并非因为技术门槛高,而是因为信息不对称,选购云服务器本……

    2026年6月16日
    3410
  • 个人域名注册什么后缀比较好,.com和.cn哪个更利于SEO排名

    对于个人用户而言,.com后缀依然是全球认可度最高的首选,若追求性价比或国内展示,.cn则是更务实的替代方案,而.xyz、.top等新兴后缀适合预算有限或特定品牌需求的场景,选择域名后缀看似只是敲几个字母的事,实则是你个人品牌在数字世界的第一张名片,很多新手在注册时容易陷入“后缀越多越好”的误区,或者盲目追求冷……

    2026年6月10日
    4700
  • 服务器控件如何添加自定义属性?服务器控件属性设置方法

    在ASP.NET Web Forms开发架构中,提升控件扩展性与业务逻辑解耦的核心手段,在于精准运用服务器控件自定义属性,这一机制不仅是实现控件功能复用的基石,更是构建高质量、可维护Web应用程序的关键技术路径,通过自定义属性,开发者能够将复杂的业务逻辑封装在控件内部,仅通过声明式标记即可完成配置,极大地降低了……

    2026年3月11日
    11000
  • 个人怎么安装服务器?新手如何从零开始搭建家用服务器

    个人安装服务器的核心在于明确需求后,选择合适的硬件或云服务商,并通过Linux系统配合Docker容器技术实现快速部署,这一过程既可以是购买实体硬件自行组装,也可以是租用云端虚拟实例,前者成本低但维护繁琐,后者省心但长期费用较高,对于许多技术爱好者、开发者或小型创业者而言,搭建属于自己的服务器不再是一件遥不可及……

    2026年6月4日
    3900
  • 个人博客适合什么域名?个人博客域名怎么选择

    个人博客最适合选择与个人品牌强绑定的.com或.cn域名,若侧重技术分享可选.dev或.io,核心原则是简短、易记且无特殊字符,域名不仅是网站的地址,更是你在互联网上的数字名片,对于个人博主而言,选择一个合适的域名,直接关系到访客的第一印象、记忆成本以及长期的品牌沉淀,很多新手在注册域名时容易陷入“越短越好”或……

    2026年6月13日
    3000
  • 服务器短信收费吗?短信平台收费标准详解

    服务器短信收费吗?是的,服务器短信(通常指企业或开发者通过API接口发送的批量短信,如验证码、通知、营销信息等)通常需要收费,免费发送大量服务器短信的情况极其罕见且限制严格,其收费模式、标准和成本构成是企业在选择和使用服务时必须清晰理解的核心要素, 为什么服务器短信收费是常态?服务器短信并非通过个人手机点对点发……

    2026年2月8日
    11800
  • 规则引擎与AI能结合吗?AI赋能规则引擎的最佳实践

    规则引擎与AI并非替代关系,而是“逻辑骨架”与“智能血肉”的互补共生,结合两者能构建出既具备高确定性又拥有灵活泛化能力的企业级智能系统,在2026年的技术语境下,单纯依赖大语言模型(LLM)处理核心业务逻辑已显露出明显的短板,而传统规则引擎在面对非结构化数据时又显得僵化,将两者深度融合,已成为解决复杂业务场景痛……

    2026年7月7日
    17100
  • 个人ca证书怎么验证?个人ca证书验证步骤详解

    个人CA证书验证的核心在于通过浏览器或专用工具导入证书后,检查其信任链完整性、有效期及吊销状态,确保数字签名未被篡改且由权威机构签发,在数字化办公日益普及的今天,个人CA证书不仅是身份的电子身份证,更是数据加密和电子签名的基石,很多人拿到证书文件后,第一反应往往是“这玩意儿怎么用”或者“怎么证明它是真的”,验证……

    2026年6月21日
    2300
  • 服务器机房维护方案怎么做,机房日常维护流程有哪些

    企业数字化转型的核心在于数据中心的稳定性与安全性,而构建一套科学、系统且可执行的维护体系,是保障业务连续性、延长设备寿命以及降低运营成本的根本途径,核心结论在于:机房维护必须从传统的被动抢修转向主动预防,通过环境、硬件、软件及安全的全维度精细化管理,结合自动化监控工具,实现99.99%的高可用性目标,制定完善的……

    2026年2月19日
    15300
  • 服务器最多能设几个管理,服务器管理员上限是多少?

    服务器管理员数量的设定并非一个绝对的硬性技术指标,而是受到操作系统架构、商业授权许可、硬件性能资源以及企业安全策略的综合制约,从纯技术理论层面来看,现代服务器操作系统支持的管理员账号数量非常庞大,通常足以满足任何企业的需求;但在实际生产环境中,为了保障系统稳定性与数据安全,建议遵循“最小权限原则”,将拥有最高管……

    2026年2月21日
    14600

发表回复

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