计算两个凸包之间的最小距离,旋转卡壳法详解在旋转卡壳的用法之计算两个凸 包上的最近距离

#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
const double eps=1e-10;
const double INF=1e10;
struct point
{
double x,y;
point (double a=0,double b=0)
{
x=a;
y=b;
}
};
double min_val(double a,double b)
{
return a>b?b:a;
}
int dcmp(double a)
{
if(fabs(a)<eps)return 0;
else return a>0?1:-1;
}
point operator -(point a,point b){ return point (a.x-b.x,a.y-b.y); }
bool operator ==(const point &a,const point &b)
{
return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
void readdate(point a[],int n,point b[],int m)
{
int i;
for(i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(i=0;i<m;i++)
scanf("%lf%lf",&b[i].x,&b[i].y);
}
void change(point a[],int b)
{
int i;
point temp;
for(i=0;i<b/2;i++)
{
temp=a[i];
a[i]=a[b-1-i];
a[b-1-i]=temp;
}
}
void work(point p[],int n,point q[],int m)
{
int i;
for(i=0;i<n-2;i++)
if(dcmp(cross(p[i+1]-p[i],p[i+2]-p[i])>0)) break;
else if(dcmp(cross(p[i+1]-p[i],p[i+2]-p[i])<0))
{
change(p,n);
break;
}
for(i=0;i<m-2;i++)
if(dcmp(cross(q[i+1]-q[i],q[i+2]-q[i])>0))break;
else if(dcmp(cross(q[i+1]-q[i],q[i+2]-q[i])<0))
{
change(q,m);
break;
}
}
double Dot(point A,point B){return A.x*B.x+A.y*B.y;}
double Length(point A){return sqrt(Dot(A,A));}
double dist(point a,point b,point p)
{
if(a==b) return Length(p-a);
point v1=b-a,v2=p-a,v3=p-b;
if(dcmp(Dot(v1,v2))<0)return Length(v2);
if(dcmp(Dot(v1,v3))>0)return Length(v3);
return fabs(cross(v1,v2))/Length(v1); }
double Mid(point a1,point a2,point b1,point b2)
{
return min_val(min_val(dist(a1,a2,b1),dist(a1,a2,b2)),
min_val(dist(b1,b2,a1),dist(b1,b2,a2)));
}
double solve(point P[],int n,point Q[],int m)
{
double ans=INF,temp;
int i,minP=0,maxQ=0;
for(i=0;i<n;i++)
if(P[i].y<P[minP].y)
minP=i;
for(i=0;i<m;i++)
if(Q[i].y>Q[maxQ].y)
maxQ=i;
Q[m]=Q[0];
P[n]=P[0];
for(i=0;i<n;i++)
{
while((temp=cross(Q[maxQ+1]-P[minP+1],P[minP]-P[minP+1])
-cross(Q[maxQ]-P[minP+1],P[minP]-P[minP+1]))>eps)
maxQ=(maxQ+1)%m;
if(temp<-eps)
ans=min_val(ans,dist(P[minP],P[minP+1],Q[maxQ]));
else ans=min_val(ans,Mid(P[minP],P[minP+1],Q[maxQ],Q[maxQ+1]));
minP=(minP+1)%n;
}
return ans;
}
int main()
{
point p[10005],q[10005];
int n,m;
double a,b;
while(scanf("%d%d",&n,&m)==2)
{
if(m==0&&n==0)break;
readdate(p,n,q,m);
work(p,n,q,m);
a=solve(p,n,q,m);
b=solve(q,m,p,n);
printf("%.5lf\n",min_val(a,b));
}
return 0;
}

POJ3608的更多相关文章

  1. 【poj3608】 Bridge Across Islands

    http://poj.org/problem?id=3608 (题目链接) 题意 求两凸包间最短距离 Solution 难写难调,旋转卡壳,还真是卡死我了. 先分别选出两凸包最上点和最下点,从这两点开 ...

  2. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  3. POJ3608(旋转卡壳--求两凸包的最近点对距离)

    题目:Bridge Across Islands 分析:以下内容来自:http://blog.csdn.net/acmaker/article/details/3178696 考虑如下的算法, 算法的 ...

  4. poj3608 Bridge Across Islands

    地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536 ...

  5. 【旋转卡壳】poj3608 Bridge Across Islands

    给你俩凸包,问你它们的最短距离. 咋做就不讲了,经典题,网上一片题解. 把凸包上的点逆时针排序.可以取它们的平均点,然后作极角排序. 旋转卡壳其实是个很模板化的东西…… 先初始化分别在凸包P和Q上取哪 ...

  6. 旋转卡壳求两个凸包最近距离poj3608

    #include <iostream> #include <cmath> #include <vector> #include <string.h> # ...

随机推荐

  1. netstat命令的安装

    yum -y install net-tools    (可以生成ifconfig命令,netstat命令)

  2. matlab中 数据保留有效位数

    可以使用round函数  ,这函数原本功能是四舍五入 比如: >> A = 0.0326465;>> B = round(A*1000)/1000 B = 0.0330

  3. DXP 内电层分割

    多层电路板中间层设置与内电层如何分割 多层电路板与一般的电路板不同之处在于,多层电路板除了顶层和底层之外,还有若干中间层,这些中间层可以是信号层(mid layer),也可以是内部电源/接地层(int ...

  4. javaAgent 参数

    -javaagent 这个JVM参数是JDK 5引进的. Java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...

  5. 使用iLO远程管理HP系列服务器

    iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxworks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机.只要将服务 ...

  6. position fixed 居中

    1.水平居中.footer { height: 10%; text-align: center; position: relative; left: 50%; transform: translate ...

  7. iOS - ShareSDK第三方分享(图文和视频)和登录

    由于近期工作需要自己抽时间搞了一下第三方分享,这里使用的是shareSDK的第三方,在使用的过程中有一些心得和体会,特在此和大家分享一下~ 1.在经过将近一周时间的开发,终于搞定ios分享了. 2.由 ...

  8. tomcat+redis会话共享

    1.基础环境: jdk1. tomcat7 redis nginx 2.添加依赖的jar包到tomcat的lib目录(http://pan.baidu.com/s/1eRAwN0Q) 3.配置tomc ...

  9. Hive desc

    Describe Database hive> DESCRIBE DATABASE test; test ??? hdfs://ns1/user/hive/warehouse/test.db w ...

  10. Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)

    通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 本篇是在SSM框架基础上进行的. 参考文章: 1.Quartz学习——Qua ...