#circle #smallest #recursion #problem #points #iterative #enclosing

最小包围圆

Welzl算法的最小包围圆迭代和递归二维实现

2个不稳定版本

0.2.0 2024年2月25日
0.1.0 2023年3月25日

算法中排名635

Download history 662/week @ 2024-03-13 632/week @ 2024-03-20 219/week @ 2024-03-27 675/week @ 2024-04-03 650/week @ 2024-04-10 636/week @ 2024-04-17 490/week @ 2024-04-24 378/week @ 2024-05-01 446/week @ 2024-05-08 601/week @ 2024-05-15 432/week @ 2024-05-22 504/week @ 2024-05-29 685/week @ 2024-06-05 780/week @ 2024-06-12 885/week @ 2024-06-19 813/week @ 2024-06-26

每月下载量3,282

MIT许可证

30KB
595

最小包围圆

最小包围圆问题的迭代和递归二维实现,也称为最小圆问题、最小覆盖圆问题或边界圆问题。

本包中的实现解决了最小包围圆问题,Welzl算法以期望O(n)的时间复杂度解决这个问题。原始算法被构造成递归程序,这会导致在较大问题规模时调用栈溢出。因此,建议使用此包中的迭代实现。然而,递归版本也提供供演示目的。

请注意,期望的时间复杂度仅适用于随机输入(即您可能需要预先洗牌输入流)。

本实现基于以下工作

Welzl, E. (1991). Smallest enclosing disks (balls and ellipsoids). In New results and new trends in computer science (pp. 359-370). Springer, Berlin, Heidelberg.

示例

use smallest_enclosing_circle::smallest_enclosing_circle;

// Input: Four corner points of square box of unit size
let points = Vec::from([[0., 0.], [1., 0.], [1., 1.], [0., 1.]]);
let circle = smallest_enclosing_circle(points.into_iter());
println!("Circle: {:?}", circle);
// Circle: Three([0.0, 1.0], [1.0, 1.0], [1.0, 0.0], false);
println!("Center: {:?}", circle.center());
// Center: Some([0.5, 0.5])
println!("Radius: {:?}", circle.radius());
// Radius: 0.7071067811865476

许可证:MIT

依赖关系

~1MB
~20K SLoC