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

 

你可能感兴趣的:(HDU)