HDU-2108-叉积判断凸多边形
我们知道三个点可以确定两个向量,那么我们按照题意的顺序依次取三个点(a,b,c)组成向量(b-a和c-b),然后如图:
将(b-a)平移后得到(b-a)',然后根据叉积的右手定则,来得出(b-a)'是旋转多少度后与(c-b)方向相同的。
这时我们发现叉积小于零时组成的形状是凹的,那么这个题判断是否有三个点叉积小于零即可。
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <queue> #include <set> #include <map> #include <stack> #include <iomanip> #include <string> using namespace std; const int maxn=105; int n; int x[maxn],y[maxn]; bool Judge(int a,int b,int c){//叉积公式(x1*y2-y1*x2) int u=(x[b]-x[a])*(y[c]-y[b]); int v=(x[c]-x[b])*(y[b]-y[a]); if(u-v<0) return true; else return false ; } int main() { while(scanf("%d",&n) && n){ for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); x[n+1]=x[1];//记住这里要首尾的点也判断 y[n+1]=y[1]; x[n+2]=x[2]; y[n+2]=y[2]; int flag=0; for(int i=1;i<=n;i++) if(Judge(i,i+1,i+2)) flag=1;//依次取三个点 if(flag) printf("concave\n"); else printf("convex\n"); } return 0; }
第一次画图用的画板QAQ