python 三维凸包_凸包问题,Graham扫描法,python实现

凸包问题是指在n个点中,寻找一个凸多边形,使所有的点在凸多边形的边界或者内部。这是一个很有意思的计算机图形学问题,一种常用的解法是Graham扫描法,运行时间为O(nlgn)。

笔者拿processing语言对整个算法过程进行了模拟,上动态图:

c2cee9639519d3271605848a379fd4b7.gif

注意processing拿左上为(0,0)原点,与一般数学的原点位置不同。

从动态图上可以看出整个算法分三个部分:

1、寻找y轴最小的点,如果y轴位置是相同的,那个找x轴位置最小的,称之为基准点。

2、计算1中找到基准点与其他点的极角(即过此2点的直线与x轴正方向的夹角,代码中以弧度表示),将这些点按极角的大小正序排列。

3、进行基准点与2中点的连线迭代,对新连线的点计算其是否符合凸多边形的定义,如果不满足舍弃此点。判断的方法是计算三点组成线段的叉乘,值为正表示满足条件。

以下是python的算法实现

# -*- coding: utf-8 -*-

import math

#获取基准点的下标

def get_leftbottompoint(p):

k = 0

for i in xrange(1, len(p)):

if p[i]['y'] < p[k]['y'] or (p[i]['y'] == p[k]['y'] and p[i]['x'] < p[k]['x']):

k = i

return k

#叉乘计算方法

def multiply(p1, p2, p0):

return (p1['x'] - p0['x']) * (p2['y'] - p0['y']) - (p2['x'] - p0['x']) * (p1['y'] - p0['y'])

#获取极角,通过求反正切得出,考虑pi / 2的情况

def get_arc(p1, p0):

# 兼容sort_points_tan的考虑

if (p1['x'] - p0['x']) == 0:

if ((p1['y'] - p0['y'])) == 0:

return -1;

else:

return math.pi / 2

tan = float((p1['y'] - p0['y'])) / float((p1['x'] - p0['x']))

arc = math.atan(tan)

if arc >= 0:

return arc

else:

return math.pi + arc

#对极角进行排序

def sort_points_tan(p, k):

p2 = []

for i in xrange(0, len(p)):

p2.append({"index": i, "arc": get_arc(p[i], p[k])})

p2.sort(key=lambda k: (k.get('arc', 0)))

p_out = []

for i in xrange(0, len(p2)):

p_out.append(p[p2[i]["index"]])

return p_out

def graham_scan(p):

k = get_leftbottompoint(p)

p_sort = sort_points_tan(p, k)

p_result = [None] * len(p_sort)

p_result[0] = p_sort[0]

p_result[1] = p_sort[1]

p_result[2] = p_sort[2]

top = 2

for i in xrange(3, len(p_sort)):

#叉乘为正则符合条件

while (top >= 1 and multiply(p_sort[i], p_result[top], p_result[top - 1]) > 0):

top -= 1

top += 1

p_result[top] = p_sort[i]

for i in xrange(len(p_result) - 1, -1, -1):

if p_result[i] == None:

p_result.pop()

return p_result

#测试

ps = [{"x": 2, "y": 2}, {"x": 1, "y": 1}, {"x": 2, "y": 1}, {"x": 1.5, "y": 1.5}, {"x": 1, "y": 2}, {"x": 3, "y": 1.5},

{"x": 1.5, "y": 1.2}, {"x": 0.5, "y": 2}, {"x": 1.5, "y": 0.5}]

print graham_scan(ps)

graham凸包算法及代码python代码 (3条消息)graham法求凸包详解_网络_路人黑的纸巾-优快云博客 https://blog.youkuaiyun.com/enjoy_pascal/article/details/78397028 (3条消息)Graham-Scan算法计算凸包的Python代码实现_Python_仰起脸笑得像满月-优快云博客 https://blog.youkuaiyun.com/john_bian/article/deta... 阅读详情

相关推荐

Python graham scan葛立恒扫描法算法详解及源码

Graham Scan(葛立恒扫描法)算法是一种用来计算凸包(Convex Hull)的算法。凸包是指包围一组点的最小凸多边形。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 957

