计算几何基础 模板
时间:2019-03-25
本文章向大家介绍计算几何基础 模板,主要包括计算几何基础 模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
计算几何拖了这么久,终于拖到省选前了。
参考:
https://oi.men.ci/geometry-notes/
https://www.cnblogs.com/fly-in-milkyway/p/10569895.html
https://blog.csdn.net/clover_hxy/article/details/53966405
https://www.cnblogs.com/lstoi/p/9791654.html
基础部分
#include <cmath>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e5+5;
const double eps=1e-10;
inline int dcmp(double x) {return fabs(x)<eps?0:x<0?-1:1;}
struct Vec
{
double x,y;
Vec(double x=0,double y=0):x(x),y(y) {}
Vec operator +(const Vec &a)const {return Vec(x+a.x, y+a.y);}
Vec operator -(const Vec &a)const {return Vec(x-a.x, y-a.y);}
Vec operator *(const double p)const {return Vec(x*p, y*p);}
double operator *(const Vec &a)const {return x*a.y-y*a.x;}//cross product
bool operator <(const Vec &a)const {return x<a.x||(x==a.x&&y<a.y);}
bool operator ==(const Vec &a)const {return !dcmp(x-a.x)&&!dcmp(y-a.y);}
double Norm() {return x*x+y*y;}//范数
double Length() {return sqrt(x*x+y*y);}//模长
double Dot(Vec a) {return x*a.x+y*a.y;}//dot product
double Angle(Vec a) {return acos(Dot(a)/Length()/a.Length());}//两向量夹角
Vec Normal() {double t=Length(); return Vec(-y/t,x/t);}//单位法向量
Vec Rotate(double rad) {return Vec(x*cos(rad)-y*sin(rad),x*sin(rad)+y*cos(rad));}
};
typedef Vec Point;
struct Line
{
Point a; Vec v;
Line(Point a,Vec v):a(a),v(v) {}
bool OnLine(const Point &p) {return !dcmp((a-p)*v);}//!dcmp((a-p)*(b-p))
bool OnSegment(const Point &p) {return !dcmp((a-p)*v)&&dcmp((a-p).Dot(a+v-p))<=0;}//PA*PB<=0
int Relation(const Line &l)//直线之间的关系 0:平行 1:相交 2:重合(无数个交点)
{
return dcmp(v*l.v)?1:dcmp(v*(a-l.a))?0:2;
}
Point Intersection(const Line &l)//直线交点
{
return a+v*(((a-l.a)*l.v)/(v*l.v));
}
};
inline bool cmp(const Point &a,const Point &b) {return a.x==b.x?a.y<b.y:a.x<b.x;}
struct Polygon
{
int sk[N];
std::vector<Point> ps;
bool Include(const Point &p)//点在多边形内
{
int cnt=0;
for(int i=0,lim=ps.size(); i<lim; ++i)
{
const Point a=ps[i],b=ps[i+1==lim?0:i+1];
if(Line(a,b-a).OnSegment(p)) return 1;
double d1=a.y-p.y,d2=b.y-p.y,tmp=(a-p)*(b-p);
if((tmp<0&&d1<0&&d2>=0)||(tmp>0&&d1>=0&&d2<0)) ++cnt;
}
return cnt&1;
}
double Area()//多边形有向面积(逆时针为正,顺时针为负)
{
double res=0;
for(int i=0,lim=ps.size(); i<lim; ++i)
res+=ps[i]*ps[i+1==lim?0:i+1];
return res*0.5;
}
int Convex()//求凸包 存在sk[]里
{
std::sort(ps.begin(),ps.end(),cmp);
int top=1,n=ps.size(); sk[1]=0;
for(int i=1; i<n; ++i)
{
while(top>=2 && (ps[sk[top]]-ps[sk[top-1]])*(ps[i]-ps[sk[top-1]])<=0) --top;
sk[++top]=i;
}
int k=top;
for(int i=n-2; ~i; --i)
{
while(top>k && (ps[sk[top]]-ps[sk[top-1]])*(ps[i]-ps[sk[top-1]])<=0) --top;
sk[++top]=i;
}
return top;
}
};
int main()
{
return 0;
}
凸包
极角排序
最小圆覆盖
旋转卡壳
半平面交
- python3.6抓取100知乎用户头像详解(四)
- 从运营商小广告到HTTPS
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
- 区块链:为什么它不仅仅是比特币?
- Java Mail(二):JavaMail介绍及发送一封简单邮件
- ASP.NET MVC Controller激活系统详解:总体设计
- .NET Core采用的全新配置系统[7]: 将配置保存在数据库中
- Selenium3+Python3环境部署
- Java Mail(三):Session、Message详解
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
- 四个问答让你秒懂区块链原理及应用
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
- 【机器学习实战】第11章 使用 Apriori 算法进行关联分析
- 【Scikit-Learn 中文文档】概率校准 - 监督学习 - 用户指南 | ApacheCN
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python实现在线翻译
- Python字符串格式化常用手段及注意事项
- PHP count_chars()函数讲解
- 浅谈keras使用中val_acc和acc值不同步的思考
- PHP安装BCMath扩展的方法
- keras实现多GPU或指定GPU的使用介绍
- 浅谈keras中的keras.utils.to_categorical用法
- python 使用多线程创建一个Buffer缓存器的实现思路
- keras.utils.to_categorical和one hot格式解析
- Python OpenCV读取中文路径图像的方法
- Java如何基于wsimport调用wcf接口
- Python装饰器结合递归原理解析
- Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
- 浅谈keras通过model.fit_generator训练模型(节省内存)
- PHP实现通过文本文件统计页面访问量功能示例