提交 c9a7935a 编写于 作者: L lang

Pie minAngle

上级 ef48aa35
......@@ -6,6 +6,9 @@ define(function (require) {
var parsePercent = numberUtil.parsePercent;
var labelLayout = require('./labelLayout');
var PI2 = Math.PI * 2;
var RADIAN = Math.PI / 180;
return function (seriesType, ecModel, api) {
ecModel.eachSeriesByType(seriesType, function (seriesModel) {
var center = seriesModel.get('center');
......@@ -21,13 +24,15 @@ define(function (require) {
var data = seriesModel.getData();
var startAngle = -seriesModel.get('startAngle') * Math.PI / 180;
var startAngle = -seriesModel.get('startAngle') * RADIAN;
var minAngle = seriesModel.get('minAngle') * RADIAN;
var sum = data.getSum('value');
if (sum === 0) {
sum = data.count();
}
var radianPerVal = Math.PI / sum * 2;
var unitRadian = Math.PI / sum * 2;
var clockWise = seriesModel.get('clockWise');
......@@ -37,11 +42,26 @@ define(function (require) {
var extent = data.getDataExtent('value');
extent[0] = 0;
// In the case some sector angle is smaller than minAngle
var restAngle = PI2;
var valueSumLargerThanMinAngle = 0;
var currentAngle = startAngle;
data.each('value', function (value, idx) {
var angle = sum === 0 ? radianPerVal : (value * radianPerVal);
var endAngle = startAngle + angle;
var angle = sum === 0 ? unitRadian : (value * unitRadian);
if (angle < minAngle) {
angle = minAngle;
restAngle -= minAngle;
}
else {
valueSumLargerThanMinAngle += value;
}
var endAngle = currentAngle + angle;
data.setItemLayout(idx, {
startAngle: startAngle,
angle: angle,
startAngle: currentAngle,
endAngle: endAngle,
clockwise: clockWise,
cx: cx,
......@@ -52,9 +72,36 @@ define(function (require) {
: r
});
startAngle = endAngle;
currentAngle = endAngle;
}, true);
// Some sector is constrained by minAngle
// Rest sectors needs recalculate angle
if (restAngle < PI2) {
// Average the angle if rest angle is not enough after all angles is
// Constrained by minAngle
if (restAngle <= 1e-3) {
var angle = PI2 / data.count();
data.each(function (idx) {
var layout = data.getItemLayout(idx);
layout.startAngle = idx * angle;
layout.endAngle = (idx + 1) * angle
})
}
else {
unitRadian = restAngle / valueSumLargerThanMinAngle;
currentAngle = startAngle;
data.each('value', function (value, idx) {
var layout = data.getItemLayout(idx);
var angle = layout.angle === minAngle
? minAngle : value * unitRadian;
layout.startAngle = currentAngle;
layout.endAngle = currentAngle + angle;
currentAngle += angle;
});
}
}
labelLayout(seriesModel, r, width, height);
});
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册