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

分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-8struct 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\n");else if (!inconvex()||!ok())printf("PEG WILL NOT FIT\n");elseprintf("PEG WILL FIT\n");}return 0;
}

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

转载于:https://www.cnblogs.com/wanglaoda/p/4937161.html

POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...相关推荐

  1. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内

    ACM博客_kuangbin POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) A Round Peg in a Ground H ...

  2. POJ - 1584 A Round Peg in a Ground Hole(综合几何)

    题目链接:点击查看 题目大意:给出n个点,以及一个圆心和半径,首先判断这n个点能否构成凸包,若能,继续判断圆是否在凸包内 题目分析:这个题目确实非常综合,考察了判断凸包问题,判断圆是否在凸包内,只要保 ...

  3. 【POJ1584】A Round Peg in a Ground Hole,第一次的计算几何

    Time:2016.07.15 Author:xiaoyimi 转载注明出处谢谢 思路: 算是计算几何的第一个题吧 判断是否为凸多边形用相邻边(向量)的叉积判断 (要求叉积的符号相同) 向量a,b,若 ...

  4. POJ 1584 计算几何 凸包

    链接: http://poj.org/problem?id=1584 题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个 ...

  5. poj 1584(凸包+点在凸多边形内+圆在凸多边形内)

    题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部. 解题思路: 1.判断该多边形是否是凸包,由于 ...

  6. poj 3082多边形相交 'Roid Rage

    题意是判断多边形是否相交 主要的思路就是判断每一个点是否在另外的多变形内 判断一个点是否在另一个多边形内主要思路是: 判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在 ...

  7. 【POJ - 3304 】Segments(计算几何,思想转化,直线和线段相交)

    题干: Given n segments in the two dimensional space, write a program, which determines if there exists ...

  8. Geometric Shapes - POJ 3449(多边形相交)

    题目大意:给一些几何图形的编号,求出来这些图形都和那些相交.   分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...

  9. 寒假-第一周-几何-(点线关系的问题)

    寒假第一周:几何 POJ 2318 TOYS POJ 2398 Toy Storage(叉积判断左右+二分) POJ 3304 Segments(思维) POJ 1269 Intersecting L ...

最新文章

  1. 使用lucene进行group操作
  2. Spring Boot 添加拦截器的配置方式
  3. 完美解决 keil5.25 某宝Jlink无法使用问题
  4. 查看电脑电池损耗的命令
  5. tomcat(13)Host和Engine容器
  6. 两张表的笛卡尔积用sql语句
  7. python自动化部署工具_Python + Allure(报告)+ Jenkins(持续集成)接口自动化测试环境搭建...
  8. 测试 第七章 循环结构进阶 1205 草稿
  9. L2-4 哲哲打游戏 (25 分)
  10. textarea如何实现高度自适应?
  11. 配置接口IP地址并通过默认路由配置实现全网互通。
  12. vscode之调试js
  13. H5 新特性之 fileReader 实现本地图片视频资源的预览
  14. phpstudy使用mysql8.0_windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项...
  15. STM32F205 PWM配置
  16. 史上最著名的电脑病毒
  17. 数据分析—用excel2016和python画箱线图
  18. Houdini17 OptiX Denoise使用
  19. 什么是有氧运动?什么是无氧运动?哪个减肥效果更好?
  20. FDMA/TDMA信号分析 IP core

热门文章

  1. 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
  2. 第一章:初识lucene
  3. SQL总结(一)基本查询
  4. Cache--主存地址映射
  5. SUSE Linux 维护笔记二
  6. android USB host编程
  7. 6张信用卡欠款10000到47000不等,会被起诉坐牢吗?
  8. 未成年人可以申请贷款吗?
  9. 流水线技术在高速数字电路设计中的应用
  10. a.out、coff、elf三种文件格式