Basic template

一个基础型模板包括一个向量的实现

DATE: 2015-06-01

#define op operator
#define __ while
#define _0 return
typedef long long ll;
inline ll _(ll a,ll b){ll t;__(a){t=a;a=b%a;b=t;}_0 b;}
struct frac{ll u,d;frac(ll u=0,ll d=1):u(u),d(d){}frac op()(){ll _1=_(u,d);_0 frac(u/_1,d/_1);}frac op*(frac b){_0 (frac(u*b.u,d*b.d))();}frac op/(frac b){_0 (frac(u*b.d,d*b.u))();}frac op*(ll n){_0 (frac(u*n,d))();}frac op/(ll n){_0 (frac(u,d*n))();}frac op[](ll n){_0 frac(u*n,d*n);}frac op+(ll n){_0 frac(u+d*n,d);}frac op-(ll n){_0 frac(u-d*n,d);}frac op+(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u+_2.u,_1.d))();}frac op-(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u-_2.u,_1.d))();}void op=(ll b){d=1,u=b;}ll op()(frac b){return u*b.d-d*b.u;}//<=>bool op==(frac b){return u==b.u&&d==b.d;}bool op>(frac b){return b(*this)<0;}bool op<(frac b){return b(*this)>0;}
};
frac op/(ll a,frac b){_0 (frac(b.d*a,b.u))();}
frac op-(ll a,frac b){_0 frac(a)-b;}
frac op+(ll a,frac b){_0 frac(a)+b;}
frac op*(ll a,frac b){_0 (frac(a*b.u,b.d))();}
typedef struct vec{frac x,y;vec(frac x,frac y):x(x),y(y){};vec op+(vec b){_0 vec(x+b.x,y+b.y);}vec op-(vec b){_0 vec(x-b.x,y-b.y);}vec op*(frac b){_0 vec(x*b,y*b);}vec op/(frac b){_0 vec(x/b,y/b);}vec op*(ll b){_0 vec(x*b,y*b);}vec op/(ll b){_0 vec(x/b,y/b);}frac op*(vec b){_0 x*b.y-y*b.x;}//cross productfrac op[](vec b){_0 x*b.x+y*b.y;}//dot productbool op==(vec b){_0 x==b.x&&y==b.y;}//equality test
} point;

本模板风格可能引起不适>_<

其实,用'[]'做dot product是因为C++中无法重载'.'运算符,而在大多数动态语言(比如javascript)中'.'与'[]'的作用几乎相等,且在javascript'.'是一个'[]'的语法糖.

frac里就直接乱凑剩下的符号了>_<

有错误的话请提出来>_<...

Polygon & convex hull

Andrew法凸包.

#include <cstdio>
#include <malloc.h>
#include <cstring>
#include <algorithm>
#define op operator
#define __ while
#define _0 return
typedef long long ll;
using namespace std;
inline ll _(ll a,ll b){ll t;__(a){t=a;a=b%a;b=t;}_0 b;}
struct frac{ll u,d;frac(ll u=0,ll d=1):u(u),d(d){}frac op()(){ll _1=_(u,d);if(d/_1<0)_1=-_1;_0 frac(u/_1,d/_1);}frac op*(frac b){_0 (frac(u*b.u,d*b.d))();}frac op/(frac b){_0 (frac(u*b.d,d*b.u))();}frac op*(ll n){_0 (frac(u*n,d))();}frac op/(ll n){_0 (frac(u,d*n))();}frac op[](ll n){_0 frac(u*n,d*n);}frac op+(ll n){_0 frac(u+d*n,d);}frac op-(ll n){_0 frac(u-d*n,d);}frac op+(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u+_2.u,_1.d))();}frac op+(frac b){frac _1=(*this)[b.d],_2=b[d];_0 (frac(_1.u-_2.u,_1.d))();}void op=(ll b){d=1,u=b;}ll op()(frac b){return u*b.d-d*b.u;}//<=>bool op==(frac b){return u==b.u&&d==b.d;}
}
frac op/(ll a,frac b){_0 (frac(b.d*a,b.u))();}
frac op-(ll a,frac b){_0 frac(a)-b;}
frac op+(ll a,frac b){_0 frac(a)+b;}
frac op*(ll a,frac b){_0 (frac(a*b.u,b.d))();}
typedef struct vec{frac x,y;vec(frac x,frac y):x(x),y(y){};vec op+(vec b){_0 vec(x+b.x,y+b.y);}vec op-(vec b){_0 vec(x-b.x,y-b.y);}vec op*(frac b){_0 vec(x*b,y*b);}vec op/(frac b){_0 vec(x/b,y/b);}vec op*(ll a){_0 vec(x*b,y*b);}vec op/(ll b){_0 vec(x/b,y/b);}frac op*(vec b){_0 x*b.y-y*b.x;}//cross productfrac op[](vec b){_0 x*b.x+y*b.y;}//dot productbool op==(vec b){_0 x==b.x&&y==b.y;}//equality test
} point;
bool pcmp(const point& p1,const point& p2){ll a=p1.x(p2.x);if(a>0) return false;if(a<0) return true;return p1.y(p2.y)<0;
}
struct polygon{point* p;int n,s;polygon(int k,point* q){s=(n=k)<<1;p=(point*)malloc(s*sizeof(point));for(int i=0;i<n;++i) p[i]=q[i];}inline void sizeup(int q){s<<=1;if(s>q){free(p);p=(point*)malloc(s*sizeof(point));}}inline void copy(polygon a){while(a.n>s){sizeup(a.n);}n=a.n;for(int i=0;i<n;++i) p[i]=a.p[i];}void op=(polygon a){copy(a);}void op=(polygon* a){copy(*a);}frac area(){frac area(0,1);for(int i=1;i<n-1;++i) area+=(p[i]-p[0])*(p[i+1]-p[0]);return area/2;}void sort(){sort(p,p+n,pcmp);}
}
struct convex_hull{polygon pol;//convex hull is also a polygonconvex_hull(polygon* x){pol=x;polygon pol2=x;pol2.sort();int m=0;for(int i=0;i<pol2.n;++i){while(m>1 && ((pol.p[m-1]-pol.p[m-2])*(pol2.p[i]-pol.p[m-2]))(frac(0,1))<0ll) m--;pol.p[m++]=pol2.p[i];}int k=m;for(int i=pol2.n-2;~i;--){while(m>1 && ((pol.p[m-1]-pol.p[m-2])*(pol2.p[i]-pol.p[m-2]))(frac(0,1))<0ll) m--;pol.p[m++]=pol2.p[i];}if(pol2.n>1) m--;pol.n=m;}
}
int main(){return 0;
}

