解析:首先,向量叉乘自己去看,这里就不讲了。
然后,假设一图形为凸多边形,所有点按照顺时针或者逆时针排序,那么:
任意的 i ,这两个向量 (p[i+1]-p[i]) X (p[i+2]-p[i]) 的叉积所指向的方向是一样的。
即:(x1,y1)=(p[i+1].x-p[i].x,p[i+1].y-p[i].y)
(x2,y2)=(p[i+2].x-p[i].x,p[i+2].y-p[i].y)
那么向量叉乘:x1*y2-y1*x2 的正负性是一样的。
最后,注意在一条直线上的情况,叉乘为0。
代码:
#include
using namespace std;
const int maxn=1e3;
struct tnode{
int x,y;
}p[maxn+10];
int get(int i,int j,int k)
{
int a,b;
a=(p[j].x-p[i].x)*(p[k].y-p[i].y);
b=(p[j].y-p[i].y)*(p[k].x-p[i].x);
return a-b;
}
int main()
{
// freopen("1.in","r",stdin);
int n,i,flag;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
p[n+1]=p[1],p[n+2]=p[2];
flag=get(1,2,3);
for(i=2;i<=n;i++)
if(flag*get(i,i+1,i+2)<0)break;
if(i<=n)printf("concave\n");
else printf("convex\n");
}
return 0;
}