多边形

Time Limit: 1000 MS     Memory Limit: 65536 K

Total Submit: 113(42 users)   Total Accepted: 51(38 users) Rating:

Special Judge: No

Description

一个封闭的多边形定义是被有限个线段包围。线段的相交点称作多边形的顶点,当你从多边形的一个顶点沿着线段行走时,最终你会回

到出发点。

凸多边形(convex)想必大家已经很熟悉了,下图给出了凸多边形和非凸多边形实例。

这里讨论的是在平面坐标的封闭凸多边形,多变形的顶点一个顶点在原点(x=0,y=0).图2显示的那样。这样的图形有两种性质。

第一种性质是多边形的顶点会在平面上少于等于三个象限,就如图二那样,第二向县里面没有多边形的点(x<0,y>0)。

为了解释第二种性质,假设你沿着多边形旅行,从原点(0,0)出发遍历每个顶点一次,当你遍历到除原点(0,0)时候,从这一点画一条和原点(0,0)的斜线。计算这种斜率。当计算完所有的斜率时候,这些斜率组成升序或降序顺序。

如图三所示。

Input

输入包含多组测试数据。

第一行输入一个整数n(50>n>0),其中n表示多边形顶点的个数,当n为0时表示结束。紧跟n行输入在平面中多边形的顶点整数x,y(-999<x,y<999),其中第一行是原点(0,0),其他的多边形顶点可能不是顺序给出。没有顶点在x,y坐标轴上,没有三个顶点共线。

Output

输出多边形的顶点,每个顶点一行,原点(0,0)首先输出。其他顶点的输出构成沿多边形(逆时针方向)构成一条旅游路线。输出格式为(x,y)如实例

Sample Input

10

0 0

70 -50

60 30

-30 -50

80 20

50 -60

90 -20

-30 -40

-10 -60

90 10

0

Sample Output

(0,0)

(-30,-40)

(-30,-50)

(-10,-60)

(50,-60)

(70,-50)

(90,-20)

(90,10)

(80,20)

(60,30)

Author

鲁学涛


  计算几何,极角排序

  极角排序的基础练习题,我用atan2做的,据说这可能会伤精度,so可以采用象限极角排序,不失精度。有兴趣的同学可以查查。

  极角的解释  极角排序(atan2方法+象限排序)详解

  手工排序代码

 #include <stdio.h>
#include <math.h>
typedef struct {
double x,y;
}Point;
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
if(n==) break;
Point p[];
int i,j,num[];
for(i=;i<=n;i++){ //输入点集
scanf("%lf%lf",&p[i].x,&p[i].y);
num[i] = i; //排序的时候记录顺序
}
double a[];
a[] = ;
for(i=;i<=n;i++)
a[i] = atan2(p[i].y,p[i].x); //利用math库中的atan2(y,x)函数,求坐标(x,y)与x正半轴逆时针方向的夹角。
for(i=;i<=n-;i++) //注意从2开始排序
for(j=;j<=n-i+;j++)
if(a[j]>a[j+]){
double t;
t = a[j];a[j] = a[j+];a[j+] = t;
int tt;
tt=num[j];num[j]=num[j+];num[j+]=tt;
}
for(i=;i<=n;i++) //输出
printf("(%d,%d)\n",(int)p[num[i]].x,(int)p[num[i]].y);
}
return ;
}

  利用sort函数排序代码

 #include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef struct {
double x,y;
}Point;
bool cmp(Point a,Point b) //利用atan2的比较函数
{
double d1 = atan2(a.y,a.x);
double d2 = atan2(b.y,b.x);
return d1 < d2;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
if(n==) break;
Point p[];
int i;
for(i=;i<=n;i++){ //输入点集
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p+2,p+n+1,cmp); //排序
for(i=;i<=n;i++) //输出
printf("(%d,%d)\n",(int)p[i].x,(int)p[i].y);
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hrbustoj 1305:多边形(计算几何,极角排序练习)的更多相关文章

  1. bzoj 5099 [POI2018]Pionek 计算几何 极角排序

    [POI2018]Pionek Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 80[Submit][Status][Disc ...

  2. hdu-5784 How Many Triangles(计算几何+极角排序)

    题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  3. 【计算几何+极角排序+爆ll】E. Convex

    https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...

  4. poj 1696:Space Ant(计算几何,凸包变种,极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2876   Accepted: 1839 Descrip ...

  5. 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles

    平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...

  6. 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival

    平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...

  7. LightOJ 1285 - Drawing Simple Polygon (几何,极角排序)

    1285 - Drawing Simple Polygon   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  8. HDU 5738 Eureka(极角排序)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...

  9. 【BZOJ-1913】signaling信号覆盖 极角排序 + 组合

    1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1232  Solved: 506[Subm ...

随机推荐

  1. 【LeetCode】90. Subsets II (2 solutions)

    Subsets II Given a collection of integers that might contain duplicates, S, return all possible subs ...

  2. 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal

    Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...

  3. js表单验证控制代码大全

    http://www.cnblogs.com/SAL2928/archive/2008/10/24/1319020.html目录: 1:js 字符串长度限制.判断字符长度.js限制输入.限制不能输入. ...

  4. php回调函数原理和实例

    原理 自己调用自己 称之为“递归”,而不是回调 你也知道回调的关键是这个回既然是回,那么就有一个谁是主体的问题,因为回调是往回调用的意思我调用了函数A,而函数A在执行过程中调用了我提供的函数B,这个函 ...

  5. Spring Cloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  6. AngularJS中的$apply

    $apply()方法可以在angular框架之外执行angular JS的表达式,例如:DOM事件.setTimeout.XHR或其他第三方的库. 当仅仅使用Angular所提供的对象时,你不该过多的 ...

  7. verilog gtkwave

    gtkwave,开源波形显示软件 来自 bluesky1 博客.http://blog.sina.com.cn/s/blog_566ca6330100c0t3.html~type=v5_one& ...

  8. Elastic_Terms 内容分类统计

    Terms 按字段的值进行分类,并计算出doc_count, bucket聚合 类似于 group by 常用统计 分类并出现频率高的,并进一步挖出,计算出想要的数据. 参考资料 https://ww ...

  9. 419. Roman to Integer【medium】

    Given a roman numeral, convert it to an integer. The answer is guaranteed to be within the range fro ...

  10. 漫谈Linux下的音频问题(转)

    转自 http://www.kunli.info/2009/03/24/linux-sound-issue/ 现今的互联网,比较Linux和Windows的战争贴基本都成月经贴了.一群群激进的用户不断 ...