POJ 3608 求两个凸包之间的最小距离

本文介绍了求解两个凸包之间最小距离的算法,通过旋转卡壳结合叉积判断来遍历对踵点。凸包对踵点是两凸包间最短距离的关键,利用点积计算线段间距离。要掌握旋转卡壳中的支撑线、对踵点、旋转时机等概念,对于多个凸包问题,需对每个凸包执行旋转卡壳过程。
摘要由CSDN通过智能技术生成

题解 :

首先我们要知道一种遍历所有对踵点的算法 : 就是用旋转卡壳加上叉积判断是否旋转的一种算法。
剩下的就是求对踵点了
因为我们不难发现,对于两个凸包来说,他们之间的最小距离肯定在对踵点上。然后我们就可以去便利所有的对踵点这样同时保留最小距离这样就可以了。注意求一个线段到另一条线段的最小距离应该用点积去算就好了
还有我们需要深入理解关于旋转卡壳的几个有关的概念
1. 支撑线
2. 对踵点
3. 什么时候卡壳旋转
4. 旋转卡壳

只有这些理解到位以后才可以做这道题 注意对于多个凸包而言,我们需要每一个都去做一遍旋转卡壳。\

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 1e4 + 10;
const double eps = 1e-8;
const double INF = 1e88;
struct node {
    double x,y;
}p[maxn],q[maxn];

node init;
int sgn (double x) {
    if (fabs (x) < eps) return 0;
    return x > 0 ? 1 : -1;
}
double cross (double x1,double y1,double x2,double y2) {
    return x1 * y2 - x2 * y1;
}

double muit (double x1,double y1,double x2,double y2) {
    return x1 * x2 + y1 * y2;
}

double dist (node a,node b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值