标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 5399 | Accepted: 1712 |
Description
Input
Output
Sample Input
5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.0 1.0 3.0 0.0 2.0 5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.5 1.0 3.0 0.0 2.0 1
Sample Output
HOLE IS ILL-FORMED PEG WILL NOT FIT
Source
题意:给出n个点,按顺时针或逆时针给出,问是不是凸包,和判断圆在不在凸包内。
如果图形是凸包,对任意连续三个点a,b,c的叉乘(b-a,c-b)的正负相同,也就是说在同一边,这样就可以判断凸包。
判断圆在不在凸包内,首先判断圆心,在不在凸包内,如果在凸包内的话叉乘(b-a,r-a)得到的正负应该与判断凸包时相同。
然后判断每条边到圆心的距离是否大于半径,由叉乘(b-a,r-a)得到以<a,b> <a,r>为边的平行四边形面积,再除以<a,b>的距离就可以了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std ;
#define eps 1e-8
struct node{
double x , y ;
}p[10005] , q ;
double r , r_x , r_y ;
node sub(node a,node b)
{
a.x -= b.x ;
a.y -= b.y ;
return a ;
}
int mul(node a,node b)
{
if( a.x*b.y - a.y*b.x >= 0 )
return 1 ;
else
return -1 ;
}
double dis(node a,node b)
{
if( fabs(a.x-b.x) < eps )
return fabs(q.x-a.x) ;
else if( fabs(a.y-b.y) < eps )
return fabs(q.y-a.y) ;
else
{
node s , e ;
s = sub(a,b) ;
e = sub(q,b) ;
return fabs(s.x*e.y-s.y*e.x)/( sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) );
}
}
int main()
{
int n , i , j , flag ;
while( scanf("%d", &n) && n >= 3 )
{
scanf("%lf %lf %lf", &r, &q.x, &q.y) ;
for(i = 0 ; i < n ; i++)
scanf("%lf %lf", &p[i].x, &p[i].y) ;
p[n] = p[0] ;
flag = mul(sub(p[1],p[0]),sub(p[2],p[1])) ;
for(i = 1 ; i < n ; i++)
{
if( flag != mul(sub(p[i],p[i-1]),sub(p[i+1],p[i]) ) )
break ;
}
if( i < n )
{
printf("HOLE IS ILL-FORMED\n") ;
continue ;
}
for(i = 0 ; i < n ; i++)
{
if( flag != mul( sub(p[i+1],p[i]),sub(q,p[i]) ) )
break ;
//printf("%d %lf\n", i, dis(p[i],p[i+1]) ) ;
if( dis(p[i],p[i+1]) - r < 0 )
break ;
}
if( i < n )
printf("PEG WILL NOT FIT\n") ;
else
printf("PEG WILL FIT\n") ;
}
return 0;
}
poj1584--A Round Peg in a Ground Hole(判断凸包,并且判断圆是否在凸包内)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43201041