5 use std::ops::{RangeFull,RangeFrom,Range,RangeInclusive,RangeTo,RangeToInclusive}; |
5 use std::ops::{RangeFull,RangeFrom,Range,RangeInclusive,RangeTo,RangeToInclusive}; |
6 use crate::types::*; |
6 use crate::types::*; |
7 use crate::loc::Loc; |
7 use crate::loc::Loc; |
8 use crate::euclidean::Euclidean; |
8 use crate::euclidean::Euclidean; |
9 use crate::instance::{Space, Instance}; |
9 use crate::instance::{Space, Instance}; |
10 use serde::Serialize; |
10 use serde::{Serialize, Deserialize}; |
11 |
11 |
12 pub mod cube; |
12 pub mod cube; |
13 pub use cube::Cube; |
13 pub use cube::Cube; |
14 |
14 |
15 /// Trait for arbitrary sets. The parameter `U` is the element type. |
15 /// Trait for arbitrary sets. The parameter `U` is the element type. |
60 |
60 |
61 /// Halfspaces described by an orthogonal vector and an offset. |
61 /// Halfspaces described by an orthogonal vector and an offset. |
62 /// |
62 /// |
63 /// The halfspace is $H = \\{ t v + a \mid a^⊤ v = 0 \\}$, where $v$ is the orthogonal |
63 /// The halfspace is $H = \\{ t v + a \mid a^⊤ v = 0 \\}$, where $v$ is the orthogonal |
64 /// vector and $t$ the offset. |
64 /// vector and $t$ the offset. |
65 #[derive(Clone,Copy,Debug,Serialize,Eq,PartialEq)] |
65 #[derive(Clone,Copy,Debug,Serialize,Deserialize,Eq,PartialEq)] |
66 pub struct Halfspace<A, F> where A : Euclidean<F>, F : Float { |
66 pub struct Halfspace<A, F> where A : Euclidean<F>, F : Float { |
67 pub orthogonal : A, |
67 pub orthogonal : A, |
68 pub offset : F, |
68 pub offset : F, |
69 } |
69 } |
70 |
70 |
114 self.orthogonal.dot(item) >= self.offset |
114 self.orthogonal.dot(item) >= self.offset |
115 } |
115 } |
116 } |
116 } |
117 |
117 |
118 /// Polygons defined by `N` `Halfspace`s. |
118 /// Polygons defined by `N` `Halfspace`s. |
119 #[derive(Clone,Copy,Debug,Eq,PartialEq)] |
119 #[derive(Clone,Copy,Debug,Eq,PartialEq,Serialize,Deserialize)] |
|
120 #[serde(bound( |
|
121 serialize = "[Halfspace<A,F>; N] : Serialize", |
|
122 deserialize = "[Halfspace<A,F>; N] : for<'a> Deserialize<'a>" |
|
123 ))] |
120 pub struct NPolygon<A, F, const N : usize>(pub [Halfspace<A,F>; N]) |
124 pub struct NPolygon<A, F, const N : usize>(pub [Halfspace<A,F>; N]) |
121 where A : Euclidean<F>, F : Float; |
125 where A : Euclidean<F>, F : Float; |
122 |
126 |
123 impl<A,F,const N : usize> Set<A> for NPolygon<A,F,N> |
127 impl<A,F,const N : usize> Set<A> for NPolygon<A,F,N> |
124 where |
128 where |