博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
阅读量:6973 次
发布时间:2019-06-27

本文共 2348 字,大约阅读时间需要 7 分钟。

//to update

一些基本的定义在这里:

自适应Simpson

凸包

Andrew 算法, 即分别求上, 下凸包. 时间复杂度 \(O(n \log n)\).

struct tvec{db x,y;};il int dcmp(db a){return fabs(a)<=eps?0:(a>0?1:-1);}il db p2(db a){return a*a;}il db gougu1(db a,db b){return sqrt(p2(a)+p2(b));}il tvec operator+(tvec a,tvec b){return (tvec){a.x+b.x,a.y+b.y};}il tvec operator-(tvec a,tvec b){return (tvec){a.x-b.x,a.y-b.y};}il tvec operator*(tvec a,db b){return (tvec){a.x*b,a.y*b};}il tvec operator*(db a,tvec b){return b*a;}il db operator*(tvec a,tvec b){return a.x*b.y-b.x*a.y;}il db operator^(tvec a,tvec b){return a.x*b.x+a.y*b.y;}il db len(tvec a){return gougu1(a.x,a.y);}bool cmp(tvec a,tvec b){int tmp=dcmp(a.x-b.x);return tmp?tmp<0:dcmp(a.y-b.y)<0;}tvec li[nsz],conv[nsz];int pc=0;void getconv(){    sort(li+1,li+n+1,cmp);    rep(i,1,n){        while(pc>1&&dcmp((conv[pc]-conv[pc-1])*(li[i]-conv[pc]))<=0)--pc;        conv[++pc]=li[i];    }    int tmp=pc;    repdo(i,n-1,1){        while(pc>tmp&&dcmp((conv[pc]-conv[pc-1])*(li[i]-conv[pc]))<=0)--pc;        conv[++pc]=li[i];    }    if(n>1)--pc;}

半平面交

增量法, 时间复杂度 \(O(n \log n)\) (排序的复杂度).

需要保证不是开放的半平面. 否则加上四个 \(\pm \infty\) 的平面即可.

细节较多. 详见代码...

const int psz=550;const db eps=1e-9;int n,m;db dcmp(db v){return fabs(v)<=eps?0:(v>0?1:-1);}db p2(db v){return v*v;}struct tvec{db x,y;};tvec operator+(tvec a,tvec b){return (tvec){a.x+b.x,a.y+b.y};}tvec operator-(tvec a,tvec b){return (tvec){a.x-b.x,a.y-b.y};}tvec operator*(tvec a,db b){return (tvec){a.x*b,a.y*b};}tvec operator*(db a,tvec b){return b*a;}db operator*(tvec a,tvec b){return a.x*b.y-a.y*b.x;}db operator^(tvec a,tvec b){return a.x*b.x+a.y*b.y;}db len(tvec a){return sqrt(p2(a.x)+p2(a.y));}struct tl{    tvec p,v;    db d;    tl(){}    tl(tvec a,tvec b):p(a),v(b-a){d=atan2(v.y,v.x);}}li[psz];int pl=0;bool operator<(tl a,tl b){return a.d
0;}il tvec inters(tl a,tl b){db v=(b.v*(a.p-b.p))/(a.v*b.v);return a.p+a.v*v;}tvec poly[psz];int ppo=0;tl que[psz]; //queuetvec qp[psz]; //intersect pointsint qh=1,qt=0;int hplane(){//0 fail, 1 success sort(li+1,li+pl+1); int pl1=1;//suppose that pl>=1 rep(i,2,pl){ if(li[i].d>li[pl1].d)li[++pl1]=li[i]; else if(isleft(li[pl1],li[i].p))li[pl1]=li[i]; } pl=pl1; qh=1,qt=0; rep(i,1,pl){ while(qh

旋转卡壳

这是一种拥有 \(4\) 个多音字, \(2^4 = 16\) 种读音的优秀算法.

转载于:https://www.cnblogs.com/ubospica/p/10828219.html

你可能感兴趣的文章
Oracle推出轻量级Java微服务框架Helidon
查看>>
腾讯云小微激活硬件生态,携合作产品正式亮相
查看>>
记TensorFlow项目开源一周年
查看>>
「镁客·请讲」1058VR钱朱平:VR泛娱乐的时代未到,不妨从更细分的行业切入
查看>>
刷新本地的DNS缓存数据
查看>>
AI、量子计算引爆硬科技创新,雷鸣、王海峰、施尧耘等北大120周年论道信科最前沿...
查看>>
为什么物联网和区块链彼此依赖?
查看>>
安卓Textview的getLineCount返回0
查看>>
Windows 2008 R2 Administrator access denied解决办法
查看>>
Faker:Python的伪造数据生成器
查看>>
(桌面虚拟化最佳实践--呼叫中心系统优化之四)瘦终端优化项目与其他优化项目...
查看>>
自学社交的人工智能,会不会有一天取人类而代之?
查看>>
centos 6.5下安装fpm打包工具
查看>>
微信的视频如何找到文件并发送到电脑
查看>>
ionic react-native和native开发移动app到底那个好
查看>>
Grid_Oracle Grid Infrastructure概念介绍(概念)
查看>>
分布式全局锁
查看>>
谈谈17年工业届三个热点词汇的个人见解
查看>>
VMware vSphere 6.5 配置文档
查看>>
LINUX学习(LINUX就该这么学)2
查看>>