zoukankan      html  css  js  c++  java
  • poj 1584 A Round Peg in a Ground Hole 夜

    http://poj.org/problem?id=1584

    题意 给你个多边形和一个钉子,让你判断是否 钉子可以放里面

    注意  1 ,多边形所给的顺序 可能是逆时针也可能时顺时针

            2 ,钉子可能在多边形外面

            3 ,钉子可能在多边形上

            4 ,先给半径后给圆的坐标

    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    const int N=1001;
    struct node
    {
        double x,y;
    }mem[N];
    int Leftturn(double x1,double y1,double x2,double y2)//给出两个向量 求往哪转
    {
        double ftemp=x1*y2-x2*y1;
        if(ftemp==0.0)//不转
        return 0;
        if(ftemp>0.0)//左转
        return 1;
        return -1;// 右转
    }
    double Pegx,Pegy,Pegradius;
    bool Fit(int i,int j)//求点到线的距离 与半径比较 看是否合适
    {
        double x1=mem[i].x-Pegx;
        double y1=mem[i].y-Pegy;
        double x2=mem[j].x-Pegx;
        double y2=mem[j].y-Pegy;
        double temp=fabs(x1*y2-y1*x2)/sqrt((mem[i].x-mem[j].x)*(mem[i].x-mem[j].x)+(mem[i].y-mem[j].y)*(mem[i].y-mem[j].y));
        if(temp-Pegradius>=0.0)
        return true;
        return false;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            if(n<3)
            break;
            scanf("%lf %lf %lf",&Pegradius,&Pegx,&Pegy);
            for(int i=1;i<=n;++i)
            {
                scanf("%lf %lf",&mem[i].x,&mem[i].y);
            }
            mem[0].x=mem[n].x;
            mem[0].y=mem[n].y;
            mem[n+1].x=mem[1].x;
            mem[n+1].y=mem[1].y;
            int i;
            for(i=0;i<n;++i)
            {
                if(Leftturn(mem[i+1].x-mem[i].x,mem[i+1].y-mem[i].y,mem[i+2].x-mem[i+1].x,mem[i+2].y-mem[i+1].y)<0)
                break;
            }
            int j;
            for(j=0;j<n;++j)
            {
                if(Leftturn(mem[j+1].x-mem[j].x,mem[j+1].y-mem[j].y,mem[j+2].x-mem[j+1].x,mem[j+2].y-mem[j+1].y)>0)
                break;
            }
            if(i<n&&j<n)//既存在左转 又存在右转 则一定突出
            {
                printf("HOLE IS ILL-FORMED\n");
                continue;
            }
            if(i<n&&j==n)//如果只有右转 没有左转 说明点的顺序是顺时针 应该颠倒过来 以便后面求解
            {
                reverse(mem,mem+n+2);
            }
            for(i=0;i<n;++i)
            {
                if(Leftturn(Pegx-mem[i].x,Pegy-mem[i].y,mem[i+1].x-Pegx,mem[i+1].y-Pegy)>0)//点在三角形内部的话 则一定<=0
                break;
                if(!Fit(i,i+1))//根据点到直线距离 和 圆半径的比较 看是否合适
                break;
            }
            if(i<n)
            {
                printf("PEG WILL NOT FIT\n");
            }
            else
            {
                printf("PEG WILL FIT\n");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    024 其它 关联映射
    023 复合主键 关联映射
    022 component(组件)关联映射
    020 <one-to-one>、<many-to-one>单端关联上的lazy(懒加载)属性
    019 关联映射文件中集合标签中的lazy(懒加载)属性
    018 关联映射文件中<class>标签中的lazy(懒加载)属性
    017 多对多关联映射 双向(many-to-many)
    016 多对多关联映射 单向(many-to-many)
    015 一对多关联映射 双向(one-to-many)
    014 一对多关联映射 单向(one-to-many)
  • 原文地址:https://www.cnblogs.com/liulangye/p/2509044.html
Copyright © 2011-2022 走看看