先判断是不是N多边形,求一下凸包,如果所有点都用上了,那么就是凸多边形

判断圆是否在多边形内,

先排除圆心在多边形外的情况

剩下的情况可以利用圆心到每条边的最短距离与半径的大小来判断

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<list>
#include<algorithm>
using namespace std; const double eps=1e-;
const double pi=*asin(1.0);
struct point
{
double x,y;
double alpha;
double len2;
int id;
} p[];
int T,n;
vector<point>v;
vector<int>ans; double MinY;
int MinId; bool cmp(const point &a, const point &b)
{
if(fabs(a.alpha-b.alpha)<eps) return a.len2<b.len2;
return a.alpha<b.alpha;
} double len2(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
} double f(point a,point b,point c) //返回点a所对应的角的弧度
{
double B2=(double)len2(a,c);
double C2=(double)len2(a,b);
double A2=(double)len2(b,c);
double COSA=(B2+C2-A2)/(*sqrt(B2)*sqrt(C2));
return pi-acos(COSA);
} double GetPointDistance(point p1, point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
} double GetNearestDistance(point PA, point PB, point P3)
{
double a,b,c;
a=GetPointDistance(PB,P3);
if(a<=0.00001) return 0.0f;
b=GetPointDistance(PA,P3);
if(b<=0.00001) return 0.0f;
c=GetPointDistance(PA,PB);
if(c<=0.00001) return a;
if(a*a>=b*b+c*c) return b;
if(b*b>=a*a+c*c) return a;
double l=(a+b+c)/;
double s=sqrt(l*(l-a)*(l-b)*(l-c));
return *s/c;
} bool check(point T)
{
double sum=;
for(int i=;i<ans.size();i++)
sum=sum+pi-(f(T,p[ans[i]],p[ans[(i+)%ans.size()]]));
if(fabs(sum-*pi)<eps) return ;
return ;
} int main()
{
double pegRadius ,pegX ,pegY ;
while(~scanf("%d", &n))
{
if(n<) break;
scanf("%lf%lf%lf",&pegRadius,&pegX,&pegY);
MinY=;
for(int i=; i<=n; i++)
{
scanf("%lf%lf", &p[i].x, &p[i].y);
p[i].id=i;
if(p[i].y<MinY)
{
MinY=p[i].y;
MinId=i;
}
} ans.clear(); point pre; pre.x=-; pre.y=p[MinId].y;
point now; now.x=p[MinId].x; now.y=p[MinId].y; now.id=MinId; for(int i=; i<=n; i++)
{
v.clear();
for(int k=; k<=n; k++)
{
if(p[k].id!=now.id)
{
p[k].alpha=f(now,p[k],pre);
p[k].len2=len2(p[k],now);
v.push_back(p[k]);
}
}
sort(v.begin(),v.end(),cmp);
ans.push_back(v[].id);
if(v[].id==MinId) break; pre.x=now.x;
pre.y=now.y;
pre.id=now.id;
now.x=v[].x;
now.y=v[].y;
now.id=v[].id;
} if(ans.size()<n) printf("HOLE IS ILL-FORMED\n"); else
{
bool fail=;
point T;
T.x=pegX;
T.y=pegY; if(check(T)) {fail=;}
else
{
for(int i=; i<ans.size(); i++)
{
double len=GetNearestDistance(p[ans[i]],p[ans[(i+)%ans.size()]],T);
if(len+eps<=pegRadius) fail=;
}
} if(fail==) printf("PEG WILL FIT\n");
else printf("PEG WILL NOT FIT\n");
}
}
return ;
}

POJ 1584 A Round Peg in a Ground Hole的更多相关文章

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

    首先判断是不是凸多边形 然后判断圆是否在凸多边形内 不知道给出的点是顺时针还是逆时针,所以用判断是否在多边形内的模板,不用是否在凸多边形内的模板 POJ 1584 A Round Peg in a G ...

  2. POJ 1584 A Round Peg in a Ground Hole【计算几何=_=你值得一虐】

    链接: http://poj.org/problem?id=1584 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

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

    A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4438   Acc ...

  4. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,判断点在凸多边形内

    A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5456   Acc ...

  5. POJ 1584 A Round Peg in a Ground Hole[判断凸包 点在多边形内]

    A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Acc ...

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

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

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

    题意: 给一个圆和一个多边形,多边形点可能按顺时针给出,也可能按逆时针给出,先判断多边形是否为凸包,再判断圆是否在凸包内. 解法: 先判是否为凸包,沿着i=0~n,先得出初始方向dir,dir=1为逆 ...

  8. 简单几何(点的位置) POJ 1584 A Round Peg in a Ground Hole

    题目传送门 题意:判断给定的多边形是否为凸的,peg(pig?)是否在多边形内,且以其为圆心的圆不超出多边形(擦着边也不行). 分析:判断凸多边形就用凸包,看看点集的个数是否为n.在多边形内用叉积方向 ...

  9. POJ 1518 A Round Peg in a Ground Hole【计算几何=_=你值得一虐】

    链接: http://poj.org/problem?id=1584 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

随机推荐

  1. Delphi XE2 生成的.exe 在未安装有Delphi的电脑上运行提示 “丢失 rtl160.bpl”

    解决方案: XE2中加入了多平台的概念,默认的Release模式,也是带包编译,带运行时库的,所以,需要手工设置一下工程选项: 打开工程以后,Project-->Options-->左侧树 ...

  2. CentOS 下配置CUPS

    一.共享打印机的设置 1.在http://www.openprinting.org/printer/HP/HP-LaserJet_1010检查打印机的支持情况,两个企鹅以上表示Mostly,支持大部分 ...

  3. HTTP的学习

    一个完整的HTTP请求: 1 简历TCP连接 2 web浏览器像web服务器发送请求命令 3 web浏览器发送请求头信息 4 web服务器应答 5 web服务器发送应答头信息 6 web服务器像浏览器 ...

  4. 最新最全的html5标签集合

    最新最全的html5标签集合,按字母顺序排列的标签列表 4:指示在HTML4.01中定义了该元素 5:指示在HTML5中定义了该元素 标签 描述 <!--...--> 定义注释 <! ...

  5. C#排列组合类

    //----------------------------------------------------------------------------- // // 算法:排列组合类 // // ...

  6. URL 传+号到后台变空格问题解决方案

    今天巧合遇到这个问题,下面是网上找的解决方案. 原文:http://blog.sina.com.cn/s/blog_a0949eec01010xta.html 今天在调试客户端向服务器传递参数时,参数 ...

  7. error: QApplication: No such file or directory

    尝试用Qt5编译Qt4的工程.你会遇到下面的问题: 错误:C1083: 无法打开包括文件:“QApplication”: No such file or directory 出现原因:Qt5里不再用Q ...

  8. ant调用shell命令(Ubuntu)

    ant中调用Makefile,使用shell中的make命令 <?xml version="1.0" encoding="utf-8" ?> < ...

  9. vim的复制粘贴小结(转)

    原文地址:http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.entry 内容: 用vim这么久 了,始终也不知道怎么在vim中使 ...

  10. Oracle教程-查询(二)

    emp 雇员表字段名称   数据类型       是否为空   备注--------   -----------   --------   --------EMPNO    NUMBER(4)     ...