mgart 0.0.2

Machine Generated Art. CLI app for generating algorithmic art
Documentation
use std::cmp::Ordering;

#[derive(Debug)]
pub enum Pos {
  NW,
  NE,
  SE,
  SW,
  Center,
}

impl Pos {
  pub fn new(x: usize, y: usize, x_max: usize, y_max: usize) -> Self {
    let pos_x = PosH::new(x, x_max);
    let pos_y = PosV::new(y, y_max);

    match (pos_y, pos_x) {
      (PosV::N, PosH::W | PosH::Center) => Self::NW,
      (PosV::N | PosV::Center, PosH::E) => Self::NE,
      (PosV::S, PosH::E | PosH::Center) => Self::SE,
      (PosV::S | PosV::Center, PosH::W) => Self::SW,
      (PosV::Center, PosH::Center) => Self::Center,
    }
  }
}

enum PosH {
  W,
  E,
  Center,
}

impl PosH {
  fn new(x: usize, x_max: usize) -> Self {
    if x_max % 2 == 0 {
      if x < x_max / 2 {
        Self::W
      } else {
        Self::E
      }
    } else {
      match x.cmp(&(x_max / 2)) {
        Ordering::Less => Self::W,
        Ordering::Equal => Self::Center,
        Ordering::Greater => Self::E,
      }
    }
  }
}

enum PosV {
  N,
  S,
  Center,
}

impl PosV {
  fn new(y: usize, y_max: usize) -> Self {
    if y_max % 2 == 0 {
      if y < y_max / 2 {
        Self::N
      } else {
        Self::S
      }
    } else {
      match y.cmp(&(y_max / 2)) {
        Ordering::Less => Self::N,
        Ordering::Equal => Self::Center,
        Ordering::Greater => Self::S,
      }
    }
  }
}