Skip to content

Commit b79777e

Browse files
authored
Merge pull request #18820 from linghaoSu/feat/pie-angleRange
feat(pie): add endAngle for control pie range
2 parents 7866509 + 65d7442 commit b79777e

5 files changed

Lines changed: 109 additions & 5 deletions

File tree

src/chart/pie/PieSeries.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export interface PieSeriesOption extends
112112

113113
clockwise?: boolean
114114
startAngle?: number
115+
endAngle?: number | 'auto'
115116
minAngle?: number
116117
minShowLabelAngle?: number
117118

@@ -217,6 +218,7 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
217218
// 默认顺时针
218219
clockwise: true,
219220
startAngle: 90,
221+
endAngle: 'auto',
220222
// 最小角度改为0
221223
minAngle: 0,
222224

src/chart/pie/pieLayout.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import GlobalModel from '../../model/Global';
2424
import ExtensionAPI from '../../core/ExtensionAPI';
2525
import PieSeriesModel from './PieSeries';
2626
import { SectorShape } from 'zrender/src/graphic/shape/Sector';
27+
import { normalizeArcAngles } from 'zrender/src/core/PathProxy';
2728

2829
const PI2 = Math.PI * 2;
2930
const RADIAN = Math.PI / 180;
@@ -91,7 +92,9 @@ export default function pieLayout(
9192

9293
const { cx, cy, r, r0 } = getBasicPieLayout(seriesModel, api);
9394

94-
const startAngle = -seriesModel.get('startAngle') * RADIAN;
95+
let startAngle = -seriesModel.get('startAngle') * RADIAN;
96+
let endAngle = seriesModel.get('endAngle');
97+
endAngle = endAngle === 'auto' ? startAngle - PI2 : -endAngle * RADIAN;
9598

9699
const minAngle = seriesModel.get('minAngle') * RADIAN;
97100

@@ -113,12 +116,19 @@ export default function pieLayout(
113116
const extent = data.getDataExtent(valueDim);
114117
extent[0] = 0;
115118

119+
const dir = clockwise ? 1 : -1;
120+
const angles = [startAngle, endAngle];
121+
normalizeArcAngles(angles, !clockwise);
122+
123+
[startAngle, endAngle] = angles;
124+
125+
const angleRange = Math.abs(endAngle - startAngle);
126+
116127
// In the case some sector angle is smaller than minAngle
117-
let restAngle = PI2;
128+
let restAngle = angleRange;
118129
let valueSumLargerThanMinAngle = 0;
119130

120131
let currentAngle = startAngle;
121-
const dir = clockwise ? 1 : -1;
122132

123133
data.setLayout({ viewRect, r });
124134

@@ -146,7 +156,7 @@ export default function pieLayout(
146156
? unitRadian : (value * unitRadian);
147157
}
148158
else {
149-
angle = PI2 / validDataCount;
159+
angle = angleRange / validDataCount;
150160
}
151161

152162
if (angle < minAngle) {
@@ -180,7 +190,7 @@ export default function pieLayout(
180190
// Average the angle if rest angle is not enough after all angles is
181191
// Constrained by minAngle
182192
if (restAngle <= 1e-3) {
183-
const angle = PI2 / validDataCount;
193+
const angle = angleRange / validDataCount;
184194
data.each(valueDim, function (value: number, idx: number) {
185195
if (!isNaN(value)) {
186196
const layout = data.getItemLayout(idx);

test/pie-endAngle.html

Lines changed: 90 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/runTest/actions/__meta__.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/runTest/actions/pie-endAngle.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)