diff options
author | Jovansonlee Cesar <ivanceras@gmail.com> | 2022-09-26 08:24:41 +0800 |
---|---|---|
committer | Jovansonlee Cesar <ivanceras@gmail.com> | 2022-09-26 08:24:41 +0800 |
commit | b9c97b14822ff58206555a330c57af1935166c57 (patch) | |
tree | 9a7ea82980b16078fe921931967dd20d35aa68e3 | |
parent | 3e01f38b506fafcd7ca7658dc77cb377c25578d0 (diff) |
refactor: use index_map for the Circle span to preserve the order of the circles being inserted
-rw-r--r-- | Cargo.lock | 17 | ||||
-rw-r--r-- | packages/svgbob/Cargo.toml | 1 | ||||
-rw-r--r-- | packages/svgbob/examples/circles_generated.rs | 12 | ||||
-rwxr-xr-x | packages/svgbob/run_circles_generated.sh | 1 | ||||
-rw-r--r-- | packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs | 7 | ||||
-rw-r--r-- | packages/svgbob/src/map/circle_map.rs | 3 | ||||
-rw-r--r-- | packages/svgbob/src/map/circle_map/test_circle_map.rs | 39 | ||||
-rw-r--r-- | packages/svgbob/test_data/circles.bob | 626 | ||||
-rw-r--r-- | packages/svgbob/test_data/circles_generated.bob | 1546 |
9 files changed, 2236 insertions, 16 deletions
@@ -234,6 +234,12 @@ dependencies = [ ] [[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -306,6 +312,16 @@ dependencies = [ ] [[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] name = "itertools" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -892,6 +908,7 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" name = "svgbob" version = "0.6.7" dependencies = [ + "indexmap", "itertools", "lazy_static", "log", diff --git a/packages/svgbob/Cargo.toml b/packages/svgbob/Cargo.toml index 97d799d..b86c81d 100644 --- a/packages/svgbob/Cargo.toml +++ b/packages/svgbob/Cargo.toml @@ -19,6 +19,7 @@ unicode-width = "0.1.9" itertools = "0.10.3" pom = { version = "3.2.0" } log = "0.4.14" +indexmap = "1.9.1" diff --git a/packages/svgbob/examples/circles_generated.rs b/packages/svgbob/examples/circles_generated.rs new file mode 100644 index 0000000..ea0a08a --- /dev/null +++ b/packages/svgbob/examples/circles_generated.rs @@ -0,0 +1,12 @@ +use std::{fs, io, time::Instant}; + +extern crate svgbob; + +fn main() -> io::Result<()> { + let art = include_str!("../test_data/circles_generated.bob"); + let t1 = Instant::now(); + fs::create_dir_all("out")?; + fs::write("out/circles_generated.svg", svgbob::to_svg(art))?; + println!("took {}ms", t1.elapsed().as_millis()); + Ok(()) +} diff --git a/packages/svgbob/run_circles_generated.sh b/packages/svgbob/run_circles_generated.sh new file mode 100755 index 0000000..0258a50 --- /dev/null +++ b/packages/svgbob/run_circles_generated.sh @@ -0,0 +1 @@ +reset && RUST_BACKTRACE=1 cargo run --release --example circles_generated diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs index 1cf22f9..1388a2b 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs @@ -2,6 +2,7 @@ use crate::{fragment::Bounds, util, Cell, Point}; use nalgebra::Point2; use parry2d::shape::ConvexPolygon; use parry2d::shape::Polyline; +use std::hash::{Hash, Hasher}; use std::{cmp::Ordering, fmt}; use sauron::{ @@ -17,6 +18,12 @@ pub struct Circle { pub is_filled: bool, } +impl Hash for Circle { + fn hash<H: Hasher>(&self, state: &mut H) { + ((self.radius * 2.0) as i32).hash(state); + } +} + impl Circle { pub(crate) fn new(center: Point, radius: f32, is_filled: bool) -> Self { Circle { diff --git a/packages/svgbob/src/map/circle_map.rs b/packages/svgbob/src/map/circle_map.rs index 3b90b1b..8db994e 100644 --- a/packages/svgbob/src/map/circle_map.rs +++ b/packages/svgbob/src/map/circle_map.rs @@ -5,6 +5,7 @@ use crate::{ fragment::Circle, Cell, Point, Settings, }; +use indexmap::IndexMap; use lazy_static::lazy_static; use std::{collections::BTreeMap, collections::HashMap, iter::FromIterator}; @@ -558,7 +559,7 @@ lazy_static! { ); /// There is only 1 span per circle, and localized - pub static ref CIRCLES_SPAN: BTreeMap<Circle, Span> = BTreeMap::from_iter( + pub static ref CIRCLES_SPAN: IndexMap<Circle, Span> = IndexMap::from_iter( CIRCLE_MAP.iter().map(|circle_art|{ let cb = CellBuffer::from(circle_art.ascii_art); let mut spans:Vec<Span> = cb.into(); diff --git a/packages/svgbob/src/map/circle_map/test_circle_map.rs b/packages/svgbob/src/map/circle_map/test_circle_map.rs index 2b76005..b0a6863 100644 --- a/packages/svgbob/src/map/circle_map/test_circle_map.rs +++ b/packages/svgbob/src/map/circle_map/test_circle_map.rs @@ -1,6 +1,35 @@ use super::*; #[test] +fn show_circles() { + println!("CIRCLES "); + for (circle, span) in CIRCLES_SPAN.iter() { + println!("diameter: {}", circle.radius * 2.0); + println!(); + println!("{}", span); + println!(); + println!(); + } + println!("QUARTER ARCS:"); + for (diameter, (arc, span)) in FLATTENED_QUARTER_ARC_SPAN.iter() { + println!("diameter: {}", diameter.diameter); + println!(); + println!("{}", span); + println!(); + println!(); + } + println!("HALF ARCS:"); + for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() { + println!("diameter: {}", diameter.diameter); + println!(); + println!("{}", span); + println!(); + println!(); + } + panic!(); +} + +#[test] fn test_circle1() { let art = r#" _.-'''''''-._ @@ -27,11 +56,6 @@ fn test_circle1() { #[test] fn test_half_arc_span5_top() { - for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() { - println!("diameter: {}", diameter.diameter); - println!("{}", span); - println!(); - } let art = r#" ___ ,' `. @@ -53,11 +77,6 @@ fn test_half_arc_span5_bottom() { `.___.' "#; - for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() { - println!("diameter: {}", diameter.diameter); - println!("{}", span); - println!(); - } let cell_buffer = CellBuffer::from(art); let mut spans: Vec<Span> = cell_buffer.into(); assert_eq!(spans.len(), 1); diff --git a/packages/svgbob/test_data/circles.bob b/packages/svgbob/test_data/circles.bob index 5915b50..4ae979f 100644 --- a/packages/svgbob/test_data/circles.bob +++ b/packages/svgbob/test_data/circles.bob @@ -820,23 +820,625 @@ '-.... ....-' +diameter: 4 + +-. + ) + + +diameter: 4 + + ,- +( + + +diameter: 4 + +( + `- + + +diameter: 4 + + ) +-' + + +diameter: 5 + +-. + ) + + +diameter: 5 + + .- +( + + +diameter: 5 + +( + `- + + +diameter: 5 + + ) +-' + + +diameter: 6 + +_ + '. + ) + + +diameter: 6 + + _ + .' +( + + +diameter: 6 + +( + `._ + + +diameter: 6 + + ) +_.' + + +diameter: 7 + +_ + '. + ) + + +diameter: 7 + + _ + ,' +( + + +diameter: 7 + +( + `._ + + +diameter: 7 + + ) +_.' + + +diameter: 8 + +__ + '. + ) + + +diameter: 8 + + __ + ,' +( + + +diameter: 8 + +( + `. + `- + + +diameter: 8 + + ) + .' +-' + + +diameter: 9 + +__ + `. + \ + + +diameter: 9 + + __ + ,' +/ + + +diameter: 9 + +\ + `.__ + + +diameter: 9 + + / +__.' + + +diameter: 10 + +__ + `. + \ + + +diameter: 10 + + __ + ,' +/ + + +diameter: 10 + +\ + `.__ + + +diameter: 10 + + / +__.' + + +diameter: 11 + +__ + `. + \ + ) + + +diameter: 11 + + __ + .' + / +( + + +diameter: 11 + +( + \ + `.__ + + +diameter: 11 + + ) + / +__.' + + +diameter: 12 + +___ + `. + \ + ) + + +diameter: 12 + + ___ + ,' + / +( + + +diameter: 12 + +( + \ + `.___ + + +diameter: 12 + + ) + / +___.' + + +diameter: 13 + +___ + `. + \ + | + + +diameter: 13 + + ___ + ,' + / +| + + +diameter: 13 + +| + \ + `.___ + + +diameter: 13 + + | + / +___.' + + +diameter: 14 + +____ + `. + \ + | + + +diameter: 14 + + ____ + ,' + / +| + + +diameter: 14 + +| + \ + `.____ + + +diameter: 14 + + | + / +____.' + + +diameter: 15 + +____ + `. + \ + | + | + + +diameter: 15 + + ____ + ,' + / +| +| + + +diameter: 15 + +| +| + \ + `.____ + + +diameter: 15 + + | + | + / +____.' + + +diameter: 16 + +---__ + `. + \ + | + | + + +diameter: 16 + + __--- + ,' + / +| +| + + +diameter: 16 + +| +| + \ + `. + `---- + + +diameter: 16 + + | + | + / + .' +----' + + +diameter: 17 + +----. + `. + \ + | + | + + +diameter: 17 + + .---- + ,' + / +| +| + + +diameter: 17 + +| +| + \ + `. + `---- + + +diameter: 17 + + | + | + / + .' +----' + + +diameter: 18 + +'''-._ + `. + \ + . + | + | + + +diameter: 18 + + _.-''' + ,' + / +. +| +| + + +diameter: 18 + +| +| + \ + `._ + '-... + + +diameter: 18 + + | + | + / + _.' +...-' + + +diameter: 19 + +'''-._ + `. + \ + . + | + | + + +diameter: 19 + + _.-''' + ,' + / +. +| +| + + +diameter: 19 + +| +| + \ + `._ + '-... + + +diameter: 19 + + | + | + / + _.' +...-' + + +diameter: 20 + +''''-._ + `. + \ + . + | + | + + +diameter: 20 + + _.-'''' + ,' + / +. +| +| + + +diameter: 20 + +| +| + \ + `._ + '-.... + + +diameter: 20 + + | + | + / + _.' +....-' + + +diameter: 21 + +''''-._ + `. + \ + . + | + | + + +diameter: 21 + + _.-'''' + ,' + / +. +| +| + + +diameter: 21 + +| +| +| + \ + `._ + '-.... + + +diameter: 21 + + | + | + | + / + _.' +....-' + + +diameter: 22 + +'''''-._ + `. + \ + . + | + | + + +diameter: 22 + + _.-''''' + ,' + / +. +| +| + + +diameter: 22 + +| +| +| + \ + `._ + '-..... + + +diameter: 22 + + | + | + | + / + _.' +.....-' + diameter: 4 ,-. ( ) + diameter: 4 ( ) `-' + diameter: 4 ,- ( `- + diameter: 4 -. @@ -950,6 +1552,7 @@ diameter: 8 `. `- + diameter: 8 __ @@ -968,7 +1571,6 @@ diameter: 9 diameter: 9 - \ / `.___.' @@ -1000,7 +1602,6 @@ diameter: 10 diameter: 10 - \ / `.____.' @@ -1057,6 +1658,7 @@ __ / __.' + diameter: 12 _____ @@ -1099,10 +1701,10 @@ diameter: 13 / \ | | + diameter: 13 | | -| | \ / `.______.' @@ -1140,7 +1742,6 @@ diameter: 14 diameter: 14 | | -| | \ / `._______.' @@ -1216,6 +1817,7 @@ diameter: 16 | | | | + diameter: 16 | | @@ -1224,6 +1826,7 @@ diameter: 16 `. .' `-------' + diameter: 16 __--- @@ -1236,6 +1839,7 @@ diameter: 16 `. `---- + diameter: 16 ---__ @@ -1248,6 +1852,7 @@ diameter: 16 .' ----' + diameter: 17 .--------. @@ -1256,6 +1861,7 @@ diameter: 17 | | | | + diameter: 17 | | @@ -1264,6 +1870,7 @@ diameter: 17 `. .' `--------' + diameter: 17 .---- @@ -1276,6 +1883,7 @@ diameter: 17 `. `---- + diameter: 17 ----. @@ -1288,6 +1896,7 @@ diameter: 17 .' ----' + diameter: 18 _.-'''''-._ @@ -1297,6 +1906,7 @@ diameter: 18 | | | | + diameter: 18 | | @@ -1333,6 +1943,7 @@ diameter: 18 _.' ...-' + diameter: 19 _.-''''''-._ @@ -1392,7 +2003,6 @@ diameter: 20 diameter: 20 - | | | | \ / @@ -1437,6 +2047,7 @@ diameter: 21 | | | | + diameter: 21 | | @@ -1446,6 +2057,7 @@ diameter: 21 `._ _.' '-........-' + diameter: 21 _.-'''' @@ -1475,6 +2087,7 @@ diameter: 21 _.' ....-' + diameter: 22 _.-'''''''''-._ @@ -1484,6 +2097,7 @@ diameter: 22 | | | | + diameter: 22 | | @@ -1521,3 +2135,5 @@ diameter: 22 | / _.' +.....-' + diff --git a/packages/svgbob/test_data/circles_generated.bob b/packages/svgbob/test_data/circles_generated.bob new file mode 100644 index 0000000..6a2b3db --- /dev/null +++ b/packages/svgbob/test_data/circles_generated.bob @@ -0,0 +1,1546 @@ + +CIRCLES +diameter: 1 + +() + + +diameter: 2 + +(_) + + +diameter: 3 + + __ +(__) + + +diameter: 4 + + ,-. +( ) + `-' + + +diameter: 5 + + .--. +( ) + `--' + + +diameter: 6 + + _ + .' '. +( ) + `._.' + + +diameter: 7 + + __ + ,' '. +( ) + `.__.' + + +diameter: 8 + + ___ + ,' '. +( ) + `. .' + `-' + + +diameter: 9 + + ___ + ,' `. +/ \ +\ / + `.___.' + + +diameter: 10 + + ____ + ,' `. +/ \ +\ / + `.____.' + + +diameter: 11 + + ____ + .' `. + / \ +( ) + \ / + `.____.' + + +diameter: 12 + + _____ + ,' `. + / \ +( ) + \ / + `._____.' + + +diameter: 13 + + ______ + ,' `. + / \ +| | +| | + \ / + `.______.' + + +diameter: 14 + + _______ + ,' `. + / \ +| | +| | + \ / + `._______.' + + +diameter: 15 + + ________ + ,' `. + / \ +| | +| | +| | + \ / + `.________.' + + +diameter: 16 + + __-----__ + ,' `. + / \ +| | +| | +| | + \ / + `. .' + `-------' + + +diameter: 17 + + .--------. + ,' `. + / \ +| | +| | +| | + \ / + `. .' + `--------' + + +diameter: 18 + + _.-'''''-._ + ,' `. + / \ +. . +| | +| | +| | + \ / + `._ _.' + '-.....-' + + +diameter: 19 + + _.-''''''-._ + ,' `. + / \ +. . +| | +| | +| | + \ / + `._ _.' + '-......-' + + +diameter: 20 + + _.-'''''''-._ + ,' `. + / \ +. . +| | +| | +| | + \ / + `._ _.' + '-.......-' + + +diameter: 21 + + _.-''''''''-._ + ,' `. + / \ +. . +| | +| | +| | +| | + \ / + `._ _.' + '-........-' + + +diameter: 22 + + _.-'''''''''-._ + ,' `. + / \ +. . +| | +| | +| | +| | + \ / + `._ _.' + '-.........-' + + +QUARTER ARCS: +diameter: 4 + +-. + ) + + +diameter: 4 + + ,- +( + + +diameter: 4 + +( + `- + + +diameter: 4 + + ) +-' + + +diameter: 5 + +-. + ) + + +diameter: 5 + + .- +( + + +diameter: 5 + +( + `- + + +diameter: 5 + + ) +-' + + +diameter: 6 + +_ + '. + ) + + +diameter: 6 + + _ + .' +( + + +diameter: 6 + +( + `._ + + +diameter: 6 + + ) +_.' + + +diameter: 7 + +_ + '. + ) + + +diameter: 7 + + _ + ,' +( + + +diameter: 7 + +( + `._ + + +diameter: 7 + + ) +_.' + + +diameter: 8 + +__ + '. + ) + + +diameter: 8 + + __ + ,' +( + + +diameter: 8 + +( + `. + `- + + +diameter: 8 + + ) + .' +-' + + +diameter: 9 + +__ + `. + \ + + +diameter: 9 + + __ + ,' +/ + + +diameter: 9 + +\ + `.__ + + +diameter: 9 + + / +__.' + + +diameter: 10 + +__ + `. + \ + + +diameter: 10 + + __ + ,' +/ + + +diameter: 10 + +\ + `.__ + + +diameter: 10 + + / +__.' + + +diameter: 11 + +__ + `. + \ + ) + + +diameter: 11 + + __ + .' + / +( + + +diameter: 11 + +( + \ + `.__ + + +diameter: 11 + + ) + / +__.' + + +diameter: 12 + +___ + `. + \ + ) + + +diameter: 12 + + ___ + ,' + / +( + + +diameter: 12 + +( + \ + `.___ + + +diameter: 12 + + ) + / +___.' + + +diameter: 13 + +___ + `. + \ + | + + +diameter: 13 + + ___ + ,' + / +| + + +diameter: 13 + +| + \ + `.___ + + +diameter: 13 + + | + / +___.' + + +diameter: 14 + +____ + `. + \ + | + + +diameter: 14 + + ____ + ,' + / +| + + +diameter: 14 + +| + \ + `.____ + + +diameter: 14 + + | + / +____.' + + +diameter: 15 + +____ + `. + \ + | + | + + +diameter: 15 + + ____ + ,' + / +| +| + + +diameter: 15 + +| +| + \ + `.____ + + +diameter: 15 + + | + | + / +____.' + + +diameter: 16 + +---__ + `. + \ + | + | + + +diameter: 16 + + __--- + ,' + / +| +| + + +diameter: 16 + +| +| + \ + `. + `---- + + +diameter: 16 + + | + | + / + .' +----' + + +diameter: 17 + +----. + `. + \ + | + | + + +diameter: 17 + + .---- + ,' + / +| +| + + +diameter: 17 + +| +| + \ + `. + `---- + + +diameter: 17 + + | + | + / + .' +----' + + +diameter: 18 + +'''-._ + `. + \ + . + | + | + + +diameter: 18 + + _.-''' + ,' + / +. +| +| + + +diameter: 18 + +| +| + \ + `._ + '-... + + +diameter: 18 + + | + | + / + _.' +...-' + + +diameter: 19 + +'''-._ + `. + \ + . + | + | + + +diameter: 19 + + _.-''' |