toPiecewiseLinearOrArcRecursion: function( options, minLevels, maxLevels, segments, startT, endT, startPoint, endPoint, startCurvature, endCurvature ) { var middleT = ( startT + endT ) / 2; var middlePoint = this.positionAt( middleT ); var middleCurvature = this.curvatureAt( middleT ); if ( maxLevels <= 0 || ( minLevels <= 0 && Math.abs( startCurvature - middleCurvature ) + Math.abs( middleCurvature - endCurvature ) < options.curvatureThreshold * 2 ) ) { var segment = kite.Arc.createFromPoints( startPoint, middlePoint, endPoint ); var needsSplit = false; if ( segment instanceof kite.Arc ) { var radiusSquared = segment.radius * segment.radius; for ( var i = 0; i < options.errorPoints.length; i++ ) { var t = options.errorPoints[ i ]; var point = this.positionAt( startT * ( 1 - t ) + endT * t ); if ( Math.abs( point.distanceSquared( segment.center ) - radiusSquared ) > options.errorThreshold ) { needsSplit = true; break; } } } if ( !needsSplit ) { segments.push( segment ); return; } } this.toPiecewiseLinearOrArcRecursion( options, minLevels - 1, maxLevels - 1, segments, startT, middleT, startPoint, middlePoint, startCurvature, middleCurvature ); this.toPiecewiseLinearOrArcRecursion( options, minLevels - 1, maxLevels - 1, segments, middleT, endT, middlePoint, endPoint, middleCurvature, endCurvature ); },
Segment.intersect = function( a, b ) { if ( kite.Line && a instanceof kite.Line && b instanceof kite.Line ) { return kite.Line.intersect( a, b ); } else if ( kite.Line && a instanceof kite.Line ) { return kite.Line.intersectOther( a, b ); } else if ( kite.Line && b instanceof kite.Line ) { // need to swap our intersections, since 'b' is the line return kite.Line.intersectOther( b, a ).map( swapSegmentIntersection ); } else if ( kite.Arc && a instanceof kite.Arc && b instanceof kite.Arc ) { return kite.Arc.intersect( a, b ); } else { return BoundsIntersection.intersect( a, b ); } };