【工具】 python 四个坐标点顺时针

四点顺时针 def clockwise(self, pts): ''' sort points by clockwise ''' pts = np.array(pts) sort_x = pts[np.argsort(pts[:, 0]), :] Left = sort_x[:2, :] Right = sort_x[2:, :] # Left sort Left = Left[np.argsort(Left[:,1])[::-1], :]

weixin_37763340的博客 1497

Graham Scan算法实现:凸包计算

Graham Scan算法,也称为葛立恒扫描法,是一种用于计算平面上点集的凸包的算法。凸包是包围点集的最小凸多边形,它由点集中的一些点组成,使得所有点都在凸包的内部或边界上。Graham Scan算法通过一系列的步骤来计算凸包,包括选择一个起始点、按照极角排序点、构建凸包等。通常选择的方法是找到y坐标最小的点(如果存在多个具有相同最小y坐标的点,则选择其中x坐标最小的点)作为起始点。这些点构成的凸包是一个凸多边形,其顶点分别为(0, 0), (2, 0), (3, 1), (2, 2), (1, 2)。

2301_79366332的博客 318

Graham算法构造凸包(python)

基于python构造凸包

qq_45990116的博客 2088

【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

一、Graham 凸包扫描算法 1、凸包概念 2、常用的凸包算法 3、Graham 凸包扫描算法 二、Graham 算法前置知识点 1、角排序 2、叉积 3、算法过程分析 二、代码示例 1、完整代码示例 2、执行结果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2772

凸包算法详解:Python实现Andrew单调链与Graham扫描法

在计算几何与图形图像处理中,凸包(Convex Hull)是描述散乱点集边界的基础概念,也是碰撞检测、数据可视化、地理信息简化等领域的高频前置技术。通过叉积判断点的转向关系,结合排序与线性扫描,即可高效构造出包围所有点的最小凸多边形。主流的实现方案有Graham扫描法与Andrew单调链法,前者依赖极角排序,后者仅需坐标排序与叉积运算,数值稳定性更强。掌握凸包算法不仅能理解底层几何原理,还能在工程中灵活处理共线点、浮点精度及退化输入等边界问题。本文从叉积原理出发,逐步拆解两种经典算法的推导过程,并给出可直接

weixin_32325225的博客 227

点集凸包算法python实现

什么是凸包? 凸包定义 点集p的凸包是指一个最小凸多边形(内角均小于180°),满足p中的点或者在多边形边上或者在其内 下图中的红色线段表示的多边形就是点集p={p0,p1,p2,p3,…………,p12}的凸包 通俗理解 一组平面上的点,求一个包含所有点的最小的凸多边形 这可以形象地想成这样:在地上放置一些不可移动的木桩(代表点集中的点),用一根绳子把他们尽量紧地圈起来,这就是凸包 凸包有什么特点? 整个凸包都在任意一条边的一侧 凸包任意两点的中点都在凸包内 凸包内的任意点集的加权平均(凸组合)都

TJLCY的博客 5015

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

python计算凸包并绘制凸包曲线

