旋转卡壳——目录页

部署运行你感兴趣的模型镜像

一些历史:

1978年, M.I. Shamos's Ph.D. 的论文"Computational Geometry"标志着计算机科学的这一领域的诞生。 当时他发表成果的是一个寻找凸多边形直径的一个非常简单的算法, 即根据多边形的一对点距离的最大值来确定。
后来直径演化为由一对 对踵点对来确定。 Shamos提出了一个简单的 O(n) 时间的算法来确定一个凸 n 角形的对踵点对。 因为他们最多只有 3 n/2 对, 直径可以在 O(n) 时间内算出。
如同Toussaint后来提出的, Shamos的算法就像绕着多边形旋转一对卡壳。 因此就有了术语“旋转卡壳”。 1983年, Toussaint发表了一篇论文, 其中用同样的技术来解决许多问题。 从此, 基于此模型的新算法就确立了, 解决了许多问题。

他们包括:
  • 计算距离
    • 凸多边形直径
    • 凸多边形宽
    • 凸多边形间最大距离
    • 凸多边形间最小距离
  • 外接矩形
    • 最小面积外接矩形
    • 最小周长外接矩形
  • 三角剖分
    • 洋葱三角剖分
    • 螺旋三角剖分
    • 四边形剖分
  • 凸多边形属性
    • 合并凸包
    • 找共切线
    • 凸多边形交
    • 临界切线
    • 凸多边形矢量和
  • 最薄截面
    • 最薄横截带

 

原文地址:http://cgm.cs.mcgill.ca/~orm/rotcal.frame.html

 

转载请注明出处,谢谢!

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

### 旋转卡壳算法的工作机制 旋转卡壳(Rotating Calipers)是一种用于解决几何问题的有效算法,尤其适用于凸包上的操作。其核心思想是利用一对平行线夹住凸包,并通过不断调整这两条直线的方向来遍历整个凸包的边界[^1]。 #### 几何背景 该算法基于这样一个事实:对于任意给定的一组点集 \( P \),如果已经计算出了这些点的凸包,则可以通过一组特定方向的平行线唯一定义凸包的最大宽度或直径。这种技术可以用来高效求解诸如凸包直径、最小包围矩形面积等问题[^1]。 #### 数学原理 设凸包上有两个顶点 \( A_i, B_j \) 分别位于两条相互垂直的切线上,则当其中一条切线沿顺时针方向旋转一个小角度时,另一条也会相应移动至新的位置以保持与凸包相切的关系。这一过程中涉及的关键运算包括向量叉积以及极角排序等基础几何工具[^1]。 具体而言,在实现中通常会采用如下步骤: 1. 预处理阶段先构建目标点集合对应的凸包; 2. 初始化两指针分别指向初始状态下满足条件的一对反向最远端点; 3. 迭代更新这两个索引直到完成一轮完整的扫描周期为止;在此期间记录下每次遇到更优解的情况作为最终结果的一部分输出即可。 ```python def rotating_calipers(hull): n = len(hull) if n < 2: return None # Initialize the first pair of points (i,j). i, j = 0, find_farthest_point_from_line(hull[0], hull) max_distance = distance_between_points(hull[i], hull[j]) while True: next_i = (i + 1) % n next_j = (j + 1) % n cross_product = calculate_cross_product( vector_subtract(hull[next_i], hull[i]), vector_subtract(hull[next_j], hull[j])) if cross_product >= 0: current_max = distance_between_points(hull[i], hull[next_j]) if current_max > max_distance: max_distance = current_max j = next_j else: current_max = distance_between_points(hull[next_i], hull[j]) if current_max > max_distance: max_distance = current_max i = next_i if (i == 0 and j == find_farthest_point_from_line(hull[0], hull)): break return max_distance ``` 以上代码片段展示了如何应用旋转卡壳方法寻找二维平面上由若干离散点构成之凸包内的最大距离——即所谓“凸包直径”。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值