当前位置: 首页 > news >正文

计算几何——极角排序

极角

在平面上任取一个顶点 O O O,称为极点;作射线 X X X,那么 O X OX OX就是极轴。平面上任意一点和 O O O点作向量,与 O X OX OX形成的夹角就叫做极角。通常选定逆时针方向为正,一般我们以 x x x轴为极轴,那么极角就是平面向量与 x x x轴的夹角
在这里插入图片描述

极角排序

给定极轴,在平面上分布着若干点,将这些点相对于极轴的极角大小排序,就叫做极角排序。注意如果极角相同,那么需要按 x x x升序处理

如下图,排序后的点集为 A B C D E F ABCDEF ABCDEF
在这里插入图片描述

利用atan2(double y,double x)函数排序

a t a n 2 ( d o u b l e    y , d o u b l e    x ) atan2(double~~ y,double ~~x) atan2(double  y,double  x)函数返回的是原点至点 ( x , y ) (x,y) (x,y)的方位角,即与 x x x轴的夹角,单位是弧度,范围 ( − π , π ] (-π,π] (π,π]。因此 a t a n 2 ( d o u b l e    y , d o u b l e    x ) atan2(double~~ y,double ~~x) atan2(double  y,double  x)函数天然适合极角排序

bool cmp(Point a, Point b) {
    if(dcmp(atan2(a.y, a.x) - atan2(b.y, b.x)) == 0) //dcmp为判断浮点数是否为0的函数
        return a.x < b.x;
    return atan2(a.y, a.x) < atan2(b.y, b.x);
}

利用向量叉乘排序

下面是默认以 O O O点为极点

bool cmp(Point a, Point b) {
    if((a ^ b) == 0) return a.x < b.x;
    return (a ^ b) > 0;
}

如果需要自定义极点,那么就传入极点

Point o;  //o为极点

bool cmp(Point a, Point b) {
    Point p = a - c, q = b - o;
    if((p ^ q) == 0) return p.x < q.x;
    return (p ^ q) > 0;
}

相关文章:

  • 不同差异程度商品的电子商务策略
  • UVa1606 Amphiphilic Carbon Molecules(极角排序+扫描线)
  • 滴水之光 折射太阳
  • POJ3061 Subsequence(尺取法)
  • UVa11572 Unique Snowflakes(尺取法)
  • 对MM平台的一些思考
  • 2019 ICPC Asia Taipei - Hsinchu Regional
  • Android游戏的盈利模式探讨
  • POJ 2566 Bound Found(尺取法+前缀和)
  • Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  • HDU5358 First One(尺取法+数学)
  • Code Jam 2020 Qualification Round
  • Android开发指南-用户界面-通用布局对象
  • UVa1471 Defense Lines(LIS变形)
  • 计蒜客43467 Canyon Crossing(二分答案+多队列bfs)
  • ES6指北【2】—— 箭头函数
  • 「译」Node.js Streams 基础
  • AHK 中 = 和 == 等比较运算符的用法
  • Java 多线程编程之:notify 和 wait 用法
  • Linux gpio口使用方法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • XForms - 更强大的Form
  • 百度小程序遇到的问题
  • 反思总结然后整装待发
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记录一下第一次使用npm
  • 深度学习在携程攻略社区的应用
  • 使用Swoole加速Laravel(正式环境中)
  • 收藏好这篇,别再只说“数据劫持”了
  • 跳前端坑前,先看看这个!!
  • 详解移动APP与web APP的区别
  • 小试R空间处理新库sf
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • kubernetes资源对象--ingress
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • (03)光刻——半导体电路的绘制
  • (175)FPGA门控时钟技术
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (vue)页面文件上传获取:action地址
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .gitignore文件—git忽略文件
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 指南:抽象化实现的基类
  • .sdf和.msp文件读取
  • @Autowired标签与 @Resource标签 的区别
  • @WebService和@WebMethod注解的用法
  • [Android]How to use FFmpeg to decode Android f...
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [delphi]保证程序只运行一个实例
  • [Docker]十.Docker Swarm讲解