计算几何学习笔记之旋转卡壳
2016-04-01 18:11
363 查看
旋转卡壳的用途太广太广了,而且每种用途代码都大同小异,这里只简单介绍一下(毕竟我也没怎么写过)
什么是旋转卡壳?可以想象成有一双筷子(筷子是平行的),把凸多边形夹了起来,然后不停地旋转,旋转。旋转中筷子要么是紧贴多边形的边要么就是紧贴多边形的顶点。
旋转卡壳简介:/article/2838640.html
计算凸多边形上的最远点对(又叫直径)。这样考虑方法:对于每一个点,都求一求它到每个点的距离(这不就跟暴力没有区别了吗!!)。
这样做会有很多无用功。如果一根筷子边紧贴多边形的一条边,那么离这条边最远的点不就是与它们构成的最大面积的三角形吗?于是乎,每遍历一条边的时候,就把另外一个点朝相同方向转动直到面积最大(这个面积的变化是单峰的),然后求一求几个点的最短距离。(为什么是几个点?)因为另外一根筷子有可能与多边形的另外一条边重合。如下图:
什么是旋转卡壳?可以想象成有一双筷子(筷子是平行的),把凸多边形夹了起来,然后不停地旋转,旋转。旋转中筷子要么是紧贴多边形的边要么就是紧贴多边形的顶点。
旋转卡壳简介:/article/2838640.html
计算凸多边形上的最远点对(又叫直径)。这样考虑方法:对于每一个点,都求一求它到每个点的距离(这不就跟暴力没有区别了吗!!)。
这样做会有很多无用功。如果一根筷子边紧贴多边形的一条边,那么离这条边最远的点不就是与它们构成的最大面积的三角形吗?于是乎,每遍历一条边的时候,就把另外一个点朝相同方向转动直到面积最大(这个面积的变化是单峰的),然后求一求几个点的最短距离。(为什么是几个点?)因为另外一根筷子有可能与多边形的另外一条边重合。如下图:
double RotatingCaliper(int m) { int q = 1; ch[m] = ch[0]; double ans = 0; for(int p = 0; p < m; p++) { while(fabs(cross(ch[q+1]-ch[p+1], ch[p]-ch[p+1])) > fabs(cross(ch[q]-ch[p+1], ch[p]-ch[p+1]))) q = (q+1)%m; ans = max(ans,max(dis(ch[p],ch[q]),dis(ch[p+1],ch[q+1]))); ans = max(ans,max(dis(ch[p],ch[q+1]),dis(ch[p+1],ch[q]))); } return ans; }
相关文章推荐
- Netstat 中 Recv-Q和Send-Q状态
- 认识与学习bash
- RunLoop基础
- 前端学习: JS学习
- JavaScript之jQuery-2 jQuery选择器(jQuery选择器、基本选择器、层次选择器、过滤选择器、表单选择器)
- 前端学习: HTML 学习
- DWM1000DISCOVERY需要的工具
- perl lwp get uft-8和gbk
- 解释型语言与编译型语言的区别
- c++第一次上机实验-1
- perl lwp get uft-8和gbk
- perl lwp get uft-8和gbk
- CGA:自动判断模型间关系的3D建模方法
- 前端学习: CSS学习
- Linux磁盘修复e2fsck命令
- HTTP抓包的实践--工具
- PHP文件上传处理
- kernel 3.10内核源码分析--中断--中断和异常返回流程
- uva1629Cake slicing
- FZU 2123 数字的孔数