直接convex_hull(polygon)就求好凸包了>_<

凸包就是一个多边形嘛,就是凸的>_<

转载于:https://www.cnblogs.com/tmzbot/p/4544920.html

ZBT的计算几何模板相关推荐

  1. (转)计算几何模板 - kuangbin

    转自:https://kuangbin.github.io/2019/04/28/20190428/#more 二维几何 // `计算几何模板` const double eps = 1e-8; co ...

  2. 计算几何模板中的代码

    计算几何模板代码选自kuangbin 7 计算几何 7.1 二维几何 // `计算几何模板` const double eps = 1e-8; const double inf = 1e20; con ...

  3. 三维几何 --- 计算几何模板

    计算几何模板 全是纯干货,方法理解可查阅算法入门到进阶一书 ! #include <bits/stdc++.h>using namespace std; typedef long long ...

  4. 【总结】计算几何模板

            计算几何模板 1.   几何公式 1.1 角: 1.正弦定理: a/sinA = b/sinB = c/sinC = 2R 2.余弦定理: a² = b²+c²-2bc*cosA b² ...

  5. 计算几何模板(大神整理)

    不知道出处,转载的转载... 计算几何模板 目录: 1.计算几何 2 1.1 注意 2 1.2几何公式 2 1.3 多边形 4 1.4多边形切割 7 1.5 浮点函数 8 1.6 面积 14 1.7球 ...

  6. 数论六之计算几何干货——计算几何模板解释全集 及 模板检验训练场

    文章目录 点和向量及运算 直线和线段 求解点到直线的距离/点在直线上 求解点到线段的距离/点在线段上 求解两条线段是否相交 求解两直线的交点 多边形 求解多边形面积 求解多边形重心 求解判断定点与多边 ...

  7. hdu 4667 Building Fence 计算几何模板

    1 //大白p263 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #include ...

  8. BNU校赛总决赛J 小白兔小灰兔 相交计算几何模板

    J 小白兔小灰兔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K Special Judge, 64bit IO Format: %lld 题目描述 ...

  9. 二维几何基础大合集!《计算几何全家桶(一)》(基础运算、点、线、多边形、圆、网格)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 目录 1.基本运算 1.1 判断正负函数(sgn) 1.2 点积(数量积.内积)(Dot) 1.3 向量积 ...

最新文章

  1. jdk8飞行记录器配置
  2. 机器人产业的前途取决于人工智能关键技术的发展
  3. 关于Block Formatting Context--BFC和IE的hasLayout
  4. spring实战六之使用基于java配置的Spring
  5. Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法
  6. 速递|2021双11阿里云数据库技术快报
  7. maven2——设置镜像篇
  8. Design Compiler指南——设计综合过程
  9. mybatis+spring+c3p0+maven+ehcache
  10. php筛选怎么做,thinkphp条件筛选 例子
  11. Shell脚本学习-阶段三
  12. linux 命令行 光标移动技巧
  13. [NOIp2017 DG Day 2 T1] 奶酪
  14. (对拍配套)随机生成数据
  15. 第二次软件工程作业——模仿节奏大师官网制作的网页
  16. MYSQL数据库中导入中国各个省份编号和省份
  17. 直流电动机调速matlab,基于MATLAB龙门刨床直流电动机调速系统仿真研究
  18. c语言实验题数鸽子和兔子,[TZOJ] 平台训练-V1
  19. 螺栓扭矩查找表excel下载
  20. 《Head First Java》学习整理

热门文章

  1. 如何创建React项目
  2. 奇数点偶数点fft的matlab,电子科大 数字信号处理实验2_FFT的实现
  3. 如何在HTML中引用jQuery函数库
  4. 批量登录qq空间,点击推广链接,增加点击量
  5. 网络安全:DOM型XSS
  6. 三玖天下第一!让三玖陪你写代码(为VScode加入背景图片)
  7. Outlook邮件创建的规则失效,可能的原因
  8. 数据结构与算法——给定整数A1,A2,....An,....(可能有负数),求该数据序列的最大子序列的和
  9. APP被苹果App Store拒绝的79个原因(未完待续)
  10. 嵌入式Linux引导过程之1.4——Xloader的ddr_init