@@ -4,6 +4,8 @@ import { segmentCubicFactory } from './segment-cubic-factory';
44
55type SplitArray = [ number , number , number , number , number , number , number , number , number ] ;
66
7+ const MAX_RECURSION_DEPTH = 50 ;
8+
79function splitCubic ( pts : SplitArray , t = 0.5 ) : [ CurveArray , CurveArray ] {
810 const p0 = pts . slice ( 0 , 2 ) as [ number , number ] ;
911 const p1 = pts . slice ( 2 , 4 ) as [ number , number ] ;
@@ -32,17 +34,17 @@ function getCurveArray(segments: PathArray) {
3234 // @ts -ignore
3335 const curveLength = i
3436 ? segmentCubicFactory (
35- segmentData [ 0 ] ,
36- segmentData [ 1 ] ,
37- segmentData [ 2 ] ,
38- segmentData [ 3 ] ,
39- segmentData [ 4 ] ,
40- segmentData [ 5 ] ,
41- segmentData [ 6 ] ,
42- segmentData [ 7 ] ,
43- segmentData [ 8 ] ,
44- { bbox : false } ,
45- ) . length
37+ segmentData [ 0 ] ,
38+ segmentData [ 1 ] ,
39+ segmentData [ 2 ] ,
40+ segmentData [ 3 ] ,
41+ segmentData [ 4 ] ,
42+ segmentData [ 5 ] ,
43+ segmentData [ 6 ] ,
44+ segmentData [ 7 ] ,
45+ segmentData [ 8 ] ,
46+ { bbox : false } ,
47+ ) . length
4648 : 0 ;
4749
4850 let subsegs ;
@@ -61,7 +63,11 @@ function getCurveArray(segments: PathArray) {
6163 } ) ;
6264}
6365
64- export function equalizeSegments ( path1 : PathArray , path2 : PathArray , TL ?: number ) : CurveArray [ ] {
66+ export function equalizeSegments ( path1 : PathArray , path2 : PathArray , TL ?: number , depth = 0 ) : CurveArray [ ] {
67+ if ( depth > MAX_RECURSION_DEPTH ) {
68+ console . warn ( 'Maximum recursion depth reached in equalizeSegments' ) ;
69+ return [ path1 , path2 ] as CurveArray [ ] ;
70+ }
6571 const c1 = getCurveArray ( path1 ) ;
6672 const c2 = getCurveArray ( path2 ) ;
6773 const L1 = c1 . length ;
@@ -79,13 +85,13 @@ export function equalizeSegments(path1: PathArray, path2: PathArray, TL?: number
7985 x . l === tl
8086 ? x . map ( ( y ) => y . s )
8187 : x
82- . map ( ( y , j ) => {
83- canSplit = j && dif [ i ] && y . l >= mm [ i ] ;
84- dif [ i ] -= canSplit ? 1 : 0 ;
85- return canSplit ? y . ss : [ y . s ] ;
86- } )
87- . flat ( ) ,
88+ . map ( ( y , j ) => {
89+ canSplit = j && dif [ i ] && y . l >= mm [ i ] ;
90+ dif [ i ] -= canSplit ? 1 : 0 ;
91+ return canSplit ? y . ss : [ y . s ] ;
92+ } )
93+ . flat ( ) ,
8894 ) as CurveArray [ ] ;
8995
90- return result [ 0 ] . length === result [ 1 ] . length ? result : equalizeSegments ( result [ 0 ] , result [ 1 ] , tl ) ;
96+ return result [ 0 ] . length === result [ 1 ] . length ? result : equalizeSegments ( result [ 0 ] , result [ 1 ] , tl , depth + 1 ) ;
9197}
0 commit comments