极角排序(主要用于凸包问题)

计算几何——极角排序 极角 在平面上任取一个顶点O,称为极点;作射线X,那么OX就是极轴。平面上任意一点和O点作向量,与OX形成的夹角就叫做极角。通常选定逆时针方向为正,一般我们以x轴为极轴,那么极角就是平面向量与x轴的夹角 极角排序 给定极轴,在平面上分布着若干点,将这些点相对于极轴的极角大小排序,就叫做极角排序。注意如果极角相同,那么需要按x升序处理 如下图,排序后的点集为ABCDEF 利用atan2(doub... 阅读详情

名词释义:

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标
极角排序有很多种方法而我认为只要会叉积一个就够了 之前长用atan2来写极角排序但是有些题目对数字精确性要高很多,所以用atan2会造成精度的损失,所以还是建议使用叉积的那种办法,毕竟在之后的凸包问题中 你还会遇到使用叉积的时候。

对了我们这里研究的极角在-π~π 上
接下来列举一下这些方法:

所有方法的前提:
定义结构体:

typedef struct P
{
     double x,y;
}P;

1.利用atan2()函数按极角从小到大排序

bool cmp1(P a,P b)//在这里一定要注意 atan2函数y写在逗号前 返回的极角范围为-π~π 
{
    if(atan2(a.y,a.x)==atan2(b.y,b.x))
       return atan2(a.y,a.x)<atan2(b.y,b.x);
    else
       return a.x<b.x;
}

2.利用叉积按极角从小到大排序

double compare(P a,P b,P c)
{
  return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
bool cmp2(P a,P b)
{
    P c;//极点(xx,yy)
    c.x=xx;
    c.y=yy;
    if(compare(c,a,b)==0)
        return a.x<b.x;
     else
     return compare(c,a,b)>0;
    
}

3.利用complex类按极角从大到小排序:(这种方法我也没用过 也不太懂)

bool cmp3(P a,P b)
{
  complex<double> c1(a.x,a.y);
  complex<double> c2(b.x,b.y);
  if(arg(c1)==arg(c2))
       return a.x<b.x;
    return arg(c1)<arg(c2);
}

在这里介绍一下 使用complex需要头文件
而 arg()函数返回的便是极角 范围也是-π~π
4.先按象限从小到大排序 再按极角从小到大排序

int Q(P a)//象限排序一定要加上坐标轴
{
  if(a.x>0&&a.y>=0) return 1;
  if(a.x<=0&&a.y>0) return 2;
  if(a.x<0&&a.y<0) return 3;
  if(a.x>0&&a.y<0) return 4;
}
bool cmp4(P a,P b)//先按象限大小排序 再按极角大小排序
{
  if(Q(a)==Q(b))
  return cmp1(a,b);
  else
    Q(a)<Q(b);
}

本文纯粹个人笔记 未经过自己一个一个套题验证 如有错误还望各位dalao指正包涵。

计算几何——凸包//极角排序//旋转卡壳 凸包卷包裹法极角排序存储排序方法atan2()函数叉积象限 凸包 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。 卷包裹法 先找一个最边缘的点(一般位于最下方,如果有多个点,则选择最左方的点),假设有一条绳子,以该点为端点向右边逆时针旋转直到碰到另一个点为止,此时找出凸包的一条边;然后再用新找到的点作为端点,继续旋转绳子,找到下一个端点;重复这一步骤直至围成一个凸多边形,即可得到这个点集的凸包。 时间. 阅读详情

相关推荐

python凸包问题

凸包问题 什么是凸包? 举个栗子吧 有很多钉子,钉在木板上。拿根猴皮筋,拉的足够大。一松开,“啪”一声,现在的猴皮筋就是凸包 凸包是什么 或者说,让这根猴皮筋尽量小,同时能把所有的钉子包含在内。 怎么求呢? 先插一段: 凸包属于计算几何,计算几何很大程度上基于一个东西,叫做叉积。 而且主要用的是判断是在左边还是在右边,叉积>0在左,=0在中,<0在右。 ...

小乌龟的博客 2489

极角排序

极角排序 这里的极角就是我们高数上所学习的极角坐标系中的极角(先来复习一下),极角坐标系中还包括极轴和极径,如下图: 其中射线OX叫做极轴,规定正方向(一般为逆时针方向)。点O于空间中一点M连接,所称角θ为极角,这条长度为ρ的线段叫做极轴,这两者组成坐标(ρ,θ)为点M在此坐标系下的极坐标。 极角排序就是根据极坐标对点进行排序的操作 极角排序的常用的三种方法 1.atan2()函数 atan2(...

Insist_77的博客 1936

凸包问题(Graham扫描法)

/** 凸包问题 —— Graham扫描法: 找出点集p[]中最下面的点(有多个时取最左边的),以该点为极点,求出其他所有点的极角, 显然,极角范围为 [0, 180)度,对这些点按极角的升序排序,也就是按极角的余切值降序排列, 先把极点和排序后的第一个点和第二个点入栈,再一次循环(i = 3 -> n-1),若栈顶的两个点和 当前的点p[i]这三点连线的方向向顺时针方向偏转,则栈顶元素出

小威的专栏 4661

【计算几何】 极角排序

在平面内取一个定点O,叫极点;引一条射线Ox,叫做极轴;再选定一个长度单位和角度的正方向(通常取逆时针方向)。则对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针,就是极角排序。

这里是阿安的博客 3072

哈理工OJ 1643 多边形-2【极角排序+凸凹包判断】

多边形-2 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 35(9 users) Total Accepted: 13(7 users) Rating:  Special Judge: No Description 任意给定一个多边形

mengxiang000000 1696

基于C语言的凸包算法实现

基于C语言的凸包算法实现 非计算机专业,代码有些的不好的地方,大佬轻喷^ _ ^ 根据要求,需要使用C语言实现凸包算法——Graham扫描法,本文将从算法理解、实现思路、遇到的问题及其解决方案三个方面来阐述实现过程。 算法理解 凸包算法Graham扫描法,在不考虑排序算法的时间复杂度情况下,算法核心程序的时间复杂度为 O(nlogn)O(n log n)O(nlogn),其主要算法思想如下: 首先是预处理过程,获得一组随机点集,选取位于二维空间中左下角的点,即在纵坐标(y)最小情况下横坐标(x)为最小的

weixin_43766126的博客 2275

几何:极角排序详解

关于极角排序:   在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。   对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。   那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针。 极角排...

dengguan2720的博客 1098

凸包算法

<br />   其实这个算法是在一年前得某场比赛中临时抱佛脚学的,今天重新的来温习了一遍<br />如何来理解凸包?一组平面上的点,求一个包含所有点的最小的凸多边形,这就是凸包问题了。这可以形象地想成这样:在地上放置一些不可移动的木桩,用一根绳子把他们尽量紧地圈起来,这就是凸包了,百度百科中的这张图很生动+活泼+形象,所以你懂的<br /><br />好说完这个我们首先要来了解下极角排序和左转判定<br />极角排序:就是选取一个最左的点,按y最小,其次x最小来定义,接下来所有的点针对该点的射线,<br

foreverlin1204的专栏 8960

HDU 1348 Wall(凸包模板题)

HDU 1348 Wall 题目链接 就是求出凸包,计算凸包周长,然后加上圆周长即可 代码:

Remilia's 966

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

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

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

openMVS ---dense point cloud(代码理解)

openMVS ---dense point cloud(代码理解)0 代码实现原理1 代码实现步骤1.1 参数传递1.2 loading .mvs数据1.3 稠密重建1.3.0 相关变量及概念1.3.1 ComputeDepthMaps(data) --计算多张深度图1.3.1.1. pre1.3.1.2 为每一张depth map Select view(s) !!!1.3.1.2.1 N neighbors --- global score + filter1.3.1.2.2 MRF ---- t

小rivaaaa的博客 5328

凸包和极角排序专题

算法专题poj 2007 Scrambled Polygon题目分析代码洛谷 2742 圈奶牛题目分析代码zoj 1453 hdu 1392 Surround the Trees题目分析代码poj 3348 Cows题目分析代码后续 poj 2007 Scrambled Polygon 题目 给你nnn个点,让你对于原点进行极角排序 分析 那么这个极角排序究竟有什么用呢,反正对于作者的理解,就是...

lemondinosaur的博客 1287

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

凸包 极角排序

const int maxn=1005; struct point{ int x; int y; point(){} point(int xx,int yy):x(xx),y(yy){} bool friend operator <(const point &a,const point &b){ if(a.x==b....

细雨欣然 449

Linux下搭建J-Link调试环境:OpenOCD+GDB实战指南

嵌入式开发中,调试器是连接开发主机与目标硬件的关键桥梁,其核心原理是通过标准协议(如JTAG/SWD)访问芯片内部的调试模块。GDB作为通用的调试客户端,通过远程协议与调试服务器通信,而OpenOCD则扮演了协议转换与硬件驱动的角色,实现了调试命令的翻译与执行。这种开源工具链的组合,为开发者提供了高度的定制化与自动化能力,尤其适合需要与持续集成流程深度结合的复杂项目。在实际应用中,针对特定芯片(如ARM7TDMI)进行正确的内存控制器与时钟初始化是成功调试的前提,这常常涉及对板级支持包的深入理解。本文以S3

weixin_29889665的博客 333

FSL软件安装

FSL软件安装

huang_tianyuan的博客 2630

10.1 叉积 ,极角排序,扫描法求凸包

凸包:用一个凸多边形将所有点围起来,这个凸多边形就是凸包 1.先要引入一个数学工具,向量叉积 |c|=|a×b|=|a| |b|sinα (α为a,b向量之间的夹角) 则 |c| 为向量a ,b所组成的平行四边形的面积 这里是用叉积判断两向量的相对位置关系(非常有用!) 则 a x b < 0 (a在b的逆时针方向 )...

weixin_30242907的博客 849

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1898

Codeforces 70D 动态凸包 (极角排序 or 水平序)

题目链接:http://codeforces.com/problemset/problem/70/D 本题关键:在log(n)的复杂度内判断点在凸包 或 把点插入凸包 判断:平衡树log(n)内选出点所属于的区域 插入:平衡树log(n)内选出点所属于的区域, 与做一般凸包的时候类似,分别以该点向左右两边进行维护, 一直删除不满足凸包的点,直到所有点满足凸包为止。 水平序:

Nicolas 3618

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4453

这一世,要学会二维凸包

重生小说?

达瓦里希,这里禁喵。 1364

真格量化-bs套利

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import * #开始时间,用于初始化一些参数 def OnStart(context) : context.myacc = None #登录交易账号 if context.accounts["回测期权"].Login() : co.

qq_26742269的博客 1320

极角排序+凸包

#include <cstdio> #include <algorithm> #include <cmath> using namespace std; int n; const int MAXN = 1e5 + 5; struct Point { double x, y; } p[MAXN], Stack[MAXN]; int Top = 0; bool cmp1(Point u, Point v) { if (u.y == v.y)retu.

dong_pope的博客 273

蓝牙模块HM-10手册

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 叉积(向量之间的计算)
下一篇: 凸包 +模板
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值