哈理工OJ 1643 多边形-2【极角排序+凸凹包判断】

来源:互联网 发布:高博软件地址 编辑:程序博客网 时间:2024/06/06 03:46

多边形-2Time Limit: 1000 MSMemory Limit: 32768 KTotal Submit: 35(9 users)Total Accepted: 13(7 users)Rating: Special Judge: NoDescription

任意给定一个多边形,判断它是凸还是凹。多边形的顶点以乱序方式给出。


Input

输入包含多组测试数据,每组数据占两部分。第一行是一个整数n,表示多边形顶点的个数,接下来n(3<=n<=1000)行每行两个整数,分别表示n个顶点的坐标(xi,yi)(-1000<=xi,yi<=1000)。

n为0时输入结束。

Output

对于每组测试样例,如果多边形的形状为凸多边形,请输出“Convex”,否则输出”Concave”,每组样例的输出占一行。

Sample Input

4
0 0
1 0
1 1
0 1
5
0 0
1 -1
1 1
-1 1
-1 -1
0

Sample Output

Convex
Concave


给我们一堆乱序的点,让我们判断是否为凸包、这里如果给我们的是按序点,我们直接用叉乘判断就可以了、例如这个例题:http://blog.csdn.net/mengxiang000000/article/details/50623520

但是这里给我们的是一堆乱序点,所以我们需要介入一个算法:极角排序算法:

极角排序:极角排序是根据坐标系内每一个点与x轴所成的角,逆时针比较,按照角度从小到大的方式排序、

这里POJ 2007提供给我们这种概念的两个图:




假设给我们的点是这样的:

0 070 -5060 30-30 -5080 2050 -6090 -20-30 -40-10 -6090 10

当我们用极角排序之后得到的点的排序是这样的:

(0,0)(-30,-40)(-30,-50)(-10,-60)(50,-60)(70,-50)(90,-20)(90,10)(80,20)(60,30)

其实就是概念中所述的那样,逆时针排序、得到有序的一些个点的坐标、这里如果我们得到了序列,那么我们就可以用凸包判断AC啦~

其实如果更加严谨的话,我们令p【0】是最左下角的点、

这里上AC代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;struct point{    int x,y;} p[1010];int cross(point a, point b, point c){    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}int dis(point a){    return (a.x-p[0].x)*(a.x-p[0].x)+(a.y-p[0].y)*(a.y-p[0].y);}int cmp(point a, point b)//极角排序、{    if(cross(p[0], a, b) > 0||(cross(p[0], a, b)==0&&dis(a) < dis(b)))        return 1;    return 0;}int main(){    int n;    while(~scanf("%d", &n))    {        if(n==0)break;        for(int i = 0; i < n; ++i)        {            scanf("%d%d", &p[i].x,&p[i].y);        }        sort(p, p+n, cmp);        p[n] = p[0];        p[n+1] = p[1];        int ok=1;        for(int i=0;i<n;i++)        {            double chacheng=(p[i+2].x-p[i].x)*(p[i+1].y-p[i].y)-(p[i+1].x-p[i].x)*(p[i+2].y-p[i].y);            if(chacheng<1e-5)            continue;            else            {                ok=0;            }        }        if(ok==0)        {            printf("Concave\n");        }        else        {            printf("Convex\n");        }    }    return 0;}









0 0
原创粉丝点击