【原创】计算几何的基本模板
来源:互联网 发布:line安卓版 无网络 编辑:程序博客网 时间:2024/05/19 02:44
计算几何的模板
有点和线(不分直线和线段),以及求两点距离、已知两点求两点连线解析式(仅支持一般式)、联立两条直线、求一点到直线距离、最近点对功能。
存代码而已,别太当真。
v1.1版本更新: 2017-07-25 增加了最近点对算法,将函数移至主函数下方,修改了部分注释
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const double INF=0x7fffffff;//坐标的边界(下界)const int MAXN=1000;//点的数量inline int Read(){ int p=0,f=1; char c=getchar(); while(c<'0' or c>'9') { if(c=='-') f=-1; c=getchar(); } while(c>='0' and c<='9') p=p*10+c-'0',c=getchar(); return p*f;}struct point{ double x,y; void ReadPoint()//读入一个点的横纵坐标 { x=Read()*1.0,y=Read()*1.0; } void SavePoint(double xx,double yy)//保存一个点的横纵坐标 { x=xx,y=yy; }};double length(point a,point b);//求两点间距离double slope(point a,point b);//求两点连线的斜率double intercept(double k,point a);//已知斜率和一个点,求截距struct line{ double len,k,b,tr;//len线段长度 k斜率 b截距 tr如果垂直于x轴,它的值 bool mk;//是否垂直于x轴 point u,v;//两个端点 void SaveLine(point zz,point wy)//已知两点求这两点连线的以上信息 { u=zz,v=wy; if(zz.x==wy.x) mk=1,tr=zz.x; else { mk=0; tr=0; len=length(zz,wy); k=slope(zz,wy); b=intercept(k,zz); } }};point ex(line p,line q);//联立两条直线,返回交点double dist(point a,line b);//求一个点到直线的距离/***********最近点对**************/bool greater_x(point a,point b);bool greater_y(int a,int b);int crl[MAXN];//最近点对的辅助数组double closest_pair(int l,int r);//最近点对的算法double pairpair();//最近点对主程序/***********最近点对*************/point p[MAXN];//点集int n;//点数/************************/int main(){}/*******主程序在这!*******//***********************/double length(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double slope(point a,point b){ return (a.y-b.y)/(a.x-b.x);}double intercept(double k,point a){ return a.y-k*a.x;}point ex(line p,line q){ point h; if(p.k==q.k) h.x=-INF,h.y=-INF;//平行则无交点 else if(p.mk==0) h.x=p.tr,h.y=q.k*h.x+q.b;//一条垂直于x轴,另一条不垂直 else if(q.mk==0) h.x=q.tr,h.y=p.k*h.x+p.b; else h.x=(p.b-q.b)/(q.k-p.k),h.y=p.k*h.x+p.b; return h;}double dist(point a,line b){ if(b.mk) return fabs(a.x-b.u.x); line c; c.k=-1/b.k; c.b=intercept(c.k,a); point p=ex(b,c); return length(a,p);}bool greater_x(point a,point b){ return a.x<b.x;}bool greater_y(int a,int b){ return p[a].y<p[b].y;}double closest_pair(int l,int r){ if(l+1==r) return length(p[l],p[r]); else if(l+2==r) return min(min(length(p[l],p[l+1]),length(p[l+1],p[l+2])), length(p[l],p[l+2])); int mid=(l+r)>>1,cnt=0; double ans=min(closest_pair(l,mid),closest_pair(mid+1,r)); for(int i=l;i<=r;i++) if(p[i].x>=p[mid].x-ans&&p[i].x<=p[mid].x+ans) crl[++cnt]=i; sort(crl+1,crl+1+cnt,greater_y); for(int i=1;i<=cnt;i++) for(int j=i+1;j<=cnt;j++) { if(p[crl[j]].y-p[crl[i]].y>=ans) break; ans=min(ans,length(p[crl[i]],p[crl[j]])); } return ans;}double pairpair(){ sort(p+1,p+1+n,greater_x); return closest_pair(1,n);}
阅读全文
0 0
- 【原创】计算几何的基本模板
- 计算几何基本模板
- 计算几何的基本代码模板
- 计算几何的模板
- 基本的计算几何
- 计算几何的一些模板
- 计算几何的基本应用~~~~
- [模板]计算几何模板
- 求凸包的周长(计算几何模板)
- 计算几何的模板(大神整理)
- 计算几何:非规范相交的模板
- 计算几何:点积的模板
- 计算几何入门的几个模板
- 浅谈计算几何的模板集合
- <模板><计算几何>凸包及其基本算法
- 经典计算几何模板
- 计算几何模板2
- 计算几何 模板
- Java笔记
- 让WordPress自带html5播放器-视频播放器调用代码详解,支持ios
- python logging 日志详细配置
- 利用HBuilder将vue项目打包成移动端app
- 单目运算符、双目运算符
- 【原创】计算几何的基本模板
- 如何扩展python
- Android 实现添加本地数组在Res/values下的xml文件
- android 启动模式
- 访问网站出现Access denied for user 'root'@'%' to database 'xxx'
- 区块链基础:散列法(Hashing)
- spring-boot 集成 redis
- 【Android】【bluetooth 】如何记住蓝牙地址名字和状态
- Javascript中bind()方法的使用与实现