设为首页 加入收藏

TOP

A Round Peg in a Ground Hole(二)
2013-02-08 14:32:08 来源: 作者: 【 】 浏览:776
Tags: Round  Peg  in  Ground  Hole

  double cw(node a,node b,node c)
  {
  return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
  }
  double dist(node a,node b)
  {
  return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  }
  double dist(node a,node b,node c)
  {
  double d=dist(a,b);
  double res=cw(a,b,c);
  return fabs(res/d);
  }
  bool cmp(node a,node b)
  {
  double ans=cw(p,a,b);
  if(ans!=0)return cw(p,a,b)>0;
  else return dist(p,a)>dist(p,b);//note
  }
  int main()
  {
  int n;
  while(scanf("%d",&n)!=EOF)
  {
  if(n<3)
  break;
  scanf("%lf%lf%lf",&r,&center.x,&center.y);
  int i;
  for(i=0;i<n;i++)
  {
  scanf("%lf%lf",&a[i].x,&a[i].y);
  }
  bool flag=true;
  double dirt=0;
  for(i=0;i<n-1;i++)
  {
  if(cw(a[i],a[i+1],a[(i+2)%n])!=0)
  {
  if(dirt==0)
  dirt=cw(a[i],a[i+1],a[(i+2)%n]);
  else if(cw(a[i],a[i+1],a[(i+2)%n])>0&&dirt<0
  ||cw(a[i],a[i+1],a[(i+2)%n])<0&&dirt>0)
  {
  flag=false;
  break;
  }
  }
  }
  if(flag==false)
  {
  printf("HOLE IS ILL-FORMED\n");
  continue;
  }
  for(i=0;i<n;i++)
  {
  double d=dist(a[i],a[(i+1)%n],center);
  double res=cw(a[i],a[(i+1)%n],center);
  if(d<r||res<0&&dirt>0
  ||res>0&&dirt<0||res==0)
  {
  flag=false;
  break;
  }
  }
  if(!flag)
  {
  printf("PEG WILL NOT FIT\n");
  }
  else
  printf("PEG WILL FIT\n");
  }
  }
  //
  首先要判断多边形是否凸包。
  由于题目是按照顺时针或逆时针方向给出所有点,所以不需要对所有点进行排序
  使用叉积判断凸包
  允许多点共线情况的存在
  陷阱是:
  圆心可能不在多边形内部
  要求出圆心到多边形各边的距离,所有边的距离都要大于半径
  求点到线段的距离的方法:利用叉积

      

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mistake-输出前三名成绩 下一篇显示非模式对话框实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: