hdu2108(判断凸多边形)


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2108

 

题意:

给出一个多边形的所有顶点,判断是不是凸多边形;

 

思路:

判断凸多边形的方法比较多,如:若存在一条边,它的两边都有点,那么它是凹多边形;若存在一个点,去掉它后该多边形的面积大于原来的多边形,则它是凹多边形;

我们还可以用相邻两边的旋转角来判断,逆时针取点,若存在点p1, p2, p3,矢边p1p2, 到p2p3,为顺时针旋转则此多边形为凹多边形;

对于判断旋转角,我们可以用矢量乘积来判断:

令 gg=p1p2*p2p3;

若gg<0, 其旋转为顺时针;

若gg=0, 两边共线;

若gg>0, 其旋转为逆时针;

对于如何计算二维向量的叉积,我们可以将其纵坐标看做0,再像计算三维向量叉积那样用行列式计算;

p1p2*p2p3=x1*y2-x2*y1;、

此方法代码比较简洁,时间复杂度也较小,我们就选这个方法啦;

 

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #define MAXN 1000001
 4 using namespace std;  5 
 6 int a[MAXN], b[MAXN];  7 
 8 int gg(int p1, int p2, int p3){  9     int jj=(a[p2]-a[p1])*(b[p3]-b[p2])-(a[p3]-a[p2])*(b[p2]-b[p1]); 10     return jj<0?0:1; 11 } 12 
13 int main(void){ 14     int n; 15     while(scanf("%d", &n)&&n){ 16         for(int i=0; i<n; i++){ 17             scanf("%d%d", &a[i], &b[i]); 18  } 19         int flag=1; 20         a[n]=a[0], b[n]=b[0]; //***注意第n-1个点的判断
21         a[n+1]=a[1], b[n+1]=b[1]; 22         for(int i=0; i<n; i++){ 23             flag=gg(i, i+1, i+2); 24             if(!flag){ 25                 printf("concave\n"); 26                 break; 27  } 28  } 29         if(!flag){ 30             continue; 31  } 32         printf("convex\n"); 33  } 34     return 0; 35 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM