src/sets.rs

branch
dev
changeset 81
d2acaaddd9af
parent 41
121cf065e9ed
equal deleted inserted replaced
49:edb95d2b83cc 81:d2acaaddd9af
57 /// 57 ///
58 /// The halfspace is $H = \\{ t v + a \mid a^⊤ v = 0 \\}$, where $v$ is the orthogonal 58 /// The halfspace is $H = \\{ t v + a \mid a^⊤ v = 0 \\}$, where $v$ is the orthogonal
59 /// vector and $t$ the offset. 59 /// vector and $t$ the offset.
60 /// 60 ///
61 /// `U` is the element type, `F` the floating point number type, and `A` the type of the 61 /// `U` is the element type, `F` the floating point number type, and `A` the type of the
62 /// orthogonal (dual) vectors. They need implement [`Dot<U, F>`]. 62 /// orthogonal (dual) vectors. They need implement [`Dot<U, Output=F>`].
63 #[derive(Clone,Copy,Debug,Serialize,Eq,PartialEq)] 63 #[derive(Clone,Copy,Debug,Serialize,Eq,PartialEq)]
64 pub struct Halfspace<A, F, U> where A : Dot<U, F>, F : Float { 64 pub struct Halfspace<A, F, U>
65 where A : Dot<U, Field=F> + for<'a> Dot<&'a U>,
66 F : Float {
65 pub orthogonal : A, 67 pub orthogonal : A,
66 pub offset : F, 68 pub offset : F,
67 _phantom : PhantomData<U>, 69 _phantom : PhantomData<U>,
68 } 70 }
69 71
70 impl<A,F,U> Halfspace<A,F,U> where A : Dot<U,F>, F : Float { 72 impl<A,F,U> Halfspace<A,F,U>
73 where A : Dot<U, Field=F> + for<'a> Dot<&'a U>,
74 F : Float {
71 #[inline] 75 #[inline]
72 pub fn new(orthogonal : A, offset : F) -> Self { 76 pub fn new(orthogonal : A, offset : F) -> Self {
73 Halfspace{ orthogonal : orthogonal, offset : offset, _phantom : PhantomData } 77 Halfspace{ orthogonal : orthogonal, offset : offset, _phantom : PhantomData }
74 } 78 }
75 } 79 }
76 80
77 /// Trait for generating a halfspace spanned by another set `Self` of elements of type `U`. 81 /// Trait for generating a halfspace spanned by another set `Self` of elements of type `U`.
78 pub trait SpannedHalfspace<F, U> where F : Float { 82 pub trait SpannedHalfspace<F, U> where F : Float {
79 /// Type of the orthogonal vector describing the halfspace. 83 /// Type of the orthogonal vector describing the halfspace.
80 type A : Dot<U, F>; 84 type A : Dot<U, Field=F> + for<'a> Dot<&'a U>;
81 /// Returns the halfspace spanned by this set. 85 /// Returns the halfspace spanned by this set.
82 fn spanned_halfspace(&self) -> Halfspace<Self::A, F, U>; 86 fn spanned_halfspace(&self) -> Halfspace<Self::A, F, U>;
83 } 87 }
84 88
85 // TODO: Gram-Schmidt for higher N. 89 // TODO: Gram-Schmidt for higher N.
101 let offset = x0.dot(&orthog); 105 let offset = x0.dot(&orthog);
102 Halfspace::new(orthog, offset) 106 Halfspace::new(orthog, offset)
103 } 107 }
104 } 108 }
105 109
106 impl<A,U,F> Set<U> for Halfspace<A,F,U> where A : Dot<U,F>, F : Float { 110 impl<A,U,F> Set<U> for Halfspace<A,F,U>
111 where A : Dot<U, Field=F> + for<'a> Dot<&'a U>,
112 F : Float {
107 #[inline] 113 #[inline]
108 fn contains(&self, item : &U) -> bool { 114 fn contains(&self, item : &U) -> bool {
109 self.orthogonal.dot(item) >= self.offset 115 self.orthogonal.dot(item) >= self.offset
110 } 116 }
111 } 117 }
112 118
113 /// Polygons defined by `N` `Halfspace`s. 119 /// Polygons defined by `N` `Halfspace`s.
114 #[derive(Clone,Copy,Debug,Eq,PartialEq)] 120 #[derive(Clone,Debug,Eq,PartialEq)]
115 pub struct NPolygon<A, F, U, const N : usize>(pub [Halfspace<A,F,U>; N]) where A : Dot<U,F>, F : Float; 121 pub struct NPolygon<A, F, U, const N : usize>(pub [Halfspace<A,F,U>; N])
122 where A : Dot<U, Field=F> + for<'a> Dot<&'a U>,
123 F : Float;
116 124
117 impl<A,U,F,const N : usize> Set<U> for NPolygon<A,F,U,N> where A : Dot<U,F>, F : Float { 125 impl<A,U,F,const N : usize> Set<U> for NPolygon<A,F,U,N>
126 where A : Dot<U, Field=F> + for<'a> Dot<&'a U>,
127 F : Float {
118 fn contains(&self, item : &U) -> bool { 128 fn contains(&self, item : &U) -> bool {
119 self.0.iter().all(|halfspace| halfspace.contains(item)) 129 self.0.iter().all(|halfspace| halfspace.contains(item))
120 } 130 }
121 } 131 }

mercurial