@@ -18,6 +18,7 @@ struct IntersectionSegment {
18
18
bounding_box : AaBb ,
19
19
}
20
20
21
+ #[ inline( never) ]
21
22
fn subdivide_intersection_segment ( int_seg : & IntersectionSegment ) -> [ IntersectionSegment ; 2 ] {
22
23
let ( seg0, seg1) = split_segment_at ( & int_seg. seg , 0.5 ) ;
23
24
let mid_param = ( int_seg. start_param + int_seg. end_param ) / 2.0 ;
@@ -37,6 +38,7 @@ fn subdivide_intersection_segment(int_seg: &IntersectionSegment) -> [Intersectio
37
38
]
38
39
}
39
40
41
+ #[ inline( never) ]
40
42
fn path_segment_to_line_segment ( seg : & PathSegment ) -> [ Vector ; 2 ] {
41
43
match seg {
42
44
PathSegment :: Line ( start, end) => [ * start, * end] ,
@@ -46,6 +48,7 @@ fn path_segment_to_line_segment(seg: &PathSegment) -> [Vector; 2] {
46
48
}
47
49
}
48
50
51
+ #[ inline( never) ]
49
52
fn intersection_segments_overlap ( seg0 : & IntersectionSegment , seg1 : & IntersectionSegment ) -> bool {
50
53
match ( & seg0. seg , & seg1. seg ) {
51
54
( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) => {
@@ -57,6 +60,7 @@ fn intersection_segments_overlap(seg0: &IntersectionSegment, seg1: &Intersection
57
60
}
58
61
}
59
62
63
+ #[ inline( never) ]
60
64
pub fn segments_equal ( seg0 : & PathSegment , seg1 : & PathSegment , point_epsilon : f64 ) -> bool {
61
65
match ( * seg0, * seg1) {
62
66
( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) => vectors_equal ( start0, start1, point_epsilon) && vectors_equal ( end0, end1, point_epsilon) ,
@@ -80,8 +84,6 @@ pub fn segments_equal(seg0: &PathSegment, seg1: &PathSegment, point_epsilon: f64
80
84
}
81
85
82
86
pub fn path_segment_intersection ( seg0 : & PathSegment , seg1 : & PathSegment , endpoints : bool , eps : & Epsilons ) -> Vec < [ f64 ; 2 ] > {
83
- eprintln ! ( "intersecting:" ) ;
84
- dbg ! ( seg0, seg1) ;
85
87
// dbg!(&seg0, &seg1, endpoints);
86
88
if let ( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) = ( seg0, seg1) {
87
89
if let Some ( st) = line_segment_intersection ( [ * start0, * end0] , [ * start1, * end1] , eps. param ) {
@@ -116,6 +118,7 @@ pub fn path_segment_intersection(seg0: &PathSegment, seg1: &PathSegment, endpoin
116
118
117
119
while !pairs. is_empty ( ) {
118
120
next_pairs. clear ( ) ;
121
+ dbg ! ( "checking pairs" ) ;
119
122
120
123
for ( seg0, seg1) in pairs. iter ( ) {
121
124
if segments_equal ( & seg0. seg , & seg1. seg , eps. point ) {
@@ -130,6 +133,7 @@ pub fn path_segment_intersection(seg0: &PathSegment, seg1: &PathSegment, endpoin
130
133
let line_segment0 = path_segment_to_line_segment ( & seg0. seg ) ;
131
134
let line_segment1 = path_segment_to_line_segment ( & seg1. seg ) ;
132
135
if let Some ( st) = line_segment_intersection ( line_segment0, line_segment1, eps. param ) {
136
+ dbg ! ( "pushing param" ) ;
133
137
params. push ( [ lerp ( seg0. start_param , seg0. end_param , st. 0 ) , lerp ( seg1. start_param , seg1. end_param , st. 1 ) ] ) ;
134
138
}
135
139
} else {
@@ -165,3 +169,36 @@ pub fn path_segment_intersection(seg0: &PathSegment, seg1: &PathSegment, endpoin
165
169
166
170
params
167
171
}
172
+
173
+ #[ cfg( test) ]
174
+ mod test {
175
+ use super :: * ;
176
+ use glam:: DVec2 ;
177
+
178
+ #[ test]
179
+ fn intersect_cubic_slow_first ( ) {
180
+ path_segment_intersection ( & a ( ) , & b ( ) , true , & crate :: EPS ) ;
181
+ }
182
+ #[ test]
183
+ fn intersect_cubic_slow_second ( ) {
184
+ path_segment_intersection ( & c ( ) , & d ( ) , true , & crate :: EPS ) ;
185
+ }
186
+
187
+ fn a ( ) -> PathSegment {
188
+ PathSegment :: Cubic (
189
+ DVec2 :: new ( 458.37027 , 572.165771 ) ,
190
+ DVec2 :: new ( 428.525848 , 486.720093 ) ,
191
+ DVec2 :: new ( 368.618805 , 467.485992 ) ,
192
+ DVec2 :: new ( 273.0 , 476.0 ) ,
193
+ )
194
+ }
195
+ fn b ( ) -> PathSegment {
196
+ PathSegment :: Cubic ( DVec2 :: new ( 273.0 , 476.0 ) , DVec2 :: new ( 419.0 , 463.0 ) , DVec2 :: new ( 481.741198 , 514.692273 ) , DVec2 :: new ( 481.333333 , 768.0 ) )
197
+ }
198
+ fn c ( ) -> PathSegment {
199
+ PathSegment :: Cubic ( DVec2 :: new ( 273.0 , 476.0 ) , DVec2 :: new ( 107.564178 , 490.730591 ) , DVec2 :: new ( 161.737915 , 383.575775 ) , DVec2 :: new ( 0.0 , 340.0 ) )
200
+ }
201
+ fn d ( ) -> PathSegment {
202
+ PathSegment :: Cubic ( DVec2 :: new ( 0.0 , 340.0 ) , DVec2 :: new ( 161.737914 , 383.575765 ) , DVec2 :: new ( 107.564182 , 490.730587 ) , DVec2 :: new ( 273.0 , 476.0 ) )
203
+ }
204
+ }
0 commit comments