最圆点对,(凸包+旋转卡壳)
来源:互联网 发布:手机点位图软件 编辑:程序博客网 时间:2024/05/24 02:29
#include<iostream>#include<cstdio>#include<algorithm>#include<math.h>#define eps 1e-6#define inf 1e10#define maxn 1000005struct point{ double x,y;}p[maxn],s[maxn];int n;double xmult(point p1,point p2,point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);}double max(double a,double b){return a>b? a:b;}bool cmp(const point &a,const point &b ){ if(a.y==b.y)return a.x<b.x; return a.y<b.y;}int Graham(){ int i; std::sort(p,p+n,cmp); s[0]=p[0]; s[1]=p[1]; int top=1; for(i=0;i<n;i++) { while(top>0&& xmult(s[top],p[i],s[top-1])>=0) top--; s[++top]=p[i]; } int mid=top; for(i=n-2;i>=0;i--) { while(top>mid&&xmult(s[top],p[i],s[top-1])>=0) top--; s[++top]=p[i]; } return top;}double rc_tri(){ if(n<3)return 0; double maxx=0 ,temp; int i; int b=1,c=2; s[n]=s[0]; s[n+1]=s[1]; s[n+2]=s[2]; for(i=0;i<n;i++) { while(xmult(s[c+1],s[b],s[i])-(temp=xmult(s[c],s[b],s[i]))>eps) c=(c+1)%n; maxx=max(maxx,temp); while(xmult(s[c],s[b+1],s[i])-(temp=xmult(s[c],s[b],s[i]))>eps) b=(b+1)%n; maxx=max(maxx,temp); } return maxx;}int main(){ while(~scanf("%d",&n)) { if(n==-1) break; int i; for(i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y); n=Graham(); printf("%.2f\n",rc_tri()/2); } return 0;}
hdu3934 poj 2079
#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#define maxn 1000005typedef struct{ double x,y;}Point;Point a[maxn];Point stack[maxn];double Distance(Point t1,Point t2){ return sqrt((t1.x-t2.x)*(t1.x-t2.x)+(t1.y-t2.y)*(t1.y-t2.y));}double Cross(Point t1,Point t2,Point t3) //向量AB(a)与向量AC(b)的叉积,即 a.x*b.y-a.y-b.x;{ return ((t2.x-t1.x)*(t3.y-t1.y)-(t3.x-t1.x)*(t2.y-t1.y));}bool cmp(Point p1,Point p2){ double m=Cross(a[0],p1,p2); if(m<0) return false; // m小于零时点在里面。 else if(m==0&&Distance(p1,a[0])<Distance(p2,a[0])) return false; else return true;}void AREA(int n){ double max=-1; double area2; int k,j,i; for(i=0;i<=n-3;i++) { k=0; for(j=i+1;j<=n-2;j++) { if(k<=j) k=j+1; area2=fabs(Cross(stack[i],stack[j],stack[k])); if(area2>max) max=area2; while(k+1<=n-1) { double tmp=fabs(Cross(stack[i],stack[j],stack[k+1])); if(tmp<area2) break; max=max>tmp?max:tmp; area2=tmp; k++; } } } printf("%.2f\n",max*0.5);}int main(){ //freopen("Input.txt","r",stdin); int n,i,top; while(scanf("%d",&n)!=EOF) { top=0; for(i=0;i<n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); for(i=0;i<n;i++) //找基点。 if(a[i].y<a[0].y||(a[i].y==a[0].y&&a[i].x<a[0].x)) { double a2,b2; a2=a[0].x; b2=a[0].y; a[0].x=a[i].x; a[0].y=a[i].y; a[i].x=a2; a[i].y=b2; } std::sort(a+1,a+n,cmp); //按照斜率排序。 stack[top++]=a[0]; stack[top]=a[1]; for(i=2;i<n;i++) { while(top>=1&&Cross(stack[top-1],stack[top],a[i])<=0) //逆时针扫描,向量AB(a)与向量AC(b)的叉积, top--; //即 a.x*b.y-a.y-b.x; stack[++top]=a[i]; } if(top+1<2) { printf("0.00\n");continue ;} AREA(top+1); } return 0;}
poj 3608 求两个不相交凸包的最近距离。
#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>using namespace std;#define N 10002#define EPS 1e-10struct point{ double x; double y;}pn[N],pm[N];double dis(point a,point b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}double det(double x1,double y1,double x2,double y2){ return x1*y2-x2*y1;}double cross(point a,point b,point c){ return det(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y);}double dot(point a,point b){ return a.x*b.x+a.y*b.y;}double min(double a,double b){ return a>b?b:a;}void adjust(point *p,int n){ for(int i=0;i<n-2;i++) { int res=cross(p[i+1],p[i+2],p[i]); if(res>EPS)return; else if(res<-EPS) { reverse(p,p+n); return; } }}double point_to_seg(point a,point b,point c){ point ab,ac; ab.x=b.x-a.x; ab.y=b.y-a.y; ac.x=c.x-a.x; ac.y=c.y-a.y; double f=dot(ab,ac); if(f<0)return dis(a,c); double f1=dot(ab,ab); if(f>f1)return dis(b,c); f=f/f1; point d; d.x=a.x+ab.x*f; d.y=a.y+ab.y*f; return dis(d,c);}double seg_to_seg(point a1,point b1,point a2,point b2){ return min(min(point_to_seg(a1,b1,a2),point_to_seg(a1,b1,b2)),min(point_to_seg(a2,b2,a1),point_to_seg(a2,b2,b1)));}double rc(point *p1,int n,point *p2,int m){ int s1=0,s2=0; for(int i=0;i<n;i++) { if(p1[i].y-p1[s1].y<-EPS) { s1=i; } } for(int i=0;i<m;i++) { if(p2[i].y-p2[s2].y>EPS) { s2=i; } } p1[n]=p1[0]; p2[m]=p2[0]; double res,ans=1e20; for(int i=0;i<n;i++) { while((res=cross(p2[s2],p1[s1+1],p1[s1])-cross(p2[s2+1],p1[s1+1],p1[s1]))>EPS) { s2=(s2+1)%m; } if(res<-EPS)ans=min(ans,point_to_seg(p1[s1],p1[s1+1],p2[s2])); else ans=min(ans,seg_to_seg(p1[s1],p1[s1+1],p2[s2],p2[s2+1])); s1=(s1+1)%n; } return ans;}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0)break; for(int i=0;i<n;i++) { scanf("%lf%lf",&pn[i].x,&pn[i].y);//第一凸包中的点 } for(int i=0;i<m;i++) { scanf("%lf%lf",&pm[i].x,&pm[i].y); //第二个凸包的点 } adjust(pn,n); adjust(pm,m); printf("%.5f\n",sqrt(min(rc(pn,n,pm,m),rc(pm,m,pn,n)))); } return 0;}
- 最圆点对,(凸包+旋转卡壳)
- 凸包 (旋转卡壳)
- Poj2187(最远点对距离)凸包+旋转卡壳
- TYVJ1464(凸包+旋转卡壳)
- [POJ2079]Triangle(凸包+旋转卡壳)
- poj2187 凸包+graham+旋转卡壳+最远点对
- [计算几何][凸包][旋转卡壳] 最远距离点对
- 凸包与旋转卡壳
- 凸包,旋转卡壳模板
- bzoj1069 凸包+旋转卡壳
- hdu5251 凸包 旋转卡壳
- hdu2202 凸包+旋转卡壳
- 凸包旋转卡壳 模板
- poj2187 凸包上的最远点对的距离(凸包+旋转卡壳)
- poj 2187 Beauty Contest 计算几何(凸包+旋转卡壳法)/最远点对
- POJ2187 Beauty Contest(最远点对,凸包+旋转卡壳)
- POJ 2187 Beauty Contest(凸包_旋转卡壳之最远点对)
- POJ2187-Beauty Contest- 最远点对问题(凸包+旋转卡壳)
- struts和jfreechart
- hdu acm 1.2.8 Specialized Four-Digit Numbers (进制转换)
- HTControl之CHTVertScrollBar滚动条控件
- Tomcat 7.0的配置
- Android ViewPager使用详解
- 最圆点对,(凸包+旋转卡壳)
- treeview checkbox选中的时候选择子节点 mvvm
- phonegap入门--8 Compass 罗盘
- 开发者使用JasperReport——不同数据源之实体对象数据源
- sql删除重复数据
- Java学习笔记39:Spring XML使用
- 排序算法系列之二叉查找树
- 手机网站开发——网页音频播放器(续)
- Java文件的 In 与 Out 的相对性