凸包就是用一个凸(内角不大于180°)的闭合曲线,刚好包住了所有的样本点 主要使用的工具:scipy的ConvexHull scipy.spatial.ConvexHull文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html 简易使用的示例: from scipy.spatial import ConvexHull import numpy as np points = np.array(

呆萌的代Ma 5510

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6633

基于R语言 meta/metafor 包进行荟萃分析(一)

在此部分中,使用连续结果详细描述了通用逆方差方法及其在meta分析中的应用,还介绍了固定效应法和随机效应法。我们已经展示了如何分别将典型数据与metacont和metagen函数一起使用,以及如何print和绘制森林图。我们还讨论了估计研究间方差的各种方法,并将Hartung-Knapp平差描述为经典随机效应方法的替代方法。此外,我们还说明了byvar选项的使用,这使得亚组分析更加简单。关于亚组分析的更多细节见后续章节。

Dunaichuanyi的博客 1万+

Graham扫描法:轻松掌握2D凸包问题的优雅解法

凸包是计算几何中的基础概念,指包含给定点集的最小凸多边形,广泛应用于计算机视觉、路径规划和碰撞检测等领域。Graham扫描法是计算凸包的经典算法,通过四个步骤实现:寻找基点、极角排序、栈扫描构建凸包以及处理退化情况。其核心在于利用向量叉积判断点的位置关系,时间复杂度为O(nlogn)。尽管算法高效,但在处理高维数据和大规模点时存在局限性,需结合其他方法优化。文章还提供了Python代码实现和学习资源推荐,帮助读者深入理解并应用该算法。

weixin_68733376的博客 2187

Nest的限流方案

多维度限流(如 IP、用户 ID、接口级别、请求类型)可配置化(支持不同环境和接口动态配置)可观测性(接入日志、监控系统)高性能和分布式支持(Redis 限流器)与鉴权鉴权链路集成(结合 JWT、API Token)以下是一个“标准// 优先按用户ID限流,否则按IP在main.ts维度建议限流存储推荐 Redis 支持多实例限流 Key 设计支持 IP + 用户ID + 路由等多种维度限流策略精细化配置,接口粒度调整异常处理自定义响应体、日志告警观测性。

Bruce__taotao的博客 1196

【算法设计与分析】基于Graham扫描法的二维平面点集凸包计算:研究生算法选做作业 latex+pdf

在我的代码实现问题情景下,n是用户指定输入的,接着用户可以输入相应的n个点的坐标,如果n输入-1,那么就随机生成n以及n个点的坐标,同时输出告诉用户相应的n值和n个坐标的值。Python 版本的输入输出(随机输入)如图~\ref{fig:python} 所示。\title{\heiti《算法分析与设计》选做作业} % ctex已集成黑体。C++ 版本的输入输出(用户指定输入)如图~\ref{fig:cpp} 所示。\caption{Python 实现}\caption{C++ 实现}

XLYcmy的博客 1386

DSP28335新手避坑指南:手把手教你用CCS6.2生成10KHz SPWM(附完整工程)

本文详细介绍了如何使用DSP28335开发板和CCS6.2环境生成10KHz SPWM波形的完整工程指南。从开发环境配置、ePWM模块设置到SPWM算法实现,特别针对新手常见问题提供了解决方案和调试技巧,帮助工程师快速掌握DSP28335的SPWM生成技术。

weixin_42522374的博客 182

在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统

智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。

xiaoheshang_123的博客 138

凸包问题-Graham-Scan算法-python实现

一般来说凸包问题有三种解决方式:蛮力法、Graham-Scan法和分治法。关于蛮力法和分治法的python实现可参考博文:蛮力法、分治法,博主写的很清晰。 这里主要介绍Graham-Scan算法的实现,网上的Graham-Scan算法python实现很多,如这篇博文,原理和实现都很清晰,但是当时使用这个程序测试很大的数据量(如超过1000个点以上)时会报如下错误。 程序报错说栈空,应该是数据点很多的时候多点共线,栈内元素连续弹出,因此基于这篇博文改了一些代码,实现代码如下: import matplotli

JinTian312的博客 2459

智能制造之物料详解

制造业业务系统中的物料流转贯穿需求、采购、生产到交付全流程,各系统协同实现精准追踪。需求阶段由CRM/ERP/PLM生成物料计划;采购入库阶段SCM/WMS/QMS完成采购质检;生产阶段MES/APS协调领料加工;成品交付阶段WMS/SCM处理出库物流。整个流程以BOM为蓝图,ERP为调度中心,通过数据联动实现物料状态、位置和数量的全链路可追溯。

cdfunlove的博客 655

Graham-Scan算法计算凸包的Python代码实现

对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部。就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出的Graham-Scan算法计算凸包的伪代码。 现在网上已经有了好多计算点集凸包的优秀代码,比如这篇文章,作者在文中使用了一个动画来表示了Graham-Scan算法计算凸包的过程,并给出了...

仰起脸笑得像满月 9562

LeRobot 入门教程(十六)Isaac Lab LeIsaac 叠衣服、夹橙子仿真环境

LeRobotEnvHub现已支持通过LeIsaac进行机器人模仿学习,提供摘橙子、搬立方体等日常任务仿真环境。用户可通过HuggingFace共享环境,使用一行代码加载任务,支持随机动作测试和远程操控。系统提供云端仿真方案,无需本地GPU即可运行。当前支持4种任务环境,通过make_env函数切换,其中折叠布料任务需先调用initialize()函数。该平台集成了数据采集、转换和训练全流程,为机器人学习提供便捷工具链。

2506_90492529的博客 1483

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java经纬度凸包graham_Python求凸包及多边形面积教程

一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham"s scan),时间复杂度为O(nlgn);Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h为凸包顶点的个数。这两种算法都按逆时针方向输出凸包顶点。Graham扫描法用一个栈来解决凸包问题,点集Q中每个点都会进栈一次,不符合条件的点会被弹出,算法终止时,栈中的点就是凸包的顶点(逆时针顺序在边...

weixin_35241774的博客 483

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python----计算机视觉处理(Opencv:凸包特征检测:凸包方法)

通俗的说,就是完全凸起,没有凹处的多边形,也叫做凸多边形。一 般来说凸包都是伴随着某类点集存在的,也被称为某个点集的凸包。对于一个点集来说,如果该点集存在凸包,那么这个点集中的所有的点要么 在这个凸包上,要么在这个凸包内。凸包检测常用在物体识别、手势识别及边界检测等领域。

weixin_64110589的博客 1914

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python-Graham扫描算法-凸包问题

重庆理工大学(CQUT)每棵果树分别用二维坐标来表示,进行定位。选用了Graham扫描算法,根据之前学过的数学原理我们知道y值最小的坐标点一定在构成的凸包上,首先找到y坐标的点为枢纽点(如果有多个点拥有最小 y 坐标,则选择最左边的点),将其余坐标点与枢纽点的极角(与x轴正方向的夹角)从小到大排序(如果两点有相同的极角,则将距离枢纽点较远的排在前面),然后用一个栈,将枢纽点和排好序的第一个点入栈,依次将剩余的点与栈顶的两点做叉乘比较,最后输出比较后的凸包上的点。

西唯兵欧泡的博客 674

python计算多边形面积_Python求凸包及多边形面积教程

一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham's scan),时间复杂度为O(nlgn);Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h为凸包顶点的个数。这两种算法都按逆时针方向输出凸包顶点。Graham扫描法用一个栈来解决凸包问题,点集Q中每个点都会进栈一次,不符合条件的点会被弹出,算法终止时,栈中的点就是凸包的顶点(逆时针顺序在边...

weixin_39968266的博客 829

寻找凸包

问题:点集 Q 的凸包 (convex hull) 是一个最小的凸多边形 P:Q 中的每个点或在 P 的边界上或 在 P 的内部,我们用 CH(Q) 表示点集 Q 的凸包。 问题定义: 输入:平面上的点集 Q 输出:Q 的凸包 CH(Q) (a) 请给出一种算法计算 CH(Q), 叙述基本思想并写出伪代码; (b) 分析算法时间复杂度; (c) 分析算法的正确性; (1)Graha...

George的博客 1500

Opencv:凸包检测提取轮廓Python实现

Opencv:凸包检测提取轮廓Python实现 一、原理 凸包检测 对二值图像进行轮廓分析之后,对获取到的每个轮廓数据,可以构建每个轮廓的凸包,构建完成之后会返回该凸包包含的点集。根据返回的凸包点集可以绘制该轮廓对应的凸包。OpenCV对轮廓提取凸包的API函数如下: convexHull( InputArray points, OutputArray hull, bool clockwise =...

qq_39071739的博客 5199
上一篇: python mapreduce框架_Hadoop:使用Mrjob框架编写MapReduce
下一篇: thinkphp mysql json数据类型_thinkphp5框架实现数据库读取的数据转换成json格式示例...
weixin_39924179
博客等级 码龄9年 42粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值