1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//! Convex hull approximation for rust based on [Quick hull](http://citeseerx.ist.psu.edu/viewdoc/summary;jsessionid=C57E2269B0D64504B97E8469F6A1315D?doi=10.1.1.117.405).
//! Available in 3-D or 2-D for now.
//! ## Examples
//! ```
//! use chull::ConvexHull;
//!
//! let p1 = vec![1.0, 1.0, 1.0];
//! let p2 = vec![1.0, 1.0, -1.0];
//! let p3 = vec![1.0, -1.0, 1.0];
//! let p4 = vec![1.0, -1.0, -1.0];
//! let p5 = vec![-1.0, 1.0, 1.0];
//! let p6 = vec![-1.0, 1.0, -1.0];
//! let p7 = vec![-1.0, -1.0, 1.0];
//! let p8 = vec![-1.0, -1.0, -1.0];
//! let p9 = vec![0.0, 0.0, 0.0];
//! // threshold is used internally to determine whether a point is above or below the surface.
//! let threshold = 0.001;
//! let points = vec![p1, p2, p3, p4, p5, p6, p7, p8, p9];
//! let cube = ConvexHull::try_new(&points, threshold, None).unwrap();
//! assert_eq!(cube.volume(), 8.0);
//! let (_v,i) = cube.vertices_indices();
//! assert_eq!(i.len(), 6 * 2 * 3);
//! ```
//! ## If the results are inaccurate
//! If the calculation results are inaccurate due to rounding errors, an error may occur. In such cases, the use of integer types such as [```BigInt```](https://docs.rs/num-bigint/) may improve the result.
//! ```
//! use chull::ConvexHull;
//! use num_bigint::{BigInt, ToBigInt};
//!
//! let p1 = vec![1.0, 0.0, 0.0];
//! let p2 = vec![0.0, 0.001, 0.0];
//! let p3 = vec![0.0, 0.0, 0.00001];
//! let p4 = vec![-1.0, 0.0, 0.0];
//! let p5 = vec![0.0, -0.001, 0.0];
//! let p6 = vec![0.0, 0.0, -0.00001];
//! let points_float = vec![p1, p2, p3, p4, p5, p6];
//! let mut points_int = Vec::new();
//! for point_float in &points_float{
//!     points_int.push(point_float.iter().map(|x| (x*1_000_000.0).to_bigint().unwrap()).collect::<Vec<_>>());
//! }
//! // Since there is no rounding error when using BigInt, the threshold value can be zero.
//! let octahedron = ConvexHull::try_new(&points_int, 0, None).unwrap();
//! // The following are likely to be errors
//! //let octahedron = ConvexHull::try_new(&points_float, std::f32::EPSILON, None).unwrap();
//! ```

pub mod convex;
pub mod util;
pub use convex::*;