@@ -3242,8 +3242,9 @@ d3 = function() {
32423242 stream . lineStart ( ) ;
32433243 }
32443244 function linePoint ( λ , φ ) {
3245- var c = d3_geo_cartesian ( [ λ , φ ] ) , p = project ( λ , φ ) ;
3246- resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x0 = p [ 0 ] , y0 = p [ 1 ] , λ0 = λ , a0 = c [ 0 ] , b0 = c [ 1 ] , c0 = c [ 2 ] , maxDepth , stream ) ;
3245+ var c = d3_geo_cartesian ( [ λ , φ ] ) , p = project ( λ , φ ) , buffer = [ ] ;
3246+ resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x0 = p [ 0 ] , y0 = p [ 1 ] , λ0 = λ , a0 = c [ 0 ] , b0 = c [ 1 ] , c0 = c [ 2 ] , maxDepth , buffer ) ;
3247+ streamLine ( buffer , stream ) ;
32473248 stream . point ( x0 , y0 ) ;
32483249 }
32493250 function lineEnd ( ) {
@@ -3258,21 +3259,29 @@ d3 = function() {
32583259 resample . point = linePoint ;
32593260 } ;
32603261 resample . lineEnd = function ( ) {
3261- resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x00 , y00 , λ00 , a00 , b00 , c00 , maxDepth , stream ) ;
3262+ var buffer = [ ] ;
3263+ resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x00 , y00 , λ00 , a00 , b00 , c00 , maxDepth , buffer ) ;
3264+ streamLine ( buffer , stream ) ;
32623265 resample . lineEnd = lineEnd ;
32633266 lineEnd ( ) ;
32643267 } ;
32653268 }
3269+ function streamLine ( line , stream ) {
3270+ for ( var i = 0 , n = line . length , point ; i < n ; ++ i ) {
3271+ stream . point ( ( point = line [ i ] ) [ 0 ] , point [ 1 ] ) ;
3272+ }
3273+ }
32663274 return resample ;
32673275 }
3268- function resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x1 , y1 , λ1 , a1 , b1 , c1 , depth , stream ) {
3276+ function resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x1 , y1 , λ1 , a1 , b1 , c1 , depth , buffer ) {
32693277 var dx = x1 - x0 , dy = y1 - y0 , d2 = dx * dx + dy * dy ;
32703278 if ( d2 > 4 * δ2 && depth -- ) {
3271- var a = a0 + a1 , b = b0 + b1 , c = c0 + c1 , m = Math . sqrt ( a * a + b * b + c * c ) , φ2 = Math . asin ( c /= m ) , λ2 = Math . abs ( Math . abs ( c ) - 1 ) < ε ? ( λ0 + λ1 ) / 2 : Math . atan2 ( b , a ) , p = project ( λ2 , φ2 ) , x2 = p [ 0 ] , y2 = p [ 1 ] , dx2 = x2 - x0 , dy2 = y2 - y0 , dz = dy * dx2 - dx * dy2 ;
3272- if ( dz * dz / d2 > δ2 || Math . abs ( ( dx * dx2 + dy * dy2 ) / d2 - .5 ) > .3 ) {
3273- resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x2 , y2 , λ2 , a /= m , b /= m , c , depth , stream ) ;
3274- stream . point ( x2 , y2 ) ;
3275- resampleLineTo ( x2 , y2 , λ2 , a , b , c , x1 , y1 , λ1 , a1 , b1 , c1 , depth , stream ) ;
3279+ var a = a0 + a1 , b = b0 + b1 , c = c0 + c1 , m = Math . sqrt ( a * a + b * b + c * c ) , φ2 = Math . asin ( c /= m ) , λ2 = Math . abs ( Math . abs ( c ) - 1 ) < ε ? ( λ0 + λ1 ) / 2 : Math . atan2 ( b , a ) , p = project ( λ2 , φ2 ) , x2 = p [ 0 ] , y2 = p [ 1 ] , dx2 = x2 - x0 , dy2 = y2 - y0 , dz = dy * dx2 - dx * dy2 , tooFar = false ;
3280+ if ( dz * dz / d2 > δ2 || Math . abs ( ( dx * dx2 + dy * dy2 ) / d2 - .5 ) > .3 || ( tooFar = dx2 * dx2 + dy2 * dy2 > 256 * δ2 ) ) {
3281+ var s0 = resampleLineTo ( x0 , y0 , λ0 , a0 , b0 , c0 , x2 , y2 , λ2 , a /= m , b /= m , c , depth , buffer ) ;
3282+ buffer . push ( p ) ;
3283+ var s1 = resampleLineTo ( x2 , y2 , λ2 , a , b , c , x1 , y1 , λ1 , a1 , b1 , c1 , depth , buffer ) ;
3284+ return ! tooFar || s0 || s1 || ( buffer . pop ( ) , false ) ;
32763285 }
32773286 }
32783287 }
0 commit comments