【洛谷】P3744 - 李彬的几何(计算几何题)

题目链接

题意:求将一个凸多边形移动成非凸多边形的最短距离。

思路:只要有一个角是平角那就不是凸多边形啦。所以就是找到将某一个角变成平角的最短距离。

图示:示意图
其中x为所求距离,直线代表移动后的平角。

利用海伦公式

s=p (pa)(pb)(pc) ,  a ,b ,c ,p  s = p   ( p − a ) ( p − b ) ( p − c )   ,   其 中   a   , b   , c   , p   分 别 为 三 角 形 三 边 长 和 周 长 。

可求出x。
公式:
x=s2b,b  AC  x = s 2 b , b   为 边   A C   的 长

AC代码:

#include <bits/stdc++.h>
using namespace std;
struct Point{
    double x,y;
    Point(){}
    Point(double xx,double yy){
        x = xx;
        y = yy;
    }
}p[1100];
double dist(Point a, Point b){
    return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
int main(int argc, char const *argv[])
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i)    scanf("%lf %lf",&p[i].x,&p[i].y);
    double a,b,c,s,e,h,mmin = 0x3f3f3f3f3f3f3f3f;
    for(int i=0;i<n;++i){
        a = dist(p[(i+1)%n],p[(i+2)%n]);
        b = dist(p[i],p[(i+2)%n]);
        c = dist(p[i],p[(i+1)%n]);
        e = 0.5*(a+b+c);
        s = sqrt(e*(e-a)*(e-b)*(e-c));
        h = s/b;
        mmin = min(mmin,h);
    }
    printf("%.10lf\n", mmin);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值