凸包Graham算法

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... 阅读详情

在学习Graham算法前,需要先了解二维叉乘这个概念。

叉乘的拓展

  1. 在一般的常识或者教科书中规定叉乘只有3d才拥有,其实2d也可以拓展出来一个叉乘形式,而且非常有用。
    拓展方式:假设有两个2d向量a,b,我们直接把他们视为3d向量,z轴补0,那么这个时候的a,b向量的叉乘结果c,c.x=0,c.y=0,c.z=a.xb.y-b.xa.y,
    这个时候可以吧2d的叉乘值定义为得到一个值,而不是得到一个向量,那么这个值k, k = c.z=a.xb.y-b.xa.y,我们可以通过这个k值得到很多有用的性质:
    1.a,b向量构成的平行四边形的面积。
    2.如果k>0时,那么a正旋转到b的角度为<180°,如果k<0,那么a正旋转到b的角度为>180°,如果k=0 那么a,b向量平行。

有了二维叉乘这个基础咱们就可以来学习Graham这个算法了。

#include<bits/stdc++.h>
using namespace std;
int n,top;
struct node{
    double x,y;
} a[105],b[105];
///a代表输入的点,p代表选择的点
double cross(node p0,node p1,node p2){   ///计算叉乘 p0p1 和 p0p2
    return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
/**
大于小于号 正好相反
如果k>0时,那么a正旋转到b的角度为<180°
如果k<0,那么a正旋转到b的角度为>180°,
如果k=0 那么a,b向量平行。
首先 a = (1,0) b = (-1,1)
aXb = 1    从a向量逆时针到b向量的角度小于180
bXa = -1   从b向量逆时针到b向量的角度大于180
*/
double dis(node a,node b){
    return sqrt((a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y));
}
///极角排序
bool cmp(node p1,node p2){
    double tmp=cross(a[0],p1,p2);
    if( tmp>0 || ( tmp==0 && dis(a[0],p1) < dis(a[0],p2) ) ){
        return 1;
    }
    /**
    两向量小于180度 或者 两个向量平行距离从小到大排序
    */
    return 0;
}
void Graham(){
    int k=0;
    ///寻找最左下角的点
    for(int i=0; i<n; i++){
        if(a[i].y < a[k].y || ( a[i].y == a[k].y && a[i].x < a[k].x ) ){
            k=i;
        }
    }
    swap(a[0],a[k]);   ///找p[0]
    sort(a+1,a+n,cmp); ///进行极角排序
    top=1;
    p[0]=a[0];
    p[1]=a[1];
    for(int i=2; i<n; i++){  ///控制进栈出栈
        while(cross( p[top-1] , p[top] , a[i] )<0 && top){
            top--;
        }
        top++;
        p[top]=a[i];
    }
}
int main(){
    int m;
    scanf("%d",&m);
    while(m--){
        scanf("%d",&n);
        for(int i=0; i<n; i++){
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        Graham();
        for(int i=0; i<=top; i++){
            printf("%d %d\n",p[i].x,p[i].y);
        }
    }
    return 0;
}

Convex hull凸包问题和Graham算法 Convex hull凸包问题和Graham算法@(算法)GitHub地址引入凸包问题前先复习一下向量的知识。 在二维空间中,向量定义方向和长度,用一对坐标x,yx,y来表示。 向量的加法和减法就不加以赘述了,重点讲述向量的点乘和叉乘。 AB=x1∗x2+y1∗y2A B=x1*x2+y1*y2,AB=|A||B|cosΘA B=|A||B|cos\Theta 点乘得到的是个标量,这个公式可 阅读详情

相关推荐

Graham Scan凸包算法

一:什么是凸包 在一个二维坐标系中,有若干点杂乱排列着,将最外层的点连接起来构成的凸多边型,它能包含给定的所有的点,这个多边形就是凸包。 寻找凸包的算法有很多种,Graham Scan 算法是一种十分简单高效的二维凸包算法,能够在 O(nlogn) 的时间内找到凸包。 二:Graham Scan 算法 先将若干个点排序比较两个点的 x 坐标小的先被扫描。如果两个点 x 坐标相同,那么...

qq_41268947的博客 735

凸多边形、凹多边形、凸包算法

凸多边形: (Convex Polygon)可以有以下三种定义: 1、没有任何一个内角是优角(Reflexive Angle)的多边形。 2、如果把一个多边形的所有边中,有一条边向两方无限延长成为一直线时,其他 3、凸多边形是一个内部为凸集的简单多边形。简单多边形的下列性质与其凸性等 (1)所有内角小于等于180度。 (2)任意两个顶点间的线段位于多边形的内部或 (3)多边形内任意两个点,其连线全部在多边形内部或边上。 所有的正多边形都是凸多边形。 所有的三角形都是凸多边形。 凸多边形的内角均小于或等于1

weixin_43042467的博客 1万+

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

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

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

计算两向量的旋转角

向量的点乘和叉乘都是很有用的数学工具,不过他们也有局限性。关键是向量点乘可以得到两个向量之间的夹角, 而不是旋转角,这个角度是没有方向的,范围是[0-pi], 而这往往不是我们想要的, 实际问题中我们常常要计算从向量p1沿逆时针方向转到与向量p2方向一致的确切角度,我把这个角度定义为旋转角。 旋转角的计算既需要夹角,还需要两个向量的叉乘, 以确定p1和p2的角度方向关系。 关于叉乘符号与向量的角

Tan 6034

QGroundControl或者华科尔地面站安装完打不开问题解决

QGroundControl 华科尔 打不开

wv112406的博客 4886

1. Klipper从安装到运行

本文记录Klipper固件从安装,配置到运行的详细过程

weixin_42098934的博客 1万+

Garham算法

计算几何(凸包) 凸包的定义:点集Q的凸包是一个最小的凸多边形P,满足Q中每个点都在P的边界或者内部。通俗来讲,就是在一个平面上钉上n个钉子,然后用一根橡皮筋将所有钉子都围住,最后橡皮筋所构成的一个凸多边形。(下面主要讲解用Graham算法求凸包) Graham算法 找到平面上最靠近左下角的点(设为S0S_0S0​) 将其他点按极角(以S0S_0S0​为顶点向水平向右方向引一条射线,其他点与S0S_0S0​连线和该水平射线所成角即为该点的极角)排序 ...

qq_51682942的博客 947

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2726

【计算几何】凸包之graham算法(适合小白)

计算几何–凸包(graham算法实现) 题目链接:LeetCode587 https://leetcode-cn.com/problemset/all/ 题目描述 在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。你需要找到正好位于栅栏边界上的树的坐标。 示例 1: 输入: [[1,...

qq_16016913的博客 1959

博通PEX89000 PCIe 5.0交换芯片:如何为AI集群构建高效GPU互联架构

本文深入解析了博通PEX89000 PCIe 5.0交换芯片如何为AI集群构建高效的GPU互联架构。该芯片通过提供高带宽、低延迟的PCIe 5.0交换能力,打破传统GPU通信的带宽瓶颈,并支持多主机共享、资源池化及软件定义拓扑,从而显著提升大规模AI训练与推理任务的效率与资源利用率。

weixin_29214559的博客 409

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

算法作业-凸包问题-Graham方法

给定平面上n(n≥3)个点的集合P,求P的一个最小子集Q,使得Q中的点能构成的一个包围P中所有点的多边形。请设计一种贪心算法求解此问题,并证明你所设计的贪心策略的正确性,分析算法的时间复杂度。解:Graham算法基本思路:1,选择P中y坐标最小的点为起始点p0,若有多个这样的点则进一步选取其中x坐标最小的点为p0;2,设&lt;p1,p2,……,pm&gt;是P中剩余的点,对其按逆时针方向相对p0...

章小幽的博客 2629

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

凸包 graham 算法

<!-- p {margin-bottom:0.21cm} --> 向量: 1.向量的内积(数量积,点乘): 公式:a· b = |a| * |b| cos=a.x* b.y + b.x * a.y 2.向量的外积(向量积,差乘): 公式

JAVASUI的专栏 1万+

《用 R 探索医药数据科学》目录(持续更新,已超 250 万字)|订阅前说明

我们重磅推出《用 R 探索医药数据科学》专栏!本文作为专栏【订阅后首读】的核心内容,堪称开启学习之旅的 “入门钥匙”,也是整个专栏最关键的一篇指引文。文中不仅完整呈现了专栏 9 大核心篇章 + 问答板块的详细目录,更囊括了订阅后必知的核心要点 —— 从阅读设备、实操工具的使用建议,到学习路径、更新规则的清晰说明,再到问题反馈、感悟记录的实用方法,一站式帮你摸清专栏框架、找准学习方向。建议各位订阅者务必认真阅读、吃透内容,这能让你后续的学习更高效、少走弯!

MD Code 1万+

02-Redis 核心特性与数据结构详解:揭秘高性能的技术内核

本文深度拆解 Redis 高性能的技术内核:揭秘其凭“内存存储 + C 语言开发” 实现微秒级延迟、10 万 + QPS 的性能优势;详解 5 种基础数据类型(String/Hash 等)与 4 种扩展数据类型(Stream/Geospatial 等)的特性及场景;还介绍多语言支持、RDB/AOF 持久化、主从复制 / 哨兵 / 集群等高可用方案,助读者掌握 Redis 技术核心与实践逻辑。

蜗牛老师,专注编程领域 995

graham 算法计算平面投影点集的凸包

graham 算法计算点集凸包,附 matplotlib 可视化

Don_tknowwhat的博客 1294

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

凸包——Graham-Scan算法

Graham-Scan算法是一种灵活的凸包算法,时间复杂度是O(nlogn) 算法细节: 1. 选出最左下角的点(排序:x最小,其次是y最小) 2. 其余点按极角排序,在极角相等的情况下距离极点(p[0])最近的优先 3. 用一个栈(数组)存储凸包上的点,先把p[0],p[1]压入栈。 4. 扫描每一个点,用叉积判断新点和栈顶头两个点形成的拐向。顺时针就弹出栈顶元素,继续判断。否则压入新

theArcticOcean 5725

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

凸包检测介绍及Graham算法实现

本文介绍凸包检测的概念,并介绍和实现了Graham算法.

qq_20604231的博客 1557

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Graham Scan凸包算法全面解析

Graham Scan凸包算法是一种高效的计算几何方法,由罗纳德·格雷厄姆于1972年提出,用于在二维平面上找到点集的最小凸多边形。该算法通过选择基准点、极角排序和栈扫描三个核心步骤,时间复杂度为O(n log n),适用于大规模点集处理。凸包在计算机图形学、图像处理、路径规划和军事模拟等领域有广泛应用。算法实现中,基准点选择、极角排序和栈扫描是关键步骤,通过向量叉积判断转向方向,确保凸包的凸性。算法在处理共线点等特殊情况时需特别注意,多线程优化和共线点预处理策略可进一步提高效率。Graham Scan算法

weixin_45422672的博客 1970

凸包算法Graham扫描法

凸包算法(Graham扫描法) 转载自 SZUhg https://www.cnblogs.com/wpbing/p/9456240.html 叉乘与线段相交 判断一个点是否在一条线段的左边还是右边,可以用叉乘来判断,或者判断两条线段是否相交 凸包、Graham扫描法 1.在平面上一些散乱的点,首先找到这些点中处于最左下方的点。 2.对这些点进行排序。把按照极角(polar angle)从小到大...

tyl532667325的博客 584

凸包算法(Graham扫描法)

目录 一、概念 二、算法步骤 三、代码实现 转自:https://www.cnblogs.com/aiguona/p/7232243.html 一、概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(X1,...Xn)的线性组合来构造. 在二维欧几里得空...

よろしくお願いします 1万+

【凸包模板】Graham算法、Andrew算法

参考:http://blog.youkuaiyun.com/bone_ace/article/details/46239187 主要是学习Granham算法,复杂度O(nlogn); 具体的算法过程可以参考上面的链接; 这里只提一个知识点:叉积 A x B 的值为正,则如上图所示,oab左旋,点b再向量oa左侧! 1.极角排序--Graham算法 const int max

Hi_jiaxinwei的博客 1164

Graham算法解决凸包问题

Graham算法解决凸包问题 模板题,题目来自洛谷如下。 圈奶牛【模板】二维凸包 题目简要描述 给定一些点,求凸包的周长。 输入格式 输入数据的第一行是一个整数。表示农夫约翰想要围住的放牧点的数目n。 第 $ 2 $ 到第 (n+1)(n + 1)(n+1) 行,每行两个实数,第 (i+1)(i + 1)(i+1) 行的实数 $ xi, yi $分别代表第 iii 个放牧点的横纵坐标 输出格式 输出输出一行一个四舍五入保留两位小数的实数,代表围栏的长度。 输入输出样例 //输入 4 4 8 4 12 5

a884322916的博客 373

HDUOJ 1392凸包graham算法

#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int Max = 1100; struct Point ...

dikuimei3153的博客 255

Graham扫描凸包算法

扫描过程: 从第三个点开始,按照排序后的顺序逐个处理每个点。下面,我将提供一个简单的凸包算法实现,基于Graham扫描算法。Graham扫描算法的基本思想是通过选择一个特殊的起点,将点集按照极角排序,然后通过栈的操作来逐步构建凸包。,其中n是点的数量。该算法的优势在于其相对简单的实现和较好的性能。然而,需要注意的是,在特定情况下,例如存在大量共线点的情况下,算法的性能可能会有所下降。通常选择最下面且最左边的点,以确保算法的稳定性。构建凸包: 扫描完成后,栈中的点就是凸包的顶点,它们按照逆时针方向排列。

言午日月 781
下一篇: 计算几何基础_多边形面积
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值