hdu 2108 Shape of HDU 计算几何(向量的叉积)
来源:互联网 发布:矩阵 特征值 特征向量 编辑:程序博客网 时间:2024/05/17 09:37
#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时,即为凹多边形。*/