UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

139 lines (138 loc) 4.4 kB
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 };