A string art generation library.

# Main Structs ## [`Pather`](crate::pather::Pather) The `Pather` struct is responsible for computing the path between pegs and generates a [`Blueprint`](crate::blueprint::Blueprint). The pathing algorithm is configured with the [`PatherConfig`](crate::pather::PatherConfig). ## [`PatherConfig`](crate::pather::PatherConfig) The `PatherConfig` struct contains configuration parameters for computing the string path. ## [`Blueprint`](crate::blueprint::Blueprint) The `Blueprint` struct represents computed string path between the pegs. It contains the peg order and provides method to render it to file. ## [`Yarn`](crate::peg::Yarn) The `Yarn` struct is used to control how to render the image, and it is also used to influence the pathing algorithm. ## [`Peg`](crate::peg::Peg) The `Peg` struct represents a peg in the yarn pattern. # Helpful functions `strandify` provides a few function which could come in handy. ## Opening images To help with handling alpha channels use [`open_img_transparency_to_white`](crate::utils::open_img_transparency_to_white). ## Peg shapes `strandify` provides a few helpful function to help position [`Pegs`](crate::peg::Peg) in various shapes: - [`circle`](crate::peg::shape::circle) - [`rectangle`](crate::peg::shape::rectangle) - [`square`](crate::peg::shape::square) - [`line`]() # Usage Provided is a snippet showcasing some basis usage. ```rust use strandify::blueprint; use strandify::peg; use strandify::pather; use strandify::utils; let input_file = "tests/input.jpg"; let output_file = "tests/output.png"; // Open the input image and convert it to grayscale let img_rgb = utils::open_img_transparency_to_white(input_file).unwrap(); let img = image::imageops::grayscale(&img_rgb); // Define the pegs for the pathing let (width, height) = img_rgb.dimensions(); let min_dim = std::cmp::min(width, height); let margin = (min_dim as f64 * 0.02).round() as u32; // 2% margin let center = (width / 2, height / 2); // We'll be using a circle let pegs = peg::shape::circle(center, (min_dim - 2 * margin) / 2, 100); // Set up the configuration for the Pather let config = pather::PatherConfig::default(); // Generate the yarn pattern let mut string_pather = pather::Pather::new(img, pegs, config); let bp = string_pather.compute().unwrap(); // Save the generated blueprint bp.render(&output_file, &peg::Yarn::default()).unwrap(); ```