hdu 2108 判断凹包还是凸包

/*
对于连续的三个点p0,p1,p2,另向量a=p1-p0,b=p2-p1
若是凸多边形,那么b相对于a一定是向逆时针方向旋转的
判断两向量的旋转方向,可以使用向量的叉积 a×b = x1×y2 - x2×y1
a×b > 0 b在a的逆时针方向
a×b = 0 b平行于a(共线)
a×b < 0 b在a的顺时针方向
要注意的是,对于最后一个点pn,还要和起始的两个点p0,p1判断一次。
*/
#include<iostream>
using namespace std;

struct Point
{
 int x;
 int y;
}df[1001];

int det(int x1, int y1, int x2, int y2)
{
 return x1 * y2 - x2 * y1;
}
 
int cross(Point p0, Point p1, Point p2)
{
 int x1 = p1.x - p0.x;
 int y1 = p1.y - p0.y;//一开始把这个写成int y1 = p1.y = p0.y;  wrong 两次
 int x2 = p2.x - p1.x;
 int y2 = p2.y - p1.y;
 return det(x1, y1, x2, y2);
}

int main()
{
 int n, i;
 bool flag;
 while(cin>>n && n)
 {
  if(n < 3)
  {
   for(i = 0; i < n; i++)
    cin>>df[i].x>>df[i].y;
   puts("convex");
   continue;

  }
  for(i = 0; i < n; i++)
   cin>>df[i].x>>df[i].y;
  df[n].x = df[0].x;
  df[n].y = df[0].y;
  df[n + 1].x = df[1].x;
  df[n + 1].y = df[1].y;
  flag = false;
  int a;
  for(i = 2; i <= n + 1; i++)
  {
   a = cross(df[i - 2], df[i - 1], df[i]);
   if(a >= 0 )
    continue;
   else
   {
    flag = true;
    break;
   }
  }
  if(flag)
  {
   puts("concave");
  }
  else
  {
   puts("convex");
  }


 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值