判断凸包 模板(向量叉乘)

版权声明:emmmmm喵喵喵 https://blog.csdn.net/MallowFlower/article/details/81584205
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1010;
struct node{
    int a,b;
}e[maxn];
bool find(int x1,int y1,int x2,int y2,int x3,int y3)
{
    //cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<x3<<" "<<y3<<endl;
    return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)>=0;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        int i,j,k,flag=0;
        for(i=0;i<n;i++)
            scanf("%d%d",&e[i].a,&e[i].b);
        if(!find(e[n-1].a,e[n-1].b,e[0].a,e[0].b,e[1].a,e[1].b))flag=1;
        if(!find(e[n-2].a,e[n-2].b,e[n-1].a,e[n-1].b,e[0].a,e[0].b))flag=1;
        for(i=0;i<n-2;i++)
        {
            if(flag==1)break;
            if(!find(e[i].a,e[i].b,e[i+1].a,e[i+1].b,e[i+2].a,e[i+2].b))flag=1;
        }
        if(flag)printf("concave\n");
        else printf("convex\n");
    }
    return 0;
}
/*
    向量a=(x1,y1),b=(x2,y2);
    向量的叉积a×b=x1*y2-x2*y1;
    当a×b>0时,b在a的逆时针方向,当a×b=0时,b与a共线,当a×b<0时,b在a的顺时针方向。
    对于连续输入的三点A(x1,y1),B(x2,y2),C(x3,y3);
    根据凸多边形的性质:向量AC(x3-x1,y3-y1)必定在向量AB(x2-x1,y2-y1)的逆时针方向,或者共线。
    所以AB×AC>=0,即ans=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)>=0
    当出现ans<0时,即为凹多边形。
*/

猜你喜欢

转载自blog.csdn.net/MallowFlower/article/details/81584205