| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- var _number = require("../../util/number");
- var parsePercent = _number.parsePercent;
- var linearMap = _number.linearMap;
- var labelLayout = require("./labelLayout");
- var zrUtil = require("zrender/lib/core/util");
- var PI2 = Math.PI * 2;
- var RADIAN = Math.PI / 180;
- function _default(seriesType, ecModel, api, payload) {
- ecModel.eachSeriesByType(seriesType, function (seriesModel) {
- var center = seriesModel.get('center');
- var radius = seriesModel.get('radius');
- if (!zrUtil.isArray(radius)) {
- radius = [0, radius];
- }
- if (!zrUtil.isArray(center)) {
- center = [center, center];
- }
- var width = api.getWidth();
- var height = api.getHeight();
- var size = Math.min(width, height);
- var cx = parsePercent(center[0], width);
- var cy = parsePercent(center[1], height);
- var r0 = parsePercent(radius[0], size / 2);
- var r = parsePercent(radius[1], size / 2);
- var data = seriesModel.getData();
- var startAngle = -seriesModel.get('startAngle') * RADIAN;
- var minAngle = seriesModel.get('minAngle') * RADIAN;
- var validDataCount = 0;
- data.each('value', function (value) {
- !isNaN(value) && validDataCount++;
- });
- var sum = data.getSum('value'); // Sum may be 0
- var unitRadian = Math.PI / (sum || validDataCount) * 2;
- var clockwise = seriesModel.get('clockwise');
- var roseType = seriesModel.get('roseType');
- var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max]
- 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;
- var dir = clockwise ? 1 : -1;
- data.each('value', function (value, idx) {
- var angle;
- if (isNaN(value)) {
- data.setItemLayout(idx, {
- angle: NaN,
- startAngle: NaN,
- endAngle: NaN,
- clockwise: clockwise,
- cx: cx,
- cy: cy,
- r0: r0,
- r: roseType ? NaN : r
- });
- return;
- } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样?
- 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: angle,
- startAngle: currentAngle,
- endAngle: endAngle,
- clockwise: clockwise,
- cx: cx,
- cy: cy,
- r0: r0,
- r: roseType ? linearMap(value, extent, [r0, r]) : r
- });
- currentAngle = endAngle;
- }, true); // Some sector is constrained by minAngle
- // Rest sectors needs recalculate angle
- if (restAngle < PI2 && validDataCount) {
- // Average the angle if rest angle is not enough after all angles is
- // Constrained by minAngle
- if (restAngle <= 1e-3) {
- var angle = PI2 / validDataCount;
- data.each('value', function (value, idx) {
- if (!isNaN(value)) {
- var layout = data.getItemLayout(idx);
- layout.angle = angle;
- layout.startAngle = startAngle + dir * idx * angle;
- layout.endAngle = startAngle + dir * (idx + 1) * angle;
- }
- });
- } else {
- unitRadian = restAngle / valueSumLargerThanMinAngle;
- currentAngle = startAngle;
- data.each('value', function (value, idx) {
- if (!isNaN(value)) {
- var layout = data.getItemLayout(idx);
- var angle = layout.angle === minAngle ? minAngle : value * unitRadian;
- layout.startAngle = currentAngle;
- layout.endAngle = currentAngle + dir * angle;
- currentAngle += dir * angle;
- }
- });
- }
- }
- labelLayout(seriesModel, r, width, height);
- });
- }
- module.exports = _default;
|