@@ -5,6 +5,17 @@ use crate::line_segment_aabb::line_segment_aabb_intersect;
5
5
use crate :: math:: lerp;
6
6
use crate :: path_segment:: PathSegment ;
7
7
use 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
+ }
8
19
9
20
#[ derive( Clone ) ]
10
21
struct IntersectionSegment {
@@ -87,13 +98,24 @@ pub fn segments_equal(seg0: &PathSegment, seg1: &PathSegment, point_epsilon: f64
87
98
}
88
99
89
100
pub 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( ) ] ;
94
108
}
95
- return vec ! [ st. into( ) ] ;
96
109
}
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
+ _ => ( ) ,
97
119
}
98
120
99
121
// https://math.stackexchange.com/questions/20321/how-can-i-tell-when-two-cubic-b%C3%A9zier-curves-intersect
0 commit comments