#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1010;
struct node{
int a,b;
}e[maxn];
bool find(int x1,int y1,int x2,int y2,int x3,int y3)
{
//cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<x3<<" "<<y3<<endl;
return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)>=0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
int i,j,k,flag=0;
for(i=0;i<n;i++)
scanf("%d%d",&e[i].a,&e[i].b);
if(!find(e[n-1].a,e[n-1].b,e[0].a,e[0].b,e[1].a,e[1].b))flag=1;
if(!find(e[n-2].a,e[n-2].b,e[n-1].a,e[n-1].b,e[0].a,e[0].b))flag=1;
for(i=0;i<n-2;i++)
{
if(flag==1)break;
if(!find(e[i].a,e[i].b,e[i+1].a,e[i+1].b,e[i+2].a,e[i+2].b))flag=1;
}
if(flag)printf("concave\n");
else printf("convex\n");
}
return 0;
}
/*
向量a=(x1,y1),b=(x2,y2);
向量的叉积a×b=x1*y2-x2*y1;
当a×b>0时,b在a的逆时针方向,当a×b=0时,b与a共线,当a×b<0时,b在a的顺时针方向。
对于连续输入的三点A(x1,y1),B(x2,y2),C(x3,y3);
根据凸多边形的性质:向量AC(x3-x1,y3-y1)必定在向量AB(x2-x1,y2-y1)的逆时针方向,或者共线。
所以AB×AC>=0,即ans=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)>=0
当出现ans<0时,即为凹多边形。
*/
hdu 2108 Shape of HDU 计算几何(向量的叉积)
最新推荐文章于 2021-08-21 20:21:02 发布