22//
33// SPDX-License-Identifier: MIT
44
5+ use glam:: DVec2 ;
6+
57use crate :: aabb:: { bounding_box_max_extent, bounding_boxes_overlap, AaBb } ;
68use crate :: epsilons:: Epsilons ;
79use crate :: line_segment:: { line_segment_intersection, line_segments_intersect} ;
810use crate :: line_segment_aabb:: line_segment_aabb_intersect;
911use crate :: math:: lerp;
10- use crate :: path_segment:: { get_end_point, get_start_point, path_segment_bounding_box, sample_path_segment_at, split_segment_at, PathSegment } ;
11- use crate :: vector:: { vectors_equal, Vector } ;
12+ use crate :: path_segment:: PathSegment ;
1213
1314#[ derive( Clone ) ]
1415struct IntersectionSegment {
@@ -20,26 +21,26 @@ struct IntersectionSegment {
2021
2122#[ inline( never) ]
2223fn subdivide_intersection_segment ( int_seg : & IntersectionSegment ) -> [ IntersectionSegment ; 2 ] {
23- let ( seg0, seg1) = split_segment_at ( & int_seg. seg , 0.5 ) ;
24+ let ( seg0, seg1) = int_seg. seg . split_at ( 0.5 ) ;
2425 let mid_param = ( int_seg. start_param + int_seg. end_param ) / 2.0 ;
2526 [
2627 IntersectionSegment {
2728 seg : seg0,
2829 start_param : int_seg. start_param ,
2930 end_param : mid_param,
30- bounding_box : path_segment_bounding_box ( & seg0) ,
31+ bounding_box : seg0. bounding_box ( ) ,
3132 } ,
3233 IntersectionSegment {
3334 seg : seg1,
3435 start_param : mid_param,
3536 end_param : int_seg. end_param ,
36- bounding_box : path_segment_bounding_box ( & seg1) ,
37+ bounding_box : seg1. bounding_box ( ) ,
3738 } ,
3839 ]
3940}
4041
4142#[ inline( never) ]
42- fn path_segment_to_line_segment ( seg : & PathSegment ) -> [ Vector ; 2 ] {
43+ fn path_segment_to_line_segment ( seg : & PathSegment ) -> [ DVec2 ; 2 ] {
4344 match seg {
4445 PathSegment :: Line ( start, end) => [ * start, * end] ,
4546 PathSegment :: Cubic ( start, _, _, end) => [ * start, * end] ,
@@ -63,13 +64,13 @@ fn intersection_segments_overlap(seg0: &IntersectionSegment, seg1: &Intersection
6364#[ inline( never) ]
6465pub fn segments_equal ( seg0 : & PathSegment , seg1 : & PathSegment , point_epsilon : f64 ) -> bool {
6566 match ( * seg0, * seg1) {
66- ( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) => vectors_equal ( start0, start1, point_epsilon) && vectors_equal ( end0, end1, point_epsilon) ,
67+ ( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) => start0. abs_diff_eq ( start1, point_epsilon) && end0. abs_diff_eq ( end1, point_epsilon) ,
6768 ( PathSegment :: Cubic ( p00, p01, p02, p03) , PathSegment :: Cubic ( p10, p11, p12, p13) ) => {
68- let start_and_end_equal = vectors_equal ( p00, p10, point_epsilon) && vectors_equal ( p03, p13, point_epsilon) ;
69+ let start_and_end_equal = p00. abs_diff_eq ( p10, point_epsilon) && p03. abs_diff_eq ( p13, point_epsilon) ;
6970
70- let parameter_equal = vectors_equal ( p01, p11, point_epsilon) && vectors_equal ( p02, p12, point_epsilon) ;
71- let direction1 = sample_path_segment_at ( seg0, 0.1 ) ;
72- let direction2 = sample_path_segment_at ( seg1, 0.1 ) ;
71+ let parameter_equal = p01. abs_diff_eq ( p11, point_epsilon) && p02. abs_diff_eq ( p12, point_epsilon) ;
72+ let direction1 = seg0. sample_at ( 0.1 ) ;
73+ let direction2 = seg1. sample_at ( 0.1 ) ;
7374 let angles_equal = ( direction1 - p00) . angle_to ( direction2 - p00) . abs ( ) < point_epsilon * 4. ;
7475 if angles_equal {
7576 // eprintln!("deduplicating {:?} {:?} because the angles are equal", seg0, seg1);
@@ -78,16 +79,16 @@ pub fn segments_equal(seg0: &PathSegment, seg1: &PathSegment, point_epsilon: f64
7879 start_and_end_equal && ( parameter_equal || angles_equal)
7980 }
8081 ( PathSegment :: Quadratic ( p00, p01, p02) , PathSegment :: Quadratic ( p10, p11, p12) ) => {
81- vectors_equal ( p00, p10, point_epsilon) && vectors_equal ( p01, p11, point_epsilon) && vectors_equal ( p02, p12, point_epsilon)
82+ p00. abs_diff_eq ( p10, point_epsilon) && p01. abs_diff_eq ( p11, point_epsilon) && p02. abs_diff_eq ( p12, point_epsilon)
8283 }
8384 ( PathSegment :: Arc ( p00, rx0, ry0, angle0, large_arc0, sweep0, p01) , PathSegment :: Arc ( p10, rx1, ry1, angle1, large_arc1, sweep1, p11) ) => {
84- vectors_equal ( p00, p10, point_epsilon) &&
85+ p00. abs_diff_eq ( p10, point_epsilon) &&
8586 ( rx0 - rx1) . abs ( ) < point_epsilon &&
8687 ( ry0 - ry1) . abs ( ) < point_epsilon &&
8788 ( angle0 - angle1) . abs ( ) < point_epsilon && // TODO: Phi can be anything if rx = ry. Also, handle rotations by Pi/2.
8889 large_arc0 == large_arc1 &&
8990 sweep0 == sweep1 &&
90- vectors_equal ( p01, p11, point_epsilon)
91+ p01. abs_diff_eq ( p11, point_epsilon)
9192 }
9293 _ => false ,
9394 }
@@ -111,13 +112,13 @@ pub fn path_segment_intersection(seg0: &PathSegment, seg1: &PathSegment, endpoin
111112 seg: * seg0,
112113 start_param: 0.0 ,
113114 end_param: 1.0 ,
114- bounding_box: path_segment_bounding_box ( seg0) ,
115+ bounding_box: seg0. bounding_box ( ) ,
115116 } ,
116117 IntersectionSegment {
117118 seg: * seg1,
118119 start_param: 0.0 ,
119120 end_param: 1.0 ,
120- bounding_box: path_segment_bounding_box ( seg1) ,
121+ bounding_box: seg1. bounding_box ( ) ,
121122 } ,
122123 ) ] ;
123124 let mut next_pairs = Vec :: new ( ) ;
@@ -188,10 +189,10 @@ pub fn path_segment_intersection(seg0: &PathSegment, seg1: &PathSegment, endpoin
188189}
189190
190191fn calculate_overlap_intersections ( seg0 : & PathSegment , seg1 : & PathSegment , eps : & Epsilons ) -> Vec < [ f64 ; 2 ] > {
191- let start0 = get_start_point ( seg0) ;
192- let end0 = get_end_point ( seg0) ;
193- let start1 = get_start_point ( seg1) ;
194- let end1 = get_end_point ( seg1) ;
192+ let start0 = seg0. start ( ) ;
193+ let end0 = seg0. end ( ) ;
194+ let start1 = seg1. start ( ) ;
195+ let end1 = seg1. end ( ) ;
195196
196197 let mut intersections = Vec :: new ( ) ;
197198
@@ -217,12 +218,12 @@ fn calculate_overlap_intersections(seg0: &PathSegment, seg1: &PathSegment, eps:
217218
218219 // Remove duplicates and sort intersections
219220 intersections. sort_unstable_by ( |a, b| a[ 0 ] . partial_cmp ( & b[ 0 ] ) . unwrap ( ) ) ;
220- intersections. dedup_by ( |a, b| vectors_equal ( Vector :: new ( a [ 0 ] , a [ 1 ] ) , Vector :: new ( b [ 0 ] , b [ 1 ] ) , eps. param ) ) ;
221+ intersections. dedup_by ( |a, b| DVec2 :: from ( * a ) . abs_diff_eq ( DVec2 :: from ( * b ) , eps. param ) ) ;
221222
222223 // Handle special cases
223224 if intersections. is_empty ( ) {
224225 // Check if segments are identical
225- if vectors_equal ( start0, start1, eps. point ) && vectors_equal ( end0, end1, eps. point ) {
226+ if ( start0. abs_diff_eq ( start1, eps. point ) ) && end0. abs_diff_eq ( end1, eps. point ) {
226227 return vec ! [ [ 0.0 , 0.0 ] , [ 1.0 , 1.0 ] ] ;
227228 }
228229 } else if intersections. len ( ) > 2 {
@@ -233,21 +234,21 @@ fn calculate_overlap_intersections(seg0: &PathSegment, seg1: &PathSegment, eps:
233234 intersections
234235}
235236
236- fn find_point_on_segment ( seg : & PathSegment , point : Vector , eps : & Epsilons ) -> Option < f64 > {
237+ fn find_point_on_segment ( seg : & PathSegment , point : DVec2 , eps : & Epsilons ) -> Option < f64 > {
237238 let start = 0.0 ;
238239 let end = 1.0 ;
239240 let mut t = 0.5 ;
240241
241242 for _ in 0 ..32 {
242243 // Limit iterations to prevent infinite loops
243- let current_point = sample_path_segment_at ( seg, t) ;
244+ let current_point = seg. sample_at ( t) ;
244245
245- if vectors_equal ( current_point, point, eps. point ) {
246+ if current_point. abs_diff_eq ( point, eps. point ) {
246247 return Some ( t) ;
247248 }
248249
249- let start_point = sample_path_segment_at ( seg, start) ;
250- let end_point = sample_path_segment_at ( seg, end) ;
250+ let start_point = seg. sample_at ( start) ;
251+ let end_point = seg. sample_at ( end) ;
251252
252253 let dist_start = ( point - start_point) . length_squared ( ) ;
253254 let dist_end = ( point - end_point) . length_squared ( ) ;
0 commit comments