一.极角,极径,极轴,极点概念

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。

对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。

那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针

二.排序方法

1.叉积排序(需要选定基准点P)

int dcmp(double x){if(fabs(x)<eps)return 0;return x>0?1:-1;}
struct Point{double x,y;int id;Point(double _x = 0,double _y = 0):x(_x),y(_y) {}
}point[maxn],Pole;
typedef Point Vector;
Vector operator+(Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator-(Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
double Cross(Vector A,Vector B){return A.x*B.y - B.x*A.y;}
bool Compare(Point A,Point B){//叉积按照极角由小到大排序if(dcmp(Cross(A-Pole,B-Pole))==0)return A.x<B.x;return Cross(A-Pole,B-Pole)>0;
}

2.atan2(double y,double x)排序

atan2(double y,double x)函数,返回的是点(x,y)与原点(0,0)连线与x轴正向之间的夹角弧度值

表示范围[-

bool cmp1(Point A,Point B){//以圆点为极点,连线与x轴正方向的夹角if(dcmp(atan2(A.y,A.x)-atan2(B.y,B.x))!=0)return atan2(A.y,A.x)<atan2(B.y,B.x);else return A.x<B.x;
}

3.象限排序

原因:叉积排序是不能排序360度的

int Quadrant(Point A){//返回所在象限if(A.x>0&&A.y>=0)return 1;if(A.x<=0&&A.y>0)return 2;if(A.x<0&&A.y<=0)return 3;if(A.x>=0&&A.y<0)return 4;
}
bool cmp2(Point A,Point B){//以原点为极点,先按照象限排序if(Quadrant(A)==Quadrant(B))return cmp1(A,B);else return Quadrant(A)<Quadrant(B);
}

注:atan2()好在速度快,精度低;叉积排序好在精度高,但速度慢

三.水题

1.POJ1696    Space Ant

#include <iostream>
//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define eps 1e-6
const int maxn = 10000 + 7;
int dcmp(double x){if(fabs(x)<eps)return 0;return x>0?1:-1;}
struct Point{double x,y;int id;Point(double _x = 0,double _y = 0):x(_x),y(_y) {}
}point[maxn],Pole;
typedef Point Vector;
Vector operator+(Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator-(Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
double Cross(Vector A,Vector B){return A.x*B.y - B.x*A.y;}
bool Compare(Point A,Point B){//叉积按照极角由小到大排序if(dcmp(Cross(A-Pole,B-Pole))==0)return A.x<B.x;return Cross(A-Pole,B-Pole)>0;
}
bool cmp1(Point A,Point B){//以圆点为极点,连线与x轴正方向的夹角if(atan2(A.y,A.x)!=atan2(B.y,B.x))return atan2(A.y,A.x)<atan2(B.y,B.x);else return A.x<B.x;
}
int Quadrant(Point A){//返回所在象限if(A.x>0&&A.y>=0)return 1;if(A.x<=0&&A.y>0)return 2;if(A.x<0&&A.y<=0)return 3;if(A.x>=0&&A.y<0)return 4;
}
bool cmp2(Point A,Point B){//以原点为极点,先按照象限排序if(Quadrant(A)==Quadrant(B))return cmp1(A,B);else return Quadrant(A)<Quadrant(B);
}
int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);int index = 0;for(int i = 0;i<n;i++){scanf("%d%lf%lf",&point[i].id,&point[i].x,&point[i].y);if(i!=0&&point[i].y<point[index].y)index = i;else if(i!=0&&point[i].y==point[index].y&&point[i].x<point[index].x)index = i;}swap(point[0],point[index]);Pole = point[0];for(int i = 1;i<n;i++){sort(point+i,point+n,Compare);Pole = point[i];}printf("%d",n);for(int i = 0;i<n;i++){printf(" %d",point[i].id);}printf("\n");}return 0;
}

计算几何----极角排序相关推荐

  1. POJ 1696 Space Ant(极角排序)【计算几何】

    ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  2. 【CCCC】L3-009 长城 (30分),计算几何+凸包,极角排序

    problem L3-009 长城 (30分) 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应 ...

  3. BZOJ 1132 [POI2008]Tro(极角排序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...

  4. L3-021 神坛(极角排序求三角形最小面积)

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序

    Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...

  6. HihoCoder - 1879 Rikka with Triangles(极角排序求所有锐角三角形的面积)

    题目链接:点击查看 题目大意:给出 n ( n <= 2000 ) 个点,求出所有不同的锐角三角形的面积 题目分析:n^3 暴力枚举肯定是不可以的,和之前写过的一个题目思路很像:HDU-5784 ...

  7. POJ - 1696 Space Ant(极角排序)

    题目链接:点击查看 题目大意:现在有一只特殊的蚂蚁,它会按照以下规则尽可能长的寻找路径: 不能回头 不能右转 只能逆时针行走 现在给出n个点,输出最长的路径 题目分析:既然是逆时针旋转,那么每次只能走 ...

  8. 简单几何(极角排序) POJ 2007 Scrambled Polygon

    题目传送门 题意:裸的对原点的极角排序,凸包貌似不行. /************************************************ * Author :Running_Time ...

  9. codeforces 598C C. Nearest vectors(极角排序)

    题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

最新文章

  1. 干货 | 携程是如何做AB实验分流的
  2. Oracle 11g安装步骤详谈
  3. 【盘点2018】社交领域投融资报告来了!
  4. window10安装oracle VirtualBox 虚拟机+ubuntu16.04安装Ros
  5. 自动驾驶汽车寿命只有四年?
  6. MySQLdb 1031 Error
  7. python使用lxml解析html获取页面内所有叶子节点的xpath路径
  8. AD19生成PCB_在Altium中导入Cadence Allegro的PCB文件
  9. Mac上双系统中Windows无法使用苹果鼠标键盘,如何处理
  10. 黑金Xilinx FPGA学习笔记(一)verilogHDL扫盲文-(1)
  11. android+考研助手,安卓考研助手问题总结及改进规划
  12. python将多个列表合并_Python中将两个或多个list合成一个list的方法小结
  13. Android日期类组件学习
  14. 面试官嘲笑我,这你都不会?
  15. java 实现word文档的在线签批圈阅(手写批注)
  16. HWDB1.1数据集 | 手写汉字数据集 |.gnt 转换 .png格式图片| 【❤️有效转换❤️】
  17. Mysql 循环更新
  18. 这5个电脑软件提高工作效率1000%,装机必备
  19. Beginning WF4读书笔计 - 第一章 03设计示图及xaml代码
  20. 王者荣耀战区活跃度排名怎么实现的?这篇文章给你答案!

热门文章

  1. android camera2 qcom,Qcom平台 Camera的一些知识点 之MCLK
  2. python读awx文件_Ansible AWX 安装使用简明文档
  3. 西南大学计算机学,2020年西南大学计算机应用技术考研经验分享
  4. 怎么把视频做成背景html,基于HTML5 video标签的背景视频效果
  5. 天若OCR文字识别V4.48
  6. 揭秘不同版本CMMI认证证书的真假
  7. 完全颠覆你世界观的10个科学实验!从此脑洞大开
  8. 读书有益——》小朋友的诗(五)
  9. java/php/net/pythont员工管理系统设计与实现设计
  10. 用手机数据来玩绝地求生吃鸡会是什么感觉?