diff options
author | Nicholas Johnson <nick@nicholasjohnson.ch> | 2024-04-01 00:00:00 +0000 |
---|---|---|
committer | Nicholas Johnson <nick@nicholasjohnson.ch> | 2024-04-01 00:00:00 +0000 |
commit | 830754db546245315844e2873c92573280ff55417f4ff1db7c52eeb9d3260282 (patch) | |
tree | 7279350800cb5edeb932b492a181d15ba045d98715fb637384e3813ee2d77e80 /src/hitomezashi.rs | |
download | hitomezashi-rs-038857b7c28fec83bde085cc13779ca053b1ba470fb1210c335f10316abca5ee.tar.gz hitomezashi-rs-038857b7c28fec83bde085cc13779ca053b1ba470fb1210c335f10316abca5ee.zip |
Initial commitv1.0.0
Diffstat (limited to 'src/hitomezashi.rs')
-rw-r--r-- | src/hitomezashi.rs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/hitomezashi.rs b/src/hitomezashi.rs new file mode 100644 index 0000000..50d3d32 --- /dev/null +++ b/src/hitomezashi.rs @@ -0,0 +1,75 @@ +/* + hitomezashi-rs Generates classical colored Hitomezashi stitch patterns + Copyright (C) 2024 Nicholas Johnson + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +use rand::Rng; + +const TRANSPARENT_SQUARE: char = ' '; +const OPAQUE_SQUARE: char = '█'; + +fn print_square(is_transparent: bool) { + print!("{}", if is_transparent { TRANSPARENT_SQUARE } else { OPAQUE_SQUARE }); +} + +pub fn hitomezashi(width: usize, height: usize, skew: Option<f32>) { + let skew: f64 = match skew { + Some(n) => { n.into() } + None => { 0.5 } + }; + + let mut rng = rand::thread_rng(); + + let init_bit: bool = rng.gen::<bool>(); + let mut row_bits: Vec<bool> = Vec::with_capacity(height - 1); + let mut col_bits: Vec<bool> = Vec::with_capacity(width - 1); + + for _ in 0..(height - 1) { + row_bits.push(rng.gen_bool(skew)); + } + + for _ in 0..(width - 1) { + col_bits.push(rng.gen_bool(skew)); + } + + // each new row of the pattern depends on the bits directly above it + let mut above_bits: Vec<bool> = Vec::with_capacity(width); + + above_bits.push(init_bit); + print_square(above_bits[0]); + + for col in 1..width { + /* each square in the first row is derived from the square to its left. the column bits + * represent whether there's a stitch between the two squares. if there's a stitch, the squares + * are different, otherwise they are the same. */ + above_bits.push(above_bits[col - 1] ^ col_bits[col - 1]); + print_square(above_bits[col]); + } + + println!(); + + // height-1 because the first row has already been printed + for row in 0..(height - 1) { + for col in 0..width { + /* each square in each successive row is derived from the square above it. the row bits + * represent whether there's a stitch between the two squares. if there's a stitch, the + * squares are different, otherwise they are the same. */ + above_bits[col] = above_bits[col] ^ (row_bits[row] ^ (col % 2 == 1)); + print_square(above_bits[col]); + } + println!(); + } +} |