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

posted @ 2019-03-14 10:23  alusang  阅读(269)  评论(0编辑  收藏  举报