我们知道三个点可以确定两个向量,那么我们按照题意的顺序依次取三个点(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