summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJovansonlee Cesar <ivanceras@gmail.com>2021-07-06 00:37:33 +0800
committerJovansonlee Cesar <ivanceras@gmail.com>2021-07-06 00:37:33 +0800
commitacad7ac5c46de8c4f39c1f1cf1e073ee08e78604 (patch)
tree7bfa3b503e6afceeba90b763674945df34199961
parent362b965f9d612170ed32a7dcd202d7f2d83801ff (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.rs56
-rw-r--r--svgbob/src/buffer/fragment_buffer/fragment.rs2
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))
}