题目描述:
按逆时针顺序给出简单多边形的n个顶点坐标,判断该多边形是凸多边形还是凹多边形。
分析:
按照输入顺序依次将点连接起来
对于连续的三个点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 <stdio.h>
typedef struct{
int x,y;
}Point;
int det(int x1,int y1,int x2,int y2){
return x1*y2 - x2*y1;
}
int corss(Point p0,Point p1,Point p2){
return det(p1.x-p0.x,p1.y-p0.y, p2.x-p1.x,p2.y-p1.y);
}
void getP(Point *p){
scanf("%d%d",&(p->x),&(p->y));
}
int main()
{
int i,j,k,m,n;
int s,flag;
Point p0,q0,p,q,r;
while(scanf("%d",&n),n){
if(n<3){
for(i=0;i<n;i++) scanf("%*d%*d");
puts("convex");
continue;
}
flag=1;
getP(&p0); getP(&q0);
r=p0; p=q0;
for(i=2;i<n;i++){
getP(&q);
if(corss(r,p,q)<0) flag=0;
r=p; p=q;
}
if(corss(r,p,p0)<0) flag=0;
if(corss(p,p0,q0)<0) flag=0;
if(flag) puts("convex");
else puts("concave");
}
return 0;
}