首页 > 其他分享 >计算几何板子

计算几何板子

时间:2023-11-21 16:55:34浏览次数:22  
标签:return double back 板子 计算 几何 operator friend size

#define i128 long long
inline i128 ABS(i128 x){return x<0?-x:x;}
struct frac{
	i128 x,y;
	frac(){}
	frac(i128 xx,i128 yy=1ll):x(xx),y(yy){
		if(y<0)x=-x,y=-y;
	}
	friend frac operator +(frac a,frac b){return frac(a.x*b.y+a.y*b.x,a.y*b.y);}
	friend frac operator -(frac a,frac b){return frac(a.x*b.y-a.y*b.x,a.y*b.y);}
	friend frac operator *(frac a,frac b){return frac(a.x*b.x,a.y*b.y);}
	friend frac operator /(frac a,frac b){return a*frac(b.y,b.x);}
	friend bool operator <(frac a,frac b){return a.x*b.y<b.x*a.y;}
	friend bool operator >(frac a,frac b){return a.x*b.y>b.x*a.y;}
	friend bool operator <=(frac a,frac b){return !(a>b);}
	friend bool operator >=(frac a,frac b){return !(a<b);}
	friend bool operator ==(frac a,frac b){return a.x*b.y==b.x*a.y;}
	friend bool operator !=(frac a,frac b){return !(a==b);}
	frac operator - () {return frac(0)-x;}
};
struct P{
	int x,y;
	P(int x=0,int y=0):x(x),y(y){}
	P&operator +=(P o){return x+=o.x,y+=o.y,*this;}
	P&operator -=(P o){return x-=o.x,y-=o.y,*this;}
	P&operator *=(int o){return x*=o,y*=o,*this;}
	P&operator /=(int o){return x/=o,y/=o,*this;}
	friend P operator +(P a,P b){return a+=b;}
	friend P operator -(P a,P b){return a-=b;}
	friend P operator *(P a,int b){return a*=b;}
	friend P operator /(P a,int b){return a/=b;}
	friend bool operator <(P a,P b){return a.x==b.x?a.y<b.y:a.x<b.x;}
	friend int operator *(P a,P b){return a.x*b.x+a.y*b.y;} // dot
	friend int operator %(P a,P b){return a.x*b.y-a.y*b.x;} // cross
	inline double ang(){return atan2(y,x);}
	inline double l(){return sqrt((*this)*(*this));}
};
const double eps=1e-10,pi=3.14159265358979323846;
struct P{
	double x,y;
	P(double x=0,double y=0):x(x),y(y){}
	P&operator +=(P o){return x+=o.x,y+=o.y,*this;}
	P&operator -=(P o){return x-=o.x,y-=o.y,*this;}
	P&operator *=(double o){return x*=o,y*=o,*this;}
	P&operator /=(double o){return x/=o,y/=o,*this;}
	friend P operator +(P a,P b){return a+=b;}
	friend P operator -(P a,P b){return a-=b;}
	friend P operator *(P a,double b){return a*=b;}
	friend P operator /(P a,double b){return a/=b;}
	friend bool operator <(P a,P b){return fabs(a.x-b.x)<eps?a.y<b.y:a.x<b.x;}
	friend double operator *(P a,P b){return a.x*b.x+a.y*b.y;} // dot
	friend double operator %(P a,P b){return a.x*b.y-a.y*b.x;} // cross
	inline void spin(double o){double s=sin(o),c=cos(o),xx=x*c-y*s,yy=x*s-y*c;x=xx,y=yy;}
	inline double ang(){return atan2(y,x);}
	inline double l(){return sqrt((*this)*(*this));}
	void in(){cin>>x>>y;}
};
inline double d(P a,P b){return (a-b).l();}
struct line{
	P a,b;double c;
	line(){}
	line(P a,P b):a(a),b(b){c=b.ang();}
	friend P operator * (line a,line b){return a.a+a.b*(b.b%(a.a-b.a)/(a.b%b.b));}
	friend bool operator <(line a,line b){return fabs(a.c-b.c)<eps?(b.a-a.a)%a.b<0:a.c<b.c;}
};
P dir(line a){
	return a.b/(a.b.l());
}

double dis(line a,P b){
	return (((b-a.a)%a.b)/(a.b.l()));
}

