题目:Bridge Across Islands

分析:以下内容来自:http://blog.csdn.net/acmaker/article/details/3178696

考虑如下的算法, 算法的输入是两个分别有m和n个顺时针给定顶点的凸多边形P和Q。

1.计算P上y坐标值最小的顶点(称为 yminP )和Q上y坐标值最大的顶点(称为 ymaxQ)。

2.为多边形在 yminP 和 ymaxQ 处构造两条切线 LP 和 LQ 使得他们对应的多边形位于他们的右侧。

  此时 LP 和 LQ 拥有不同的方向, 并且 yminP 和 ymaxQ 成为了多边形间的一个对踵点对。

3.计算距离(yminP,ymaxQ) 并且将其维护为当前最小值。

4.顺时针同时旋转平行线直到其中一个与其所在的多边形的边重合。

5.如果只有一条线与边重合, 那么只需要计算“顶点-边”对踵点对和“顶点-顶点”对踵点对距离。 都将他们与当前最小值

比较, 如果小于当前最小值则进行替换更新。如果两条切线都与边重合,那么情况就更加复杂了。如果边“交叠”,也就是

可以构造一条与两条边都相交的公垂线(但不是在顶点处相交), 那么就计算“边-边”距离。 否则计算三个新的“顶点-顶

点”对踵点对距离。 所有的这些距离都与当前最小值进行比较, 若小于当前最小值则更新替换。

6.重复执行步骤4和步骤5, 直到新的点对为(yminP,ymaxQ)。

7.输出最小距离。


 

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;
const int N=50000;
const double eps=1e-9;
const double INF=1e99;
struct Point
{
double x,y;
};
Point P[N],Q[N];
double cross(Point A,Point B,Point C)
{
return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}
double dist(Point A,Point B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
double multi(Point A,Point B,Point C)
{
return (B.x-A.x)*(C.x-A.x)+(B.y-A.y)*(C.y-A.y);
}
//顺时针排序
void anticlockwise(Point p[],int n)
{
for(int i=0;i<n-2;i++)
{
double tmp=cross(p[i],p[i+1],p[i+2]);
if(tmp>eps) return;
else if(tmp<-eps)
{
reverse(p,p+n);
return;
}
}
}
//计算C点到直线AB的最短距离
double Getdist(Point A,Point B,Point C)
{
if(dist(A,B)<eps) return dist(B,C);
if(multi(A,B,C)<-eps) return dist(A,C);
if(multi(B,A,C)<-eps) return dist(B,C);
return fabs(cross(A,B,C)/dist(A,B));
}
//求一条直线的两端点到另外一条直线的距离,反过来一样,共4种情况
double MinDist(Point A,Point B,Point C,Point D)
{
return min(min(Getdist(A,B,C),Getdist(A,B,D)),min(Getdist(C,D,A),Getdist(C,D,B)));
}
double Solve(Point P[],Point Q[],int n,int m)
{
int yminP=0,ymaxQ=0;
for(int i=0;i<n;i++)
if(P[i].y<P[yminP].y)
yminP=i;
for(int i=0;i<m;i++)
if(Q[i].y>Q[ymaxQ].y)
ymaxQ=i;
P[n]=P[0];
Q[m]=Q[0];
double tmp,ans=INF;
for(int i=0;i<n;i++)
{
while(tmp=cross(P[yminP+1],Q[ymaxQ+1],P[yminP])-cross(P[yminP+1],Q[ymaxQ],P[yminP])>eps)
ymaxQ=(ymaxQ+1)%m;
if(tmp<-eps) ans=min(ans,Getdist(P[yminP],P[yminP+1],Q[ymaxQ]));
else         ans=min(ans,MinDist(P[yminP],P[yminP+1],Q[ymaxQ],Q[ymaxQ+1]));
yminP=(yminP+1)%n;
}
return ans;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
for(int i=0;i<n;i++)
cin>>P[i].x>>P[i].y;
for(int i=0;i<m;i++)
cin>>Q[i].x>>Q[i].y;
anticlockwise(P,n);
anticlockwise(Q,m);
printf("%.5lf\n",min(Solve(P,Q,n,m),Solve(Q,P,m,n)));
}
return 0;
}

 

