diff --git a/output/src/area.rs b/output/src/area.rs index 6e5c5bea..0b2c8276 100644 --- a/output/src/area.rs +++ b/output/src/area.rs @@ -13,7 +13,7 @@ pub trait Area: From<[N;4]> + Debug + Copy { Ok(self) } } - #[inline] fn xy (&self) -> [N;2] { + #[inline] fn xy (&self) -> [N;2] { [self.x(), self.y()] } #[inline] fn wh (&self) -> [N;2] { @@ -49,18 +49,24 @@ pub trait Area: From<[N;4]> + Debug + Copy { #[inline] fn center (&self) -> [N;2] { [self.x() + self.w()/2.into(), self.y() + self.h()/2.into()] } + #[inline] fn center_x (&self, n: N) -> [N;4] { let [x, y, w, h] = self.xywh(); [(x + w / 2.into()).minus(n / 2.into()), y + h / 2.into(), n, 1.into()] } - #[inline] fn center_y (&self, m: N) -> [N;4] { + #[inline] fn center_xw (&self, n: N, m: N) -> [N;4] { let [x, y, w, h] = self.xywh(); - [x + w / 2.into(), (y + h / 2.into()).minus(m / 2.into()), 1.into(), m] + [(x + w / 2.into()).minus(n / 2.into()), y + h / 2.into(), n, 1.into()] + } + #[inline] fn center_y (&self, n: N) -> [N;4] { + let [x, y, w, h] = self.xywh(); + [x + w / 2.into(), (y + h / 2.into()).minus(n / 2.into()), 1.into(), n] } #[inline] fn center_xy (&self, [n, m]: [N;2]) -> [N;4] { let [x, y, w, h] = self.xywh(); [(x + w / 2.into()).minus(n / 2.into()), (y + h / 2.into()).minus(m / 2.into()), n, m] } + #[inline] fn centered (&self) -> [N;2] { [self.x().minus(self.w()/2.into()), self.y().minus(self.h()/2.into())] } diff --git a/output/src/direction.rs b/output/src/direction.rs index d7b22476..7705af3d 100644 --- a/output/src/direction.rs +++ b/output/src/direction.rs @@ -69,26 +69,26 @@ pub trait BspAreas, B: Content> { }, South => { let [x, y, w, h] = outer.center_xy([aw.max(bw), ah + bh]); - let a = [x, y, aw, ah]; - let b = [x, y + ah, bw, bh]; + let a = [(x + w/2.into()).minus(aw/2.into()), y, aw, ah]; + let b = [(x + w/2.into()).minus(bw/2.into()), y + ah, bw, bh]; [a.into(), b.into(), [x, y, w, h].into()] }, North => { let [x, y, w, h] = outer.center_xy([aw.max(bw), ah + bh]); - let a = [x, y + bh, aw, ah]; - let b = [x, y, bw, bh]; + let a = [(x + (w/2.into())).minus(aw/2.into()), y + bh, aw, ah]; + let b = [(x + (w/2.into())).minus(bw/2.into()), y, bw, bh]; [a.into(), b.into(), [x, y, w, h].into()] }, East => { let [x, y, w, h] = outer.center_xy([aw + bw, ah.max(bh)]); - let a = [x, y, aw, ah]; - let b = [x + aw, y, bw, bh]; + let a = [x, (y + h/2.into()).minus(ah/2.into()), aw, ah]; + let b = [x + aw, (y + h/2.into()).minus(bh/2.into()), bw, bh]; [a.into(), b.into(), [x, y, w, h].into()] }, West => { let [x, y, w, h] = outer.center_xy([aw + bw, ah.max(bh)]); - let a = [x + bw, y, aw, ah]; - let b = [x, y, bw, bh]; + let a = [x + bw, (y + h/2.into()).minus(ah/2.into()), aw, ah]; + let b = [x, (y + h/2.into()).minus(bh/2.into()), bw, bh]; [a.into(), b.into(), [x, y, w, h].into()] }, } diff --git a/tek/examples/edn.rs b/tek/examples/edn.rs index a0cf8b2c..e2cf0066 100644 --- a/tek/examples/edn.rs +++ b/tek/examples/edn.rs @@ -12,6 +12,8 @@ const EDN: &'static [&'static str] = &[ include_str!("edn06.edn"), include_str!("edn07.edn"), include_str!("edn08.edn"), + include_str!("edn09.edn"), + include_str!("edn10.edn"), ]; fn main () -> Usually<()> { diff --git a/tek/examples/edn05.edn b/tek/examples/edn05.edn index 9a4a46a3..9042ccf4 100644 --- a/tek/examples/edn05.edn +++ b/tek/examples/edn05.edn @@ -1 +1 @@ -(fixed/xy 30 20 (bsp/s (fixed/xy 5 5 :hello) (fixed/xy 5 5 :world))) +(fixed/xy 30 20 (bsp/s (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world))) diff --git a/tek/examples/edn06.edn b/tek/examples/edn06.edn index 99311e9f..e6ca98a2 100644 --- a/tek/examples/edn06.edn +++ b/tek/examples/edn06.edn @@ -1 +1 @@ -(fixed/xy 30 20 (bsp/e (fixed/xy 5 5 :hello) (fixed/xy 5 5 :world))) +(fixed/xy 30 20 (bsp/e (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world))) diff --git a/tek/examples/edn07.edn b/tek/examples/edn07.edn index b7b1ea85..25013f91 100644 --- a/tek/examples/edn07.edn +++ b/tek/examples/edn07.edn @@ -1 +1 @@ -(fixed/xy 30 20 (bsp/n (fixed/xy 5 5 :hello) (fixed/xy 5 5 :world))) +(fixed/xy 30 20 (bsp/n (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world))) diff --git a/tek/examples/edn08.edn b/tek/examples/edn08.edn index ecb1c81c..f76eee69 100644 --- a/tek/examples/edn08.edn +++ b/tek/examples/edn08.edn @@ -1 +1 @@ -(fixed/xy 30 20 (bsp/w (fixed/xy 5 5 :hello) (fixed/xy 5 5 :world))) +(fixed/xy 30 20 (bsp/w (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world))) diff --git a/tek/examples/edn09.edn b/tek/examples/edn09.edn new file mode 100644 index 00000000..3061ef9b --- /dev/null +++ b/tek/examples/edn09.edn @@ -0,0 +1 @@ +(fixed/xy 30 20 (bsp/a (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world))) diff --git a/tek/examples/edn10.edn b/tek/examples/edn10.edn new file mode 100644 index 00000000..6f5273c0 --- /dev/null +++ b/tek/examples/edn10.edn @@ -0,0 +1 @@ +(fixed/xy 30 20 (bsp/b (fixed/xy 5 6 :hello) (fixed/xy 7 8 :world)))