zoukankan      html  css  js  c++  java
  • POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)

    题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部。

    分3步:

    1、判断是否是凸多边形

    2、判断点是否在多边形内部

    3、判断点到各边的距离是否大于等于半径

    上代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    #define maxn 2000
    #define eps 10E-8
    
    struct Point
    {
        double x, y;
        Point operator-(const Point &a) const
        {
            Point ret;
            ret.x = x - a.x;
            ret.y = y - a.y;
            return ret;
        }
    } point[maxn], peg;
    
    double pegr;
    int n;
    
    int dblcmp(double a)
    {
        if (fabs(a) < eps)
            return 0;
        return a >0?1 : -1;
    }
    
    double xmult(const Point &a, const Point &b)
    {
        return a.x * b.y - b.x * a.y;
    }
    
    void input()
    {
        scanf("%lf%lf%lf", &pegr, &peg.x, &peg.y);
        for (int i =0; i < n; i++)
            scanf("%lf%lf", &point[i].x, &point[i].y);
        int t =0;
        int i =0;
        while (i < n && t ==0)
        {
            t = dblcmp(xmult(point[(i +1)%n] - point[i], point[(i +2)%n] - point[i]));
            i++;
        }
        if (t <0)
            reverse(point, point + n);
    }
    
    bool convex()
    {
        for (int i =0; i < n; i++)
            if (dblcmp(xmult(point[(i +1)%n] - point[i], point[(i +2)%n] - point[(i +1)%n]))    <0)
                return false;
        return true;
    }
    
    bool inconvex()
    {
        for (int i =0; i < n; i++)
            if (dblcmp(xmult(point[(i +1)%n] - point[i], peg - point[(i +1)%n])) <=0)
                return false;
        return true;
    }
    
    double dist(const Point &a, const Point &b)
    {
        Point p;
        p = a - b;
        return sqrt(p.x * p.x + p.y * p.y);
    }
    
    bool ok()
    {
        for (int i =0; i < n; i++)
            if (dblcmp(abs(xmult(peg - point[i], point[(i +1)%n] - point[i]))/dist(point[i], point[(i +1)%n]) - pegr) <0)
                return false;
        return true;
    }
    
    int main()
    {
        while (scanf("%d", &n) != EOF)
        {
            if (n<3)
                break;
            input();
            if (!convex())
                printf("HOLE IS ILL-FORMED
    ");
            else if (!inconvex()||!ok())
                printf("PEG WILL NOT FIT
    ");
            else
                printf("PEG WILL FIT
    ");
        }
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Java Object part1
    StringBuffer StringBuilder append
    Java equal
    java Classloader
    Java NIO
    Oracle中Blob和Clob
    Java8 Lambda 表达式
    HashMap分析 + 哈希表
    android自定义控件之滚动广告条
    android自定义控件之模仿优酷菜单
  • 原文地址:https://www.cnblogs.com/wanglaoda/p/4937161.html
Copyright © 2011-2022 走看看