poj 3608 Bridge Across Islands, 旋转卡壳求凸多边形间最小距离

本文介绍了一种计算两个凸包之间最小距离的算法——旋转卡壳算法。通过使用该算法,可以有效地找到两个凸多边形之间的最短距离。文中提供了一个具体的实现示例,并详细解释了关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

poj 3608 Bridge Across Islands



求两个凸包的最小距离。


旋转卡壳求凸多边形间最小距离   点击打开链接


double Rotating_Calipers_Distance(vector<Point>& ch1, vector<Point>& ch2){
    vector<Point> P = ConvexHull(ch1);
    vector<Point> Q = ConvexHull(ch2);
    int n = P.size(), m = Q.size();
    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.push_back(P[0]);
    Q.push_back(Q[0]);
    double tmp, ans = 1e20;
    for(int i=0; i<n; ++i)
    {
//Cross(Q[ymaxQ+1],P[yminP],P[yminP+1]) - Cross(Q[ymaxQ],P[yminP],P[yminP+1])
        while( tmp=Cross(Q[ymaxQ+1]-Q[ymaxQ], P[yminP]-P[yminP+1]) > eps)
            ymaxQ = (ymaxQ+1) % m;
        if(tmp <-eps) ans = min(ans, DistanceToSegment(Q[ymaxQ], P[yminP], P[yminP+1]));
        else ans = min(ans, DistanceTwoSegment(P[yminP],P[yminP+1], Q[ymaxQ],Q[ymaxQ+1]));
        yminP = (yminP+1) % n;
    }
    return ans;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值