From 0963aea5052ae8d4905cf0abb51dfe601c12b7e6 Mon Sep 17 00:00:00 2001 From: Jovansonlee Cesar Date: Tue, 6 Jul 2021 07:11:04 +0800 Subject: Include circle in intersection test --- svgbob/src/buffer/cell_buffer.rs | 4 +--- svgbob/src/buffer/fragment_buffer/fragment.rs | 14 +++++++++++++- svgbob/src/buffer/fragment_buffer/fragment/circle.rs | 19 +++++++++++++++++++ svgbob/src/buffer/fragment_buffer/fragment/rect.rs | 1 + 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/svgbob/src/buffer/cell_buffer.rs b/svgbob/src/buffer/cell_buffer.rs index dfaae2d..47b8352 100644 --- a/svgbob/src/buffer/cell_buffer.rs +++ b/svgbob/src/buffer/cell_buffer.rs @@ -195,9 +195,6 @@ impl CellBuffer { /// return fragments that are Rect, Circle, pub fn get_shapes_fragment(&self, settings: &Settings) -> Vec { 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() @@ -244,6 +241,7 @@ impl CellBuffer { } /// group nodes that can be group and the rest will be fragments + /// Note: The grouped fragments is scaled here fn group_nodes_and_fragments( &self, settings: &Settings, diff --git a/svgbob/src/buffer/fragment_buffer/fragment.rs b/svgbob/src/buffer/fragment_buffer/fragment.rs index f938b04..8eeacac 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment.rs @@ -297,7 +297,7 @@ impl Fragment { } /// check if this fragment is intersecting with this bounding box - fn is_intersecting(&self, bbox: AABB) -> bool { + pub fn is_intersecting(&self, bbox: AABB) -> bool { let bbox: Polyline = Polyline::new( vec![ *bbox.mins(), @@ -319,6 +319,11 @@ impl Fragment { proximity(&identity, &polyline, &identity, &bbox, 0.0) == Proximity::Intersecting } + Fragment::Circle(circle) => { + let polyline: Polyline = circle.clone().into(); + proximity(&identity, &polyline, &identity, &bbox, 0.0) + == Proximity::Intersecting + } _ => false, } } @@ -414,6 +419,13 @@ impl Fragment { } } + pub fn as_rect(&self) -> Option<&Rect> { + match self { + Fragment::Rect(ref rect) => Some(rect), + _ => None, + } + } + pub fn as_polygon(&self) -> Option<&Polygon> { match self { Fragment::Polygon(polygon) => Some(polygon), diff --git a/svgbob/src/buffer/fragment_buffer/fragment/circle.rs b/svgbob/src/buffer/fragment_buffer/fragment/circle.rs index e3f9717..f43428a 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/circle.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/circle.rs @@ -1,4 +1,6 @@ use crate::{fragment::Bounds, util, Cell, Point}; +use ncollide2d::procedural; +use ncollide2d::shape::Polyline; use std::{cmp::Ordering, fmt}; use sauron::{ @@ -104,3 +106,20 @@ impl PartialEq for Circle { self.cmp(other) == Ordering::Equal } } + +impl Into> for Circle { + fn into(self) -> Polyline { + use nalgebra::Point2; + let pl = procedural::circle(&(self.radius * 2.0), 64); + let mut points = pl.coords().to_vec(); + let orig_len = points.len(); + points.dedup(); + + let adjusted: Vec> = points + .into_iter() + .map(|p| *Point::new(p.x + self.center.x, p.y + self.center.y)) + .collect(); + + Polyline::new(adjusted, None) + } +} diff --git a/svgbob/src/buffer/fragment_buffer/fragment/rect.rs b/svgbob/src/buffer/fragment_buffer/fragment/rect.rs index 0bcad5c..51f8481 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/rect.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/rect.rs @@ -120,6 +120,7 @@ impl Into> for Rect { *Point::new(self.end.x, self.start.y), *self.end, *Point::new(self.start.x, self.end.y), + *self.start, ], None, ) -- cgit v1.2.3