题目描述:
按逆时针顺序输入n个点的坐标,判断这N个点组成的多边形是不是凸多边形。
分析:
将输入的点连接起来。
对p1,p2,p3三个点,我们设向量a=p2-p1,向量b=p3-p2
向量的叉积 a×b = x1×y2 - x2×y1
若a×b>0则b在a的逆方向
若a×b<0则b在a的顺方向
若a×b=0则b与a共线
代码
#include<stdio.h>
typedef struct{
int x,y;
}point;
int flag;
int function1(int x1,int y1,int x2,int y2){
return x1*y2-x2*y1;
}
int function2(point a,point b,point c){
return function1(b.x-a.x,b.y-a.y,c.x-b.x,c.y-b.y);
}
void get(point *p){
scanf("%d%d",&p->x,&p->y);
}
int main(){
int i,n;
point a,b,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;
get(&a);
get(&b);
p=a;q=b;
for(i=0;i<n-2&&flag;i++){
get(&r);
if(function2(p,q,r)<0)flag=0;
p=q;q=r;
}
if(function2(q,r,a)<0)flag=0;
if(function2(r,a,b)<0)flag=0;
puts(flag?"convex":"concave");
}
return 0;
}