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
50
51
52
53
54
55
56
57
use num::{Signed, Float, Bounded, ToPrimitive, FromPrimitive};
use std::ops::{MulAssign, AddAssign};
use geometry::Rect;
use tree::mbr::{MbrLeafGeometry, MbrLeaf, MbrNode};
use std::fmt::Debug;
use generic_array::ArrayLength;
pub trait MbrQuery<P, DIM, LG, T>
where DIM: ArrayLength<P> + ArrayLength<(P, P)>
{
fn accept_leaf(&self, leaf: &MbrLeaf<P, DIM, LG, T>) -> bool;
fn accept_level(&self, level: &MbrNode<P, DIM, LG, T>) -> bool;
}
#[derive(Debug, Clone)]
pub enum MbrRectQuery<P, DIM>
where DIM: ArrayLength<P> + ArrayLength<(P, P)>
{
ContainedBy(Rect<P, DIM>),
Overlaps(Rect<P, DIM>),
}
impl<P, DIM, LG, T> MbrQuery<P, DIM, LG, T> for MbrRectQuery<P, DIM>
where P: Float + Signed + Bounded + MulAssign + AddAssign + ToPrimitive + FromPrimitive + Copy + Debug + Default,
DIM: ArrayLength<P> + ArrayLength<(P,P)>,
LG: MbrLeafGeometry<P, DIM>
{
fn accept_leaf(&self, leaf: &MbrLeaf<P, DIM, LG, T>) -> bool {
match *self {
MbrRectQuery::ContainedBy(ref query) => leaf.geometry.contained_by_mbr(query),
MbrRectQuery::Overlaps(ref query) => leaf.geometry.overlapped_by_mbr(query),
}
}
fn accept_level(&self, level: &MbrNode<P, DIM, LG, T>) -> bool {
match *self {
MbrRectQuery::ContainedBy(ref query) => level.overlapped_by_mbr(query),
MbrRectQuery::Overlaps(ref query) => level.overlapped_by_mbr(query),
}
}
}