POJ3608(旋转卡壳--求两凸包的最近点对距离)相关推荐

  1. poj 3608 旋转卡壳求不相交凸包最近距离;

    题目链接:http://poj.org/problem?id=3608 #include<cstdio> #include<cstring> #include<cmath ...

  2. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  3. Gym - 102460L Largest Quadrilateral(几何-凸包+旋转卡壳求最大的四边形面积)

    题目链接:点击查看 题目大意:在笛卡尔坐标系上给出 n 个点,要求选出四个点,使得组成的四边形面积最大,求出这个最大的面积,注意此处组成的四边形不是严格意义上的四边形,只需要选四个点就行 题目分析:首 ...

  4. bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积

    在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...

  5. 求两条轨迹间的hausdorff距离_带电粒子在平行板电容器极板间的运动知识点

    五.带电粒子在平行板电容器极板间的运动 带电粒子在平行板电容器极板间的运动主要考查的内容 主标题:带电粒子在平行板电容器极板间的运动 副标题:剖析考点规律,明确高考考查重点,为学生备考提供简洁有效的备 ...

  6. 求两条轨迹间的hausdorff距离_题型 | 圆上有n个点到直线距离为d?

    圆上有n个点到直线的距离为d 圆 上到直线 的距离为 的点有( )个 方法一:常规方法,画图分析 由图象可以明显看出,圆在直线上方的部分内没有满足题意的点,在直线下方的部分内有两个满足题意的点. 但是 ...

  7. pythongps距离_在Python中求两个gps点之间的距离

    我有下面的方法(haversine)返回两个gps点之间的距离.下表是我的数据帧.在 当我使用在dataframe上应用函数时,我得到错误"cannot convert the series ...

  8. 求两条轨迹间的hausdorff距离_「中考专题」瓜豆原理|第二讲 线段型路径轨迹...

    第二讲 线段型路径轨迹 上一讲: [中考专题]瓜豆原理|第一讲 什么是瓜豆原理? 例1: 如图,等边ΔABC的边长为4,点D是边AC上的一个动点,连接BD,以BD为斜边向上作RtΔBDE,其中∠DBE ...

  9. 求两条轨迹间的hausdorff距离_圆锥曲线三种定义间的关系

    1.教材中圆锥曲线的第二定义都是通过例题引入,然后化简,最后总结道:虽然两种定义方法不同,但轨迹方程是相同的,都是椭圆的标准方程. 大家可能会有疑惑:为什么定义方法完全不同,但会出现相同的轨迹方程呢? ...

最新文章

  1. MODIS(TerraAqua)陆地标准产品
  2. mysql存储过程或函数中传入参数与表字段名相同引发的悲剧
  3. sqlite中的命令
  4. python linux 优化_Linux性能优化(一)
  5. three20 TTTableViewController + TTActionSheetController
  6. Qt笔记-QProcess切换用户执行进程(Linux)
  7. WPF、Authorware和Flash
  8. Onedark风格配色方案
  9. vue使用element-ui的el-input监听不了回车事件解决
  10. linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法...
  11. vector public member function
  12. 【python】打造一款自动扫描全网漏洞的扫描器
  13. launchpad乐器_PreSonus 发布 ATOM 打击垫控制器(视频)
  14. 联想拯救者Y7000p+Nvidia rtx2060 显卡驱动安装
  15. AWS - VPC Peering
  16. html图标隐藏,教你如何隐藏统计图标,两个隐藏统计图标的HTML代码
  17. C语言函数针对训练--递归篇(动画讲解,由易到难递归例题)
  18. appcan使用心得体会
  19. 《Fundamentals of Computer Grahpics》虎书第三版翻译——第一章 介绍
  20. php+mysql统计7天、30天每天数据没有补0

热门文章

  1. 从源码深处体验Spring核心技术--面试中IOC那些鲜为人知的细节
  2. 文件上传案例优化(文件命名循环接收多线程提高效率)
  3. File类遍历(文件夹)目录功能
  4. 解决yarn全局安装模块后但仍提示无法找到命令的问题
  5. 上传文件漏洞防御手段
  6. Java语法糖之foreach
  7. 骁龙660_高通骁龙660可以带动6g运行内存吗?
  8. 计算机游戏和传统游戏的区别是什么,电竞显示器与普通显示器有什么区别-电脑自学网...
  9. Hadoop的搭建,VmwareWorkstation 16pro + Ubuntu18.04.1
  10. 200718C语言及C程序概念