哈理工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
任意给定一个多边形,判断它是凸还是凹。多边形的顶点以乱序方式给出。
输入包含多组测试数据,每组数据占两部分。第一行是一个整数n,表示多边形顶点的个数,接下来n(3<=n<=1000)行每行两个整数,分别表示n个顶点的坐标(xi,yi)(-1000<=xi,yi<=1000)。
n为0时输入结束。
Output对于每组测试样例,如果多边形的形状为凸多边形,请输出“Convex”,否则输出”Concave”,每组样例的输出占一行。
Sample Input4
0 0
1 0
1 1
0 1
5
0 0
1 -1
1 1
-1 1
-1 -1
0
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
- 哈理工OJ 1643 多边形-2【极角排序+凸凹包判断】
- 哈理工OJ 1642 多边形-1【计算几何】【判断凸凹包】
- 哈理工OJ 1305 /POJ 2007 多边形 Scrambled Polygon【计算几何】【极角排序】
- hdu 2108 Shape of HDU(判断多边形是凸凹边形)
- 哈理工OJ 295 方方正正(判断01矩阵是否合法)
- hrbust/哈理工oj 2028 小猴和冒泡2【归并排序】
- 哈理工OJ 2284 Sign Deliveries(结构体排序)
- 哈理工oj 1631 技能修炼【拓扑排序】
- 哈理工OJ 1631 技能修炼(拓扑排序)
- 哈理工OJ 1150 相识(排序后枚举)
- 哈理工OJ 2261 近代化改修(排序+贪心)
- 哈理工oj 1756Merge Intervals【结构体 + 排序】
- hdu2108叉积判断凸凹
- 山东理工OJ 1201 字符串排序
- ASCII码排序(南阳理工OJ)
- 南阳理工OJ---ASCII码排序
- 哈理工OJ 2179(深搜)
- 哈理工 oj 1161 Leyni
- 获取系统环境变量
- linux的前台后台进程
- ffmpeg编译
- 【C++基础】C++函数模板(二)
- nuttx编译过程
- 哈理工OJ 1643 多边形-2【极角排序+凸凹包判断】
- RMQ 模板
- 在1.7的jdk环境下 如何通过修改ant脚本文件设置某个指定项目编译环境为1.6
- Swift2.2 学习笔记(二) ___控制流
- c语言动态内存分配之正确使用指针
- 设计模式——原则
- BBED如何配置
- Unity3D和Lua之间的相互调用
- OK6410-A开发板学习-③uboot移植(1)