hrbustoj 1305:多边形(计算几何,极角排序练习)
多边形
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可以采用象限极角排序,不失精度。有兴趣的同学可以查查。
手工排序代码:
#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:多边形(计算几何,极角排序练习)的更多相关文章
- bzoj 5099 [POI2018]Pionek 计算几何 极角排序
[POI2018]Pionek Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 80[Submit][Status][Disc ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 【计算几何+极角排序+爆ll】E. Convex
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...
- poj 1696:Space Ant(计算几何,凸包变种,极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2876 Accepted: 1839 Descrip ...
- 【计算几何】【极角排序】【二分】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三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...
- 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...
- LightOJ 1285 - Drawing Simple Polygon (几何,极角排序)
1285 - Drawing Simple Polygon PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- HDU 5738 Eureka(极角排序)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...
- 【BZOJ-1913】signaling信号覆盖 极角排序 + 组合
1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1232 Solved: 506[Subm ...
随机推荐
- 【LeetCode】90. Subsets II (2 solutions)
Subsets II Given a collection of integers that might contain duplicates, S, return all possible subs ...
- 【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 ...
- js表单验证控制代码大全
http://www.cnblogs.com/SAL2928/archive/2008/10/24/1319020.html目录: 1:js 字符串长度限制.判断字符长度.js限制输入.限制不能输入. ...
- php回调函数原理和实例
原理 自己调用自己 称之为“递归”,而不是回调 你也知道回调的关键是这个回既然是回,那么就有一个谁是主体的问题,因为回调是往回调用的意思我调用了函数A,而函数A在执行过程中调用了我提供的函数B,这个函 ...
- Spring Cloud(五):熔断监控Hystrix Dashboard和Turbine
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...
- AngularJS中的$apply
$apply()方法可以在angular框架之外执行angular JS的表达式,例如:DOM事件.setTimeout.XHR或其他第三方的库. 当仅仅使用Angular所提供的对象时,你不该过多的 ...
- verilog gtkwave
gtkwave,开源波形显示软件 来自 bluesky1 博客.http://blog.sina.com.cn/s/blog_566ca6330100c0t3.html~type=v5_one& ...
- Elastic_Terms 内容分类统计
Terms 按字段的值进行分类,并计算出doc_count, bucket聚合 类似于 group by 常用统计 分类并出现频率高的,并进一步挖出,计算出想要的数据. 参考资料 https://ww ...
- 419. Roman to Integer【medium】
Given a roman numeral, convert it to an integer. The answer is guaranteed to be within the range fro ...
- 漫谈Linux下的音频问题(转)
转自 http://www.kunli.info/2009/03/24/linux-sound-issue/ 现今的互联网,比较Linux和Windows的战争贴基本都成月经贴了.一群群激进的用户不断 ...