cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
139 lines (138 loc) • 4.4 kB
JavaScript
import { linearMap, parsePercent } from "../../util/number.mjs";
import { getLayoutRect } from "../../util/layout.mjs";
import { isArray } from "../../../../zrender/lib/core/util.mjs";
var PI2 = Math.PI * 2;
var RADIAN = Math.PI / 180;
function getViewRect(seriesModel, api) {
return getLayoutRect(seriesModel.getBoxLayoutParams(), {
width: api.getWidth(),
height: api.getHeight()
});
}
function getBasicPieLayout(seriesModel, api) {
var viewRect = getViewRect(seriesModel, api);
var center = seriesModel.get("center");
var radius = seriesModel.get("radius");
if (!isArray(radius)) {
radius = [0, radius];
}
var width = parsePercent(viewRect.width, api.getWidth());
var height = parsePercent(viewRect.height, api.getHeight());
var size = Math.min(width, height);
var r0 = parsePercent(radius[0], size / 2);
var r = parsePercent(radius[1], size / 2);
var cx;
var cy;
var coordSys = seriesModel.coordinateSystem;
if (coordSys) {
var point = coordSys.dataToPoint(center);
cx = point[0] || 0;
cy = point[1] || 0;
} else {
if (!isArray(center)) {
center = [center, center];
}
cx = parsePercent(center[0], width) + viewRect.x;
cy = parsePercent(center[1], height) + viewRect.y;
}
return {
cx,
cy,
r0,
r
};
}
function pieLayout(seriesType, ecModel, api) {
ecModel.eachSeriesByType(seriesType, function(seriesModel) {
var data = seriesModel.getData();
var valueDim = data.mapDimension("value");
var viewRect = getViewRect(seriesModel, api);
var _a = getBasicPieLayout(seriesModel, api), cx = _a.cx, cy = _a.cy, r = _a.r, r0 = _a.r0;
var startAngle = -seriesModel.get("startAngle") * RADIAN;
var minAngle = seriesModel.get("minAngle") * RADIAN;
var validDataCount = 0;
data.each(valueDim, function(value) {
!isNaN(value) && validDataCount++;
});
var sum = data.getSum(valueDim);
var unitRadian = Math.PI / (sum || validDataCount) * 2;
var clockwise = seriesModel.get("clockwise");
var roseType = seriesModel.get("roseType");
var stillShowZeroSum = seriesModel.get("stillShowZeroSum");
var extent = data.getDataExtent(valueDim);
extent[0] = 0;
var restAngle = PI2;
var valueSumLargerThanMinAngle = 0;
var currentAngle = startAngle;
var dir = clockwise ? 1 : -1;
data.setLayout({
viewRect,
r
});
data.each(valueDim, function(value, idx) {
var angle;
if (isNaN(value)) {
data.setItemLayout(idx, {
angle: NaN,
startAngle: NaN,
endAngle: NaN,
clockwise,
cx,
cy,
r0,
r: roseType ? NaN : r
});
return;
}
if (roseType !== "area") {
angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;
} else {
angle = PI2 / validDataCount;
}
if (angle < minAngle) {
angle = minAngle;
restAngle -= minAngle;
} else {
valueSumLargerThanMinAngle += value;
}
var endAngle = currentAngle + dir * angle;
data.setItemLayout(idx, {
angle,
startAngle: currentAngle,
endAngle,
clockwise,
cx,
cy,
r0,
r: roseType ? linearMap(value, extent, [r0, r]) : r
});
currentAngle = endAngle;
});
if (restAngle < PI2 && validDataCount) {
if (restAngle <= 1e-3) {
var angle_1 = PI2 / validDataCount;
data.each(valueDim, function(value, idx) {
if (!isNaN(value)) {
var layout_1 = data.getItemLayout(idx);
layout_1.angle = angle_1;
layout_1.startAngle = startAngle + dir * idx * angle_1;
layout_1.endAngle = startAngle + dir * (idx + 1) * angle_1;
}
});
} else {
unitRadian = restAngle / valueSumLargerThanMinAngle;
currentAngle = startAngle;
data.each(valueDim, function(value, idx) {
if (!isNaN(value)) {
var layout_2 = data.getItemLayout(idx);
var angle = layout_2.angle === minAngle ? minAngle : value * unitRadian;
layout_2.startAngle = currentAngle;
layout_2.endAngle = currentAngle + dir * angle;
currentAngle += dir * angle;
}
});
}
}
});
}
export { pieLayout as default, getBasicPieLayout };