极角排序详解:

极角排序详解

名词释义:

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标

四种极角排序代码详解:

 1 struct point
 2 {
 3     double x,y;
 4 };
 5
 6 double cross(double x1,double y1,double x2,double y2) //计算叉积
 7 {
 8     return (x1*y2-x2*y1);
 9 }
10
11 double compare(point a,point b,point c)
12 {
13     return cross((b.x-a.x),(b.y-a.y),(c.x-a.x),(c.y-a.y));
14 }

1、利用complex类按极角从小到大排序:

1 bool cmp0(const point& a, const point& b) // 利用complex类按极角从小到大排序
2 {
3     complex<double> c1(a.x,a.y);                   //头文件 #include<complex>
4     complex<double> c2(b.x,b.y);
5     if( arg(c1) == arg(c2))
6         return a.x<b.x;
7     return arg(c1) < arg(c2);
8 }

2、利用atan2()函数按极角从小到大排序

1 bool cmp1(point a,point b)//利用atan2()函数按极角从小到大排序
2 {
3     if(atan2(a.y,a.x)!=atan2(b.y,b.x))
4         return atan2(a.y,a.x)<atan2(b.y,b.x);
5     else return a.x<b.x;
6 }

3、利用叉积按极角从小到大排序

1 bool cmp2(point a,point b) //利用叉积按极角从小到大排序
2 {
3     point c;//原点
4     c.x = 0;
5     c.y = 0;
6     if(compare(c,a,b)==0)
7         return a.x<b.x;
8     else return compare(c,a,b)>0;
9 }

4、先按象限从小到大排序 再按极角从小到大排序

 1 int Quadrant(point a)  //象限排序
 2 {
 3     if(a.x>0&&a.y>=0)  return 1;
 4     if(a.x<=0&&a.y>0)  return 2;
 5     if(a.x<0&&a.y<=0)  return 3;
 6     if(a.x>=0&&a.y<0)  return 4;
 7 }
 8
 9
10 bool cmp3(point a,point b)  //先按象限从小到大排序 再按极角从小到大排序
11 {
12     if(Quadrant(a)==Quadrant(b))
13         return cmp1(a,b);
14     else Quadrant(a)<Quadrant(b);
15 }
本文为个人随笔,如有不当之处,望各位大佬多多指教.若能为各位博友提供小小帮助,不胜荣幸.
时间: 2024-10-04 06:10:24

极角排序详解:的相关文章

极角排序详解

关于极角排序: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向). 对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标. 那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针. 极角排序常用的四种方法: 在说四种方法之前,给出一会用到的函数和存储点的结构体 struct point//存储点 { double x

Excel2010排序详解

我倒是要看看这一天一篇的发表频率,能让我自己坚持多长时间. 今天跟大家分享的主要内容是在Excel中的筛选功能,这个功能应该是谁都用过,把一列数据按照从大到小,从小到大的,有意义或无意义的排列着.这个方法大家都会,用着几个按钮就都能搞定. 稍微复杂点的操作呢,比如按多关键字排序,按照单元格颜色排序,局部排序,按行横向排序,excel是如何完成的呢?耐心往下看. 1 按照多关键字排序.先看数据源,先按单据编号排序,在单据编号相同的情况下,按照商品编号排序,如果商品编号再相同,就按单据日期排序.这个

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

图论-拓扑排序详解

拓扑排序(topsort)详解 这篇随笔就信息学奥林匹克竞赛中图论的一个知识点--拓扑排序进行讲解.拓扑排序的内容比较基础,只要求读者学习过并了解信息学中图的相关定义和一些专业名词,但是拓扑排序的变形题目比较多,希望读者在看完本随笔后认真体会练习,掌握拓扑排序. 上课! 拓扑排序的定义 顾名思义,这是一种排序,确切地说,是一种图上排序,在一张有向无环图(注解:有向无环图即很多参考书和题解中所说的DAG)上进行排序,把其中的所有节点排成一个序列,使得图中的任意一对有边相连的节点(u,v)u要出现在

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

选择排序详解

选择排序 选择排序是最简单的排序方法之一,它的做法是这样的:首先,找出数组中最小的那个元素,将最小的元素与第一个元素的位置互换,然后找出数组中第二小的元素,与数组中第二个元素互换位置(如果要比较的元素是当前最小,则自己和自己交换),以此类推,直到遍历了整个数组.这种方法叫做选择排序,因为它会不断地选择剩余元素中的最小者. 表格1-1排序步骤 初始值: 1 10 -5 9 8 7 3 第一趟: -5 10 1 9 8 7 3 第二趟: -5 1 10 9 8 7 3 第三趟: -5 1 3 9 8

C#选择排序详解

选择排序图解                         选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总

java中Collections.sort排序详解

Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的.compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数.equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.so