HDU2108+几何+判断凸多边形
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 几何+判断凸多边形 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 //#include<map> 11 #include<math.h> 12 using namespace std; 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 205; 16 const int inf = 0x7fffffff; 17 const double pi=acos(-1.0); 18 const double eps = 1e-8; 19 struct point { 20 double x,y; 21 }; 22 point p[ maxn ]; 23 int judge( double x ){ 24 if( x>eps ) 25 return 1; 26 if( x<-eps ) 27 return 2; 28 return 0; 29 } 30 double xmult( point a,point b,point c ){ 31 return ( a.x-c.x )*( b.y-c.y ) - ( a.y-c.y )*( b.x-c.x ); 32 } 33 /* 34 xmult: 35 b 36 | 37 | 38 c---a( from a to b ) 39 */ 40 int is_convex( int n,point p[] ){ 41 int flag[]={1,1,1}; 42 for( int i=0;i<n&&( flag[1]|flag[2] );i++ ){ 43 flag[ judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) ) ]=0; 44 } 45 return flag[1]|flag[2]; 46 }//判定凸多边形,允许相邻边共线 47 /* 48 int solve( int n ){ 49 for( int i=0;i<n;i++ ){ 50 if (judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) )==2) 51 return -1; 52 } 53 return 1; 54 } 55 */ 56 int main(){ 57 int n; 58 while( scanf("%d",&n)!=EOF,n ){ 59 for( int i=0;i<n;i++ ) 60 scanf("%lf%lf",&p[ i ].x,&p[ i ].y); 61 62 if( is_convex(n,p)==true ) 63 printf("convex\n"); 64 else 65 printf("concave\n"); 66 67 /* 68 if(solve(n)==1)printf("convex\n"); 69 else printf("concave\n"); 70 */ 71 } 72 return 0; 73 }
再附上 判断多边形,不允许相邻边共线的模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int is_convex2( int n,point p[] ){ 2 int flag[]={1,1,1}; 3 for( int i=0;i<n&&flag[0]&&( flag[1]|flag[2] );i++ ){ 4 flag[ judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) ) ]=0; 5 } 6 return flag[0]&&flag[1]|flag[2]; 7 }//判定凸多边形,不允许相邻边共线
flag[ 0 ]的值 代表的是 是否出现过共线的情况
flag[ 1 ]的值 代表的是 是否出现过“正旋转”的情况
flag[ 2 ]的值 代表的是 是否出现过“负旋转”的情况
keep moving...