@@ -94,10 +94,14 @@ export default function pieLayout(
9494
9595 let startAngle = - seriesModel . get ( 'startAngle' ) * RADIAN ;
9696 let endAngle = seriesModel . get ( 'endAngle' ) ;
97+ const padAngle = seriesModel . get ( 'padAngle' ) * RADIAN ;
98+
9799 endAngle = endAngle === 'auto' ? startAngle - PI2 : - endAngle * RADIAN ;
98100
99101 const minAngle = seriesModel . get ( 'minAngle' ) * RADIAN ;
100102
103+ const minAndPadAngle = minAngle + padAngle ;
104+
101105 let validDataCount = 0 ;
102106 data . each ( valueDim , function ( value : number ) {
103107 ! isNaN ( value ) && validDataCount ++ ;
@@ -118,6 +122,7 @@ export default function pieLayout(
118122
119123 const dir = clockwise ? 1 : - 1 ;
120124 const angles = [ startAngle , endAngle ] ;
125+ const halfPadAngle = dir * padAngle / 2 ;
121126 normalizeArcAngles ( angles , ! clockwise ) ;
122127
123128 [ startAngle , endAngle ] = angles ;
@@ -159,19 +164,34 @@ export default function pieLayout(
159164 angle = angleRange / validDataCount ;
160165 }
161166
162- if ( angle < minAngle ) {
163- angle = minAngle ;
164- restAngle -= minAngle ;
167+
168+ if ( angle < minAndPadAngle ) {
169+ angle = minAndPadAngle ;
170+ restAngle -= minAndPadAngle ;
165171 }
166172 else {
167173 valueSumLargerThanMinAngle += value ;
168174 }
169175
170176 const endAngle = currentAngle + dir * angle ;
177+
178+ // calculate display angle
179+ let actualStartAngle = 0 ;
180+ let actualEndAngle = 0 ;
181+
182+ if ( padAngle > angle ) {
183+ actualStartAngle = currentAngle + dir * angle / 2 ;
184+ actualEndAngle = actualStartAngle ;
185+ }
186+ else {
187+ actualStartAngle = currentAngle + halfPadAngle ;
188+ actualEndAngle = endAngle - halfPadAngle ;
189+ }
190+
171191 data . setItemLayout ( idx , {
172192 angle : angle ,
173- startAngle : currentAngle ,
174- endAngle : endAngle ,
193+ startAngle : actualStartAngle ,
194+ endAngle : actualEndAngle ,
175195 clockwise : clockwise ,
176196 cx : cx ,
177197 cy : cy ,
@@ -184,19 +204,32 @@ export default function pieLayout(
184204 currentAngle = endAngle ;
185205 } ) ;
186206
187- // Some sector is constrained by minAngle
207+ // Some sector is constrained by minAngle and padAngle
188208 // Rest sectors needs recalculate angle
189209 if ( restAngle < PI2 && validDataCount ) {
190210 // Average the angle if rest angle is not enough after all angles is
191- // Constrained by minAngle
211+ // Constrained by minAngle and padAngle
192212 if ( restAngle <= 1e-3 ) {
193213 const angle = angleRange / validDataCount ;
194214 data . each ( valueDim , function ( value : number , idx : number ) {
195215 if ( ! isNaN ( value ) ) {
196216 const layout = data . getItemLayout ( idx ) ;
197217 layout . angle = angle ;
198- layout . startAngle = startAngle + dir * idx * angle ;
199- layout . endAngle = startAngle + dir * ( idx + 1 ) * angle ;
218+
219+ let actualStartAngle = 0 ;
220+ let actualEndAngle = 0 ;
221+
222+ if ( angle < padAngle ) {
223+ actualStartAngle = startAngle + dir * ( idx + 1 / 2 ) * angle ;
224+ actualEndAngle = actualStartAngle ;
225+ }
226+ else {
227+ actualStartAngle = startAngle + dir * idx * angle + halfPadAngle ;
228+ actualEndAngle = startAngle + dir * ( idx + 1 ) * angle - halfPadAngle ;
229+ }
230+
231+ layout . startAngle = actualStartAngle ;
232+ layout . endAngle = actualEndAngle ;
200233 }
201234 } ) ;
202235 }
@@ -206,10 +239,23 @@ export default function pieLayout(
206239 data . each ( valueDim , function ( value : number , idx : number ) {
207240 if ( ! isNaN ( value ) ) {
208241 const layout = data . getItemLayout ( idx ) ;
209- const angle = layout . angle === minAngle
210- ? minAngle : value * unitRadian ;
211- layout . startAngle = currentAngle ;
212- layout . endAngle = currentAngle + dir * angle ;
242+ const angle = layout . angle === minAndPadAngle
243+ ? minAndPadAngle : value * unitRadian ;
244+
245+ let actualStartAngle = 0 ;
246+ let actualEndAngle = 0 ;
247+
248+ if ( angle < padAngle ) {
249+ actualStartAngle = currentAngle + dir * angle / 2 ;
250+ actualEndAngle = actualStartAngle ;
251+ }
252+ else {
253+ actualStartAngle = currentAngle + halfPadAngle ;
254+ actualEndAngle = currentAngle + dir * angle - halfPadAngle ;
255+ }
256+
257+ layout . startAngle = actualStartAngle ;
258+ layout . endAngle = actualEndAngle ;
213259 currentAngle += dir * angle ;
214260 }
215261 } ) ;
0 commit comments