#bounds #box #real-number #aa-bb #float

inter-val

数学区间,例如在实数域ℝ上的[a, b]、(a, b)、[a, b)和(a, b),以及表示为区间笛卡尔积的多维轴对齐框

3 个版本

0.1.2 2024年1月14日
0.1.1 2024年1月7日
0.1.0 2024年1月7日

400算法

每月 32 次下载

MIT 许可证

79KB
1.5K SLoC

ℝⁿ 上的区间

数学区间,例如在实数域ℝ上的[a, b]、(a, b)、[a, b)和(a, b),也支持多维轴对齐框。

注意:尚未稳定。

ℝ 上的区间

任何 PartialOrd 类型的区间,如[a, b](a, b)[a, b)(a, b]

属性

lower_bound     left              . center          right    upper_bound
...------------>|<------- self -------------------->|<------------ ...
                inf                                 sup
                [<------------ closure ------------>]
                 (<----------- interior ---------->)

集合操作

|<------------- a ----------------->|   . p           |<-------- c -------->|
       |<--------------- b ------------------->|
       |<--- a.intersection(&b) --->|
                                    |<-- a.gap(&c) -->|
|<------------- a.hull(p) ------------->|
|<---------------------------------- a.span(&c) --------------------------->|
|<--------------------------------->|        +        |<------------------->| a.union(&c)
|<---->| a.difference(&b)
                                               |<- δ -+---- c.dilate(δ) ----+- δ ->|

示例

use inter_val::{Inclusive, Exclusive, Interval};

// Closed interval of i32
let a = Inclusive.at(0).to(Inclusive.at(10));  // [0, 10]
assert!(a.contains(&3));

// Half-open interval of f64
let b = Inclusive.at(1.23).to(Exclusive.at(4.56));   // [1.23, 4.56)
assert!(!b.contains(&4.56));
assert!(b.contains(&(4.56 - 0.000000000000001)));

// Intersection
let c = Inclusive.between(5, 15);  // [5, 15]
let isect = a.intersection(&c).unwrap(); // [0, 10] ∩ [5, 15] = [5, 10]
assert_eq!(isect.inf(), &5);
assert_eq!(isect.sup(), &10);

// Span & Gap
let d = Inclusive.between(12, 15);  // [12, 15]
let span = a.span(&d);  // [0, 15]
let gap = a.gap(&d);    // (10, 12)
assert_eq!(span, Inclusive.between(0, 15));
assert_eq!(gap.unwrap(), Exclusive.between(10, 12));

// Union
let union = a.union(&d);
assert_eq!(union.span, span);
assert_eq!(union.gap, gap);
assert_eq!(union.into_vec(), vec![a, d]);

// Hull
let hull = Interval::<_>::hull_many(vec![3, 9, 2, 5]).unwrap(); // [2, 9]
assert_eq!(hull, Inclusive.between(2, 9));

// Linear interpolation
assert_eq!(b.lerp(0.0), *b.inf());
assert_eq!(b.lerp(1.0), *b.sup());
assert_eq!(b.lerp(0.2), 0.8 * *b.inf() + 0.2 * *b.sup());

// Split
let (lower, upper) = b.split_at(3.45); // Split [1.23, 4.56) at 3.45
assert_eq!(lower.inf(), b.inf());
assert_eq!(lower.sup(), &3.45);
assert_eq!(upper.inf(), &3.45);
assert_eq!(upper.sup(), b.sup());

ℝⁿ 上的轴对齐框

由区间笛卡尔积表示的框。

use inter_val::{Box2, Inclusive};

// [0.0, 10.0] × [5.0, 20.0]
let a: Box2<f64> = Box2::new(Inclusive.between(0.0, 10.0), Inclusive.between(5.0, 20.0));

// Another way to construct [0.0, 10.0] × [5.0, 20.0]
let b: Box2<f64> = Box2::between(&[0.0, 5.0], &[10.0, 20.0]);
assert_eq!(a, b);

// Hull
let b = a.hull(&[12.3, 7.5]);
assert_eq!(b, Box2::between(&[0.0, 5.0], &[12.3, 20.0]));

未来工作

  • 增强 BoxN
  • 区间集合。
  • 充分的测试。

不保证 :-)

依赖项

~0.7–1.2MB
~27K SLoC