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

#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. SocketAsyncEventArgs的释放问题

    起因是发现一个同事编写的程序运行两个月左右,占用了服务器20G左右的内存.用WinDbg查看发现存在大量的Async Pinned Handles,而它们的gcroot都来自于SocketAsyncE ...

  2. ArrayList迭代修改抛出ConcurrentModificationException

    extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...

  3. 【JAVA】猜数字

    import java.util.*; public class GN { public static void main(String arg[]) { ;// 数字标记 ;// 位置标记 ;// ...

  4. MUI音乐播放html5+audio模块

    html5+ audio 模块MUI播放音频 Audio模块用于提供音频的录制和播放功能,可调用系统的麦克风设备进行录音操作,也可调用系统的扬声器设备播放音频文件.通过plus.audio获取音频管理 ...

  5. FTP的两种主动模式和被动模式

    参考:https://blog.csdn.net/xqhrs232/article/details/54633006 https://blog.csdn.net/yuanhangq220/articl ...

  6. ASP.NET MVC中ViewBag和ViewData的区别

    在MVC3.0以上我们会用到ViewBag或者ViewData进行页面传值,对比一下二者的差距: ViewData ViewBag 基于key/value的字典集合 dynamic类型对象 从ASP. ...

  7. CNN中的卷积理解和实例

    卷积操作是使用一个二维卷积核在在批处理的图片中进行扫描,具体的操作是在每一张图片上采用合适的窗口大小在图片的每一个通道上进行扫描. 权衡因素:在不同的通道和不同的卷积核之间进行权衡 在tensorfl ...

  8. iOS开发tableView去掉顶部上部空表区域

    tableview中的第一个cell 里上部 有空白区域,大概64像素 在viewDidLoad中加入如下代码 self.automaticallyAdjustsScrollViewInsets = ...

  9. IE8 select 动态下拉遇到的问题

    发生背景:经QC测试程序一直没问题,到客户测试竟然出现了下拉窗口失效. 检查发现客户用的IE ,360 浏览器都出现一样的问题,据说360是引用IE的核心. 看下IE版本是 8的.....  开发和Q ...

  10. Linux 程序后台运行

    例子: shadowsocks 程序后台运行: sslocal -c /etc/shadowsocks-libev/config.json > /dev/>& & 参考: ...