zoukankan      html  css  js  c++  java
  • Codeforces gym102222 B.Rolling The Polygon 凸包/余弦定理

    题意:

    有一个不保证凸的多边形,让你滚一圈,计算某点滚出的轨迹多长。

    题解:

    求出凸包后,以每个点为转轴,转轴到定点的距离为半径,用余弦定理计算圆心角,计算弧长。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int main()
    {
        int t,case1=0;
        cin>>t;
        while(t--)
        {
            case1++;
            int n;
            cin>>n;
            int x[55],y[55];//贮存坐标
            for(int i=1;i<=n;i++)
            {
                cin>>x[i]>>y[i];
            }
            int xx,yy;
            cin>>xx>>yy;
            double dis[55];
            for(int i=1;i<=n;i++)
            {
                dis[i]=(x[i]-xx)*(x[i]-xx)+(y[i]-yy)*(y[i]-yy);
                //cout<<dis[i]<<endl;
            }
            //cout<<endl;
            double ankle[55];
            for(int i=1;i<=n;i++)
            {
                double t1,t2,t3;
                if(xx==x[i]&&yy==y[i])
                continue;
                if(i==1)
                {
                    t1=sqrt((x[2]-x[1])*(x[2]-x[1])+(y[2]-y[1])*(y[2]-y[1]));
                    t2=sqrt((x[n]-x[1])*(x[n]-x[1])+(y[n]-y[1])*(y[n]-y[1]));
                    t3=sqrt((x[n]-x[2])*(x[n]-x[2])+(y[n]-y[2])*(y[n]-y[2]));
                }
                else if(i==n)
                {
                    t1=sqrt((x[n]-x[1])*(x[n]-x[1])+(y[n]-y[1])*(y[n]-y[1]));
                    t2=sqrt((x[n]-x[n-1])*(x[n]-x[n-1])+(y[n]-y[n-1])*(y[n]-y[n-1]));
                    t3=sqrt((x[n-1]-x[1])*(x[n-1]-x[1])+(y[n-1]-y[1])*(y[n-1]-y[1]));
                }
                else
                {
                    t1=sqrt((x[i+1]-x[i])*(x[i+1]-x[i])+(y[i+1]-y[i])*(y[i+1]-y[i]));
                    t2=sqrt((x[i]-x[i-1])*(x[i]-x[i-1])+(y[i]-y[i-1])*(y[i]-y[i-1]));
                    t3=sqrt((x[i-1]-x[i+1])*(x[i-1]-x[i+1])+(y[i-1]-y[i+1])*(y[i-1]-y[i+1]));
                }
                //cout<<t1<<" "<<t2<<" "<<t3<<" ";
                ankle[i]=acos((t1*t1+t2*t2-t3*t3)/(2*t1*t2));
                //cout<<ankle[i]<<" ";
                //cout<<endl;
            }
    
            double l=0;
            for(int i=1;i<=n;i++)
            {
                l+=sqrt(dis[i])*(acos(-1.0)-ankle[i]);
            }
            printf("Case #%d: %.3lf
    ",case1,l);
        } 
        return 0;
    } 
  • 相关阅读:
    linux中的中断处理框架
    linux中的异常处理流程
    如何使用次设备号控制多个LED
    装载内核模块时,自动添加设备文件
    第一个字符设备驱动程序
    网络文件系统
    点击全选或全不选,一个页面有多个全选和全不选的时候
    ubuntu 20.04 遇到的问题
    Ubuntu20.04 初始没有的东西
    Ubuntu 20 安装pycharm备忘
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11441000.html
Copyright © 2011-2022 走看看