@@ -5,6 +5,17 @@ use crate::line_segment_aabb::line_segment_aabb_intersect;
55use crate :: math:: lerp;
66use crate :: path_segment:: PathSegment ;
77use glam:: DVec2 ;
8+ use lyon_geom:: { CubicBezierSegment , Point } ;
9+
10+ /// Convert PathSegment::Cubic to lyon_geom::CubicBezierSegment
11+ fn path_segment_cubic_to_lyon ( start : DVec2 , ctrl1 : DVec2 , ctrl2 : DVec2 , end : DVec2 ) -> CubicBezierSegment < f64 > {
12+ CubicBezierSegment {
13+ from : Point :: new ( start. x , start. y ) ,
14+ ctrl1 : Point :: new ( ctrl1. x , ctrl1. y ) ,
15+ ctrl2 : Point :: new ( ctrl2. x , ctrl2. y ) ,
16+ to : Point :: new ( end. x , end. y ) ,
17+ }
18+ }
819
920#[ derive( Clone ) ]
1021struct IntersectionSegment {
@@ -87,13 +98,24 @@ pub fn segments_equal(seg0: &PathSegment, seg1: &PathSegment, point_epsilon: f64
8798}
8899
89100pub fn path_segment_intersection ( seg0 : & PathSegment , seg1 : & PathSegment , endpoints : bool , eps : & Epsilons ) -> Vec < [ f64 ; 2 ] > {
90- if let ( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) = ( seg0, seg1) {
91- if let Some ( st) = line_segment_intersection ( [ * start0, * end0] , [ * start1, * end1] , eps. param ) {
92- if !endpoints && ( st. 0 < eps. param || st. 0 > 1. - eps. param ) && ( st. 1 < eps. param || st. 1 > 1. - eps. param ) {
93- return vec ! [ ] ;
101+ match ( seg0, seg1) {
102+ ( PathSegment :: Line ( start0, end0) , PathSegment :: Line ( start1, end1) ) => {
103+ if let Some ( st) = line_segment_intersection ( [ * start0, * end0] , [ * start1, * end1] , eps. param ) {
104+ if !endpoints && ( st. 0 < eps. param || st. 0 > 1. - eps. param ) && ( st. 1 < eps. param || st. 1 > 1. - eps. param ) {
105+ return vec ! [ ] ;
106+ }
107+ return vec ! [ st. into( ) ] ;
94108 }
95- return vec ! [ st. into( ) ] ;
96109 }
110+ ( PathSegment :: Cubic ( s1, c11, c21, e1) , PathSegment :: Cubic ( s2, c12, c22, e2) ) => {
111+ let path1 = path_segment_cubic_to_lyon ( * s1, * c11, * c21, * e1) ;
112+ let path2 = path_segment_cubic_to_lyon ( * s2, * c12, * c22, * e2) ;
113+
114+ let intersections = path1. cubic_intersections_t ( & path2) ;
115+ let intersections: Vec < _ > = intersections. into_iter ( ) . map ( |( s, t) | [ s, t] ) . collect ( ) ;
116+ return intersections;
117+ }
118+ _ => ( ) ,
97119 }
98120
99121 // https://math.stackexchange.com/questions/20321/how-can-i-tell-when-two-cubic-b%C3%A9zier-curves-intersect
0 commit comments