@@ -46,20 +46,26 @@ function d3_geo_clipExtent(x0, y0, x1, y1) {
4646 } ,
4747 polygonEnd : function ( ) {
4848 listener = listener_ ;
49- if ( ( segments = d3 . merge ( segments ) ) . length ) {
49+ segments = d3 . merge ( segments ) ;
50+ var inside = clean && insidePolygon ( [ x0 , y0 ] ) ,
51+ visible = segments . length ;
52+ if ( inside || visible ) {
5053 listener . polygonStart ( ) ;
51- d3_geo_clipPolygon ( segments , compare , inside , interpolate , listener ) ;
54+ if ( inside ) {
55+ listener . lineStart ( ) ;
56+ interpolate ( null , null , 1 , listener ) ;
57+ listener . lineEnd ( ) ;
58+ }
59+ if ( visible ) {
60+ d3_geo_clipPolygon ( segments , compare , pointInside , interpolate , listener ) ;
61+ }
5262 listener . polygonEnd ( ) ;
53- } else if ( insidePolygon ( [ x0 , y0 ] ) ) {
54- listener . polygonStart ( ) , listener . lineStart ( ) ;
55- interpolate ( null , null , 1 , listener ) ;
56- listener . lineEnd ( ) , listener . polygonEnd ( ) ;
5763 }
5864 segments = polygon = ring = null ;
5965 }
6066 } ;
6167
62- function inside ( point ) {
68+ function pointInside ( point ) {
6369 var a = corner ( point , - 1 ) ,
6470 i = insidePolygon ( [ a === 0 || a === 3 ? x0 : x1 , a > 1 ? y1 : y0 ] ) ;
6571 return i ;
@@ -101,22 +107,23 @@ function d3_geo_clipExtent(x0, y0, x1, y1) {
101107 }
102108 }
103109
104- function visible ( x , y ) {
110+ function pointVisible ( x , y ) {
105111 return x0 <= x && x <= x1 && y0 <= y && y <= y1 ;
106112 }
107113
108114 function point ( x , y ) {
109- if ( visible ( x , y ) ) listener . point ( x , y ) ;
115+ if ( pointVisible ( x , y ) ) listener . point ( x , y ) ;
110116 }
111117
112118 var x__ , y__ , v__ , // first point
113119 x_ , y_ , v_ , // previous point
114- first ;
120+ first ,
121+ clean ;
115122
116123 function lineStart ( ) {
117124 clip . point = linePoint ;
118125 if ( polygon ) polygon . push ( ring = [ ] ) ;
119- first = true ;
126+ first = clean = true ;
120127 v_ = false ;
121128 x_ = y_ = NaN ;
122129 }
@@ -137,7 +144,7 @@ function d3_geo_clipExtent(x0, y0, x1, y1) {
137144 function linePoint ( x , y ) {
138145 x = Math . max ( - d3_geo_clipExtentMAX , Math . min ( d3_geo_clipExtentMAX , x ) ) ;
139146 y = Math . max ( - d3_geo_clipExtentMAX , Math . min ( d3_geo_clipExtentMAX , y ) ) ;
140- var v = visible ( x , y ) ;
147+ var v = pointVisible ( x , y ) ;
141148 if ( polygon ) ring . push ( [ x , y ] ) ;
142149 if ( first ) {
143150 x__ = x , y__ = y , v__ = v ;
@@ -158,9 +165,11 @@ function d3_geo_clipExtent(x0, y0, x1, y1) {
158165 }
159166 listener . point ( b [ 0 ] , b [ 1 ] ) ;
160167 if ( ! v ) listener . lineEnd ( ) ;
168+ clean = false ;
161169 } else if ( v ) {
162170 listener . lineStart ( ) ;
163171 listener . point ( x , y ) ;
172+ clean = false ;
164173 }
165174 }
166175 }
0 commit comments