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