poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部

题目来源:

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

题意: 给一个多边形, 一个圆心以及半径。 首先判断是否为凸多边形。 如果是凸多边形, 再判断,圆是否在凸多边形内部。

分析:

1) 先判断是否为凸多边形 ,题目给出的顶点是有序的, 即顺时针或是 逆时针。用叉积方向判断。

2) 判断圆在多边形内, 首先判断 圆心是否在多边形内部, 是的话,然后再 判断 圆心到多边形 所有边的 距离d >= r
, 即可。

代码如下:


const int Max_N = 1005;
const double EPS = 1e-10 ;
//---------凸包----
double add(double a, double b){
return (fabs(a + b) < EPS * (fabs(a) + fabs(b))) ? 0 : (a + b) ;
}
struct Point{
double x , y ;
Point(){}
Point(double x, double y):x(x),y(y){}
double dist(Point p){
return sqrt(add((x - p.x)*(x - p.x) ,(y - p.y )*(y - p.y) )) ;
}
Point operator -(Point p){
return Point( add(x ,- p.x) , add( y, - p.y) ) ;
}
double operator ^(Point p){
return add(x * p.y ,- y * p.x );
}
};
Point List[Max_N] ;
int n;
//判断是否为 凸包
bool is_convex(){
int i , left = 0, right = 0;
List[n] = List[0] ;
List[n+1] = List[1] ;
for(i = 0 ; i < n ; i++){
if( ((List[i+1] - List[i])^(List[i+2] - List[i+1])) < 0)
right ++ ;
else if(((List[i+1] - List[i])^(List[i+2] - List[i+1])) > 0)
left ++ ;
}
if(right==0 || left == 0)
return 1 ;
return 0;
}
Point ro;
double r;
//判断圆心是否在凸包内或凸包边上,在凸包上或内返回1
int inside_convex(){
int i, left = 0 , right = 0;
for(i = 0 ; i < n ; i++){
double d = (ro- List[i])^(List[(i+1)%n] - List[i]) ;
if(d > 0) left ++;
if(d < 0) right ++ ;
}
if(left == 0 || right == 0)
return 1;
return 0 ;
}
// 计算点p到直线p1p2的最短距离
double dist_ptoseg(Point p, Point p1, Point p2){
return fabs((p1-p)^(p2-p)) / (p1.dist(p2)) ;
}
//判断圆是否在凸多边形内
int cicle_in_convex(){
int i ;
List[n] = List[0] ;
for(i = 0 ; i< n ; i++){
if(dist_ptoseg(ro , List[i] , List[i+1]) < r )
return 0 ;
}
return 1;
}

int main()
{
while(scanf("%d" , &n) && n >= 3){
scanf("%lf%lf%lf", &r , &ro.x, &ro.y) ;
for(int i=0 ; i < n ; i++){
scanf("%lf%lf" , &List[i].x , &List[i].y) ;
}
if(!is_convex())
puts("HOLE IS ILL-FORMED");
else{
if(inside_convex() && cicle_in_convex()){
puts("PEG WILL FIT") ;
}
else
puts("PEG WILL NOT FIT") ;
}
}
}

poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内
+ 圆是否在凸多边形内部

时间: 2024-11-05 18:33:32

poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部的相关文章

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

首先判断是不是凸多边形 然后判断圆是否在凸多边形内 kuangbin的板子,但是有些地方不明白. 判断多边形不是凸多边形后,为什么用判断点是否在凸多边形内的模板交WA了,而用判断点是否在任意多边形内的模板A了 而且判断点是否在任意多边形的注释,返回值为什么又说是凸多边形~~~ POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) #include <iostream> #include <cstdio> #inclu

poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】

大致思路:首先对于所给的洞的点,判断是否是凸多边形,图形的输入和输出可以是顺时针或者逆时针,而且允许多点共线 Debug 了好几个小时,发现如下问题 判断三点是否共线,可用斜率公式判断 POINT point_A, point_B, point_C; if(point_A.x == point_B.x || point_B.x == point_C.x){ if(point_A.x == point_B.x && point_B.x == point_C.x) continue; }els

poj 1584 A Round Peg in a Ground Hole(计算几何)

A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5603   Accepted: 1788 Description The DIY Furniture company specializes in assemble-it-yourself furniture kits. Typically, the pieces of wood are attached to on

POJ 1584 A Round Peg in a Ground Hole(凸包判定&amp;&amp;圆在凸包内判定)

博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/39178777 A Round Peg in a Ground Hole 题目大意:按顺时针或逆时针给出多边形的顶点坐标.圆的半径及圆心坐标. 1.求多边形是否是个凸包,若不是输出"HOLE IS ILL-FORMED". 2.如果多边形为凸包,判定圆是否在凸包内,若凸包在园内,输出"PEG WILL FIT",若不在,输出"PEG WI

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 na

POJ 1584 A Round Peg in a Ground Hole --判定点在形内形外形上

题意: 给一个圆和一个多边形,多边形点可能按顺时针给出,也可能按逆时针给出,先判断多边形是否为凸包,再判断圆是否在凸包内. 解法: 先判是否为凸包,沿着i=0~n,先得出初始方向dir,dir=1为逆时针,dir=-1为顺时针,然后如果后面有两个相邻的边叉积后得出旋转方向为nowdir,如果dir*nowdir < 0,说明方向逆转了,即出现了凹点,说明不是凸多边形. 然后判圆是否在多边形内: 先判圆心是否在多边形内,用环顾法,然后如果在之内,则依次判断圆心与每条凸包边的距离与半径的距离,如果所

POJ 1584 A Round Peg in a Ground Hole(凸多边形判断 + 点是否在多边形内 + 点到线段的最短距离)

题目:传送门 题意:给你一个圆和一个多边形, 判断多边形是不是凸多边形,如果是,接着判断圆是否在凸多边形内部. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <vector> #include <set> #inclu

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

http://poj.org/problem?id=1584 题意 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部. 分析 1.判断给出了多边形是不是凸多边形. 2.判断圆包含在凸多边形中:一定要保证圆心在凸多边形里面.然后判断圆心到每条线段的距离要大于等于半径.. #include <iostream> #include <stdio.h> #include <string.h

POJ 1584 A Round Peg in a Ground Hole

先判断是不是N多边形,求一下凸包,如果所有点都用上了,那么就是凸多边形 判断圆是否在多边形内, 先排除圆心在多边形外的情况 剩下的情况可以利用圆心到每条边的最短距离与半径的大小来判断 #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<list> #include<algorithm> us