題目鏈接: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 }