diff options
author | Jovansonlee Cesar <ivanceras@gmail.com> | 2021-07-06 00:37:33 +0800 |
---|---|---|
committer | Jovansonlee Cesar <ivanceras@gmail.com> | 2021-07-06 00:37:33 +0800 |
commit | acad7ac5c46de8c4f39c1f1cf1e073ee08e78604 (patch) | |
tree | 7bfa3b503e6afceeba90b763674945df34199961 | |
parent | 362b965f9d612170ed32a7dcd202d7f2d83801ff (diff) |
Add a function to return regular shapes such as circle and rect, this will be used for testing hit, which fragment is hit
-rw-r--r-- | svgbob/src/buffer/cell_buffer.rs | 56 | ||||
-rw-r--r-- | svgbob/src/buffer/fragment_buffer/fragment.rs | 2 |
2 files changed, 52 insertions, 6 deletions
diff --git a/svgbob/src/buffer/cell_buffer.rs b/svgbob/src/buffer/cell_buffer.rs index c0f4d73..dfaae2d 100644 --- a/svgbob/src/buffer/cell_buffer.rs +++ b/svgbob/src/buffer/cell_buffer.rs @@ -192,16 +192,27 @@ impl CellBuffer { svg_node } + /// return fragments that are Rect, Circle, + pub fn get_shapes_fragment(&self, settings: &Settings) -> Vec<Fragment> { + let (single_member, _, endorsed_fragments) = self.group_single_members_from_other_fragments(settings); + dbg!(&single_member); + dbg!(&endorsed_fragments); + + endorsed_fragments.into_iter().chain(single_member.into_iter() + .filter(|frag|frag.is_rect() || frag.is_circle()) + ).collect() + } + /// returns (single_member, grouped, rest of the fragments fn group_single_members_from_other_fragments( &self, settings: &Settings, ) -> (Vec<Fragment>, Vec<Vec<Fragment>>, Vec<Fragment>) { - // vec_fragments are the fragment result of successful endorsement + // endorsed_fragments are the fragment result of successful endorsement // // vec_groups are not endorsed, but are still touching, these will be grouped together in // the svg node - let (vec_fragments, vec_contacts): ( + let (endorsed_fragments, vec_contacts): ( Vec<Vec<Fragment>>, Vec<Vec<Contacts>>, ) = self @@ -226,10 +237,10 @@ impl CellBuffer { let vec_groups: Vec<Vec<Fragment>> = vec_groups.into_iter().map(|contact| contact.0).collect(); - let vec_fragments: Vec<Fragment> = - vec_fragments.into_iter().flatten().collect(); + let endorsed_fragments: Vec<Fragment> = + endorsed_fragments.into_iter().flatten().collect(); - (single_member_fragments, vec_groups, vec_fragments) + (single_member_fragments, vec_groups, endorsed_fragments) } /// group nodes that can be group and the rest will be fragments @@ -655,6 +666,41 @@ mod tests { assert_eq!(adjacents.len(), 3); } + #[test] + fn test_shapes_fragment() { + let art = r#" + + +-------+ + *-----> | | + +-------+ + +This is a text + .-. + ( ) + `-' + + "#; + let buffer = CellBuffer::from(art); + let shapes = buffer.get_shapes_fragment(&Settings::default()); + println!("shapes: {:#?}", shapes); + assert_eq!(2, shapes.len()); + } + + #[test] + fn test_shapes_fragment_intersecting() { + let art = r#" + +-------+ + | | + +-------+ + + "#; + let buffer = CellBuffer::from(art); + let shapes = buffer.get_shapes_fragment(&Settings::default()); + println!("shapes: {:#?}", shapes); + assert_eq!(1, shapes.len()); + assert!(shapes[0].hit(Cell::new(15,1).a(), Cell::new(15,1).y())); + } + /// The . in .-/ /// will create a new contacts even since it is not adjacent to / /// so it needs a second_pass to merge it diff --git a/svgbob/src/buffer/fragment_buffer/fragment.rs b/svgbob/src/buffer/fragment_buffer/fragment.rs index 6cc111e..f938b04 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment.rs @@ -292,7 +292,7 @@ impl Fragment { } } - fn hit(&self, start: Point, end: Point) -> bool { + pub fn hit(&self, start: Point, end: Point) -> bool { self.is_intersecting(AABB::new(*start, *end)) } |