struct cir{
	P o; double r;
	bool operator <(const cir&b)const{return r<b.r;}
};
vector<P>convex(vector<P>o){
	sort(o.begin(),o.end());
	int n=o.size();
	vector<P>p;
	For(i,0,n-1){
		while(p.size()>1&&(p.back()-p[p.size()-2])%(o[i]-p[p.size()-2])<eps) p.pop_back();
		p.pb(o[i]);
	}
	int m=p.size();
	Rep(i,n-2,0){
		while(p.size()>m&&(p.back()-p[p.size()-2])%(o[i]-p[p.size()-2])<eps) p.pop_back();
		if(i)p.pb(o[i]); 
	}
	return p;
}
vector<P>halfplane(vector<line>l)
{
	vector<P>res;
	sort(l.begin(),l.end());
	deque<P>p; deque<line>q;
	for(auto o:l){
		while(p.size()&&(p.back()-o.a)%o.b>0) q.pop_back(),p.pop_back();
		while(p.size()&&(p.front()-o.a)%o.b>0)q.pop_front(),p.pop_front();
		if (q.size()&&fabs(o.b%q.back().b)<eps){
			if (fabs(o.b.ang()-q.back().b.ang()) > eps)
				return p.clear(),res;
			q.pop_back(); if(p.size())p.pop_back();
		}
		if(q.size())p.pb(q.back()*o); q.pb(o); 
	}
	while(p.size()&&(p.back()-q.front().a)%(q.front().b)>0)
		q.pop_back(),p.pop_back();
	if(q.size()<3)p.clear();
	else p.pb(q.front()*q.back());
	while(p.size())res.pb(p.front()),p.pop_front();
	return res;
}

标签:return,double,back,板子,计算,几何,operator,friend,size
From: https://www.cnblogs.com/Rainbowsjy/p/17698303.html

相关文章

  • 百度搜索万亿规模特征计算系统实践
    作者|Jay导读本文主要介绍百度搜索在全网万亿级规模内容做内容理解的工程实践,涉及机器学习工程化、资源调度、存储优化等多个Topic。全文6648字,预计阅读时间17分钟。01业务背景百度收录了互联网海量内容,要索引这些内容,需要先对内容做深度理解,提取包括内容语义、内容质量、内容安......
  • 科学计算时如何正确的使用超线程CPU——使用超线程CPU进行计算密集型任务时的注意事项
    现在这个AI火热的时代科学计算任务占比越来越大,但是平时使用时也有一些不为人注意的地方需要知道,本文就讨论一下使用超线程CPU时的注意事项。 超线程CPU就是现在的多线程CPU,以Intel和AMD的X86CPU为例,一个10个物理核心的CPU则有20个逻辑核心,其中多出来的10个核心就是超线程架构......
  • 隐私计算真的是一项变革性技术么?
    原文地址:TheBusinessCaseforPrivacyEnhancingTechnologies原文作者:EllisonAnneWilliams翻译&整理:开放隐私计算&PrimiHub在一个科技热点层出不穷的时代,当一项技术被描述为变革性技术时,其实人们第一时间反而是警惕,然后是质疑。最近几年变革性技术这个标签落在了隐......
  • 可视化学习:利用向量计算点到线段的距离并展示
    本文可配合本人录制的视频一起食用。引言最近我在学可视化的东西,借此来巩固一下学习的内容,向量运算是计算机图形学的基础,这个例子就是向量的一种应用,是利用向量来计算点到线段的距离,这个例子中可视化的展示采用Canvas2D来实现。说起向量,当时一看到这个词,我是一种很模糊的记忆;这......
  • 使用Java与MySQL开发计算器
    [实验目的]1.掌握软件开发的基本流程2.掌握常用的软件开发方式和工具。[实验内容]设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。[实验环境及开发工具]使用MicrosoftVisio作绘图工具使用......
  • 【C语言】计算整型和无符号整型的取值范围
    #include<stdio.h>intmain(){inta=0,b=1;while(a<b){a++;b++;}printf("%d\n",a);printf("%d\n",b);}#include<stdio.h>intmain(){......
  • 什么是计算机软件设计领域的 Edge Case
    在软件设计领域,EdgeCase(边缘情况)是一个重要的概念。简单来说,EdgeCase是指在系统的输入、操作或使用环境达到一些极限或者特殊情况时的场景。这些场景通常在正常使用条件下不太可能出现,但是如果发生,可能会导致系统行为异常,比如性能下降、功能失效,甚至系统崩溃。因此,在设计和测试......
  • 基于springboot的七彩云南文化旅游网站-计算机毕业设计源码+LW文档
    摘 要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,七彩云南文化旅......
  • 基于springboot的太原学院商铺管理系统-计算机毕业设计源码+LW文档
    摘 要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......
  • 基于Springboot的小区疫情购物系统-计算机毕业设计源码+LW文档
    摘 要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......