HDU2108+几何+判断凸多边形

View Code
 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 }

再附上 判断多边形,不允许相邻边共线的模板

View Code
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 ]的值 代表的是 是否出现过“负旋转”的情况

 

posted @ 2013-03-19 14:43  xxx0624  阅读(271)  评论(0编辑  收藏  举报