首页 > 其他分享 >【计算几何】极角序

【计算几何】极角序

时间:2024-04-26 20:33:05浏览次数:22  
标签:Point int 半轴 极角 计算 几何 平面 排序 极角序

极坐标系

元素:

· 极点:O
· 极轴:/vec OL
· 极径:r
· 极角:image 注意是逆时针
· 极坐标:image

极坐标系与直角坐标系的转化:

r=dist(o,c)
/fi = tan(y,x);

极角排序

半平面内的极角排序(排序范围严格小于180°)

使用to-left测试(叉积比较),值越大的越在上方(对于右半平面来言)
必须严格小于!!因为极角大于等于180的时候to-left检测正好相反

全平面内的极角排序

法一:使用atan2(y,x)函数

不用tan(y,x)(因为会出现inf之类的情况)
先将所有点的极角算出来,然后按极角的值进行排序
注意边界点的值:
image
存在精度问题

法二:叉积比较
先划分上下平面,平面内进行叉积比较
注意:x轴正负半轴的点不能划分到同一平面内
下半平面 < 原点 < x正半轴 < 上半平面 < x负半轴
常数略大,但是基本无精度误差(因为基于整数域)

应用:

  1. 求凸包
  2. 半平面交

题目类型:

  1. 直线的旋转
  2. 平面整体旋转
  3. 利用极角序计数

题目技巧:

  1. 当过两个端点的时候可以固定一个端点然后极角排序,维护一个那些东西在区间内
  2. 巧妙利用对称(可以有效的降低常数)

code:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
#define int long long
#define endl "\n"
struct Point{
	int x,y;
	void input(){cin>>x>>y;};
	void output(){cout<<x<<' '<<y<<endl;};
};
int to_left(Point b,Point c){
	Point a={0,0};
	Point X={b.x-a.x,b.y-a.y},Y={c.x-a.x,c.y-a.y};
	int ans=X.x*Y.y-X.y*Y.x;//差积
	if(ans==0)return 0;
	else if(ans>0)return 1;//c比b高
	else return -1;
}
bool cmp(Point a,Point b){
	int res=to_left(a,b);
	if(res==0)return a.y<b.y;
	return res>0;
}
void sol(){
	int n;
	cin>>n;
	vector<Point>v[5];//分别为 负半平面 x正半轴 原点 正半平面 x负半轴
	Point p;
	for(int i=1;i<=n;i++){
		p.input();
		if(p.x==0 && p.y==0)v[2].push_back(p);
		else if(p.y==0){
			if(p.x>0)v[1].push_back(p);
			else v[4].push_back(p);
		}
		else if(p.y<0)v[0].push_back(p);
		else v[3].push_back(p);
	}
	for(int i=0;i<=4;i++){
		sort(v[i].begin(),v[i].end(),cmp);
		for(auto j:v[i]){
			j.output();
		}
	}
}
signed main(){
	// ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	sol();
}

标签:Point,int,半轴,极角,计算,几何,平面,排序,极角序
From: https://www.cnblogs.com/muyi-meow/p/18155649

相关文章

  • 电子科技大学 计算机科学与技术 就读体验
    已经在UESTC度过了第四个年头,也马上要毕业了,确实值得回味下,也发表一下我对UESTC整个的看法。个人经历20年疫情爆发,强基出台,非国赛的竞赛全部作废。当时第一志愿是北理工,但是北理工搞了个自选专业的政策把投档线拉到了661,我裸分660没上去,走了第二志愿电子科大,擦线进了cs小类......
  • 云计算运维day3
    云计算运维day3花括号用法一次性在同级目录,创建多个文件关于进程号第二个数字是进程号id,不断变化表示是每一次都生成了新的进程,也就是该grep是临时生成的。mkdir{hx,wjq,hw}rm{hx,wjq}touch玩家{1..100}.log压缩和解压缩的概念打包,默认是没有压缩功能,不节省磁盘空间......
  • 目标检测与追踪AI算法模型及边缘计算智能分析网关V4的算法应用
    目标检测与追踪是计算机视觉领域中的一个重要任务,主要用于识别图像或视频中的目标,并跟踪它们的运动轨迹。针对这一任务,有许多先进的AI算法模型,例如:YOLO(YouOnlyLookOnce):一种实时目标检测算法,通过单个神经网络模型实现对图像中多个目标的检测和定位。FasterR-CNN:基于深度学习......
  • 盘点安防监控市场常见的AI视频智能分析边缘计算硬件及其特点分析
    在当今数字化时代,视频智能分析边缘计算技术及其硬件产品正逐渐崭露头角,成为众多行业领域的得力助手。视频AI智能分析边缘计算硬件是一种专门设计用于实现视频分析和边缘计算的硬件设备。它通常具有高性能的处理器、专门的图形处理单元(GPU)、内存和存储设备,以及专门定制的算法和软件......
  • 01. 计算机运行原理
    【二进制数据】全球所有人都习惯使用十进制数,也许是因为远古时期人类使用手势交流的原因,人类使用十个手指表示十个数据。中文使用一、二、三、四、五、六、七、八、九、十表示十个基础数字,并使用零表示没有任何数据,单个数字表示的数据范围是有限的,超过上限就使用多个数字的组合......
  • 计算机基础知识
    计算机基础知识导航目录计算机基础知识导航一、数的转换进位计数制系统基本概念R进制-->十进制十进制-->R进制数据的储存单位二进制的算术运算二进制的逻辑运算二、数据的表示机器数三、计算机的基本组成运算器控制器基本概念指令、寻址方式指令寻址方式流水线流水线多级存储结......
  • 计算机为什么需要中断?
    //generatedbyChatGPT-3.5&hk416hasu 中断是计算机系统中一种重要的机制,它允许系统在执行过程中临时中止当前任务,转而处理其他优先级更高或更紧急的任务,然后再返回原来的任务。以下是一些计算机需要中断的原因: 1.响应外部事件:计算机系统需要能够响应各种外部......
  • 戴森球计划:关于打帆星距离与建筑效率的精确计算
    来源贴吧:作者:wolray日期:2024-03-05结论放开头:由于俯仰角限制,打帆建筑效率(可打帆建筑面积与球面占比)的极限最大值为35.9%,星球轨道越远,太阳帆轨道半径越大,越接近该值,但变化微乎其微。最佳打帆策略:离恒星最近的潮汐锁定星,打最小轨道的帆。该结论与小马哥的文章网页链接完全一致。......
  • 抖音的倒水问题, 计算机bfs求解
    暴力求解bfs方法.并且找到的一定是最少步骤问题:抖音上面又来了一个倒水游戏例子:3个杯子,容量12,9,5上来12是满的.然后都没有刻度只能倒到一个满这种倒法,然后最后希望倒出2个6ml的.#抖音上面又来了一个倒水游戏#例子:3个杯子,容量12,9,5上来12是满的.然......
  • 软件开发与创新第二次实验———结对编程:计算出题系统
    一.结对信息2252418盛宇伟2252436董朝二.题目要求小学老师要每周给同学出300道四则运算练习题。这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython两个运算符,100以内的数字,不需要写答案。需要检查答案是否正确,并......