pieLayout.js 3.8 KB
Newer Older
L
lang 已提交
1 2
// TODO minAngle

L
lang 已提交
3 4
define(function (require) {

L
lang 已提交
5 6 7 8
    var numberUtil = require('../../util/number');
    var parsePercent = numberUtil.parsePercent;
    var labelLayout = require('./labelLayout');

L
lang 已提交
9 10 11
    var PI2 = Math.PI * 2;
    var RADIAN = Math.PI / 180;

L
lang 已提交
12 13 14 15 16 17 18 19 20 21
    return function (seriesType, ecModel, api) {
        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
            var center = seriesModel.get('center');
            var radius = seriesModel.get('radius');

            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);
22 23
            var r0 = parsePercent(radius[0], size);
            var r = parsePercent(radius[1], size);
L
lang 已提交
24 25 26

            var data = seriesModel.getData();

L
lang 已提交
27 28 29
            var startAngle = -seriesModel.get('startAngle') * RADIAN;

            var minAngle = seriesModel.get('minAngle') * RADIAN;
L
lang 已提交
30

L
lang 已提交
31
            var sum = data.getSum('value');
L
lang 已提交
32 33 34
            if (sum === 0) {
                sum = data.count();
            }
L
lang 已提交
35
            var unitRadian = Math.PI / sum * 2;
L
lang 已提交
36 37 38

            var clockWise = seriesModel.get('clockWise');

L
lang 已提交
39 40 41 42 43 44
            var roseType = seriesModel.get('roseType');

            // [0...max]
            var extent = data.getDataExtent('value');
            extent[0] = 0;

L
lang 已提交
45 46 47 48 49
            // In the case some sector angle is smaller than minAngle
            var restAngle = PI2;
            var valueSumLargerThanMinAngle = 0;

            var currentAngle = startAngle;
L
lang 已提交
50
            data.each('value', function (value, idx) {
L
lang 已提交
51 52 53 54 55 56 57 58 59 60 61
                var angle = sum === 0 ? unitRadian : (value * unitRadian);

                if (angle < minAngle) {
                    angle = minAngle;
                    restAngle -= minAngle;
                }
                else {
                    valueSumLargerThanMinAngle += value;
                }

                var endAngle = currentAngle + angle;
L
lang 已提交
62
                data.setItemLayout(idx, {
L
lang 已提交
63 64
                    angle: angle,
                    startAngle: currentAngle,
L
lang 已提交
65 66 67 68 69
                    endAngle: endAngle,
                    clockwise: clockWise,
                    cx: cx,
                    cy: cy,
                    r0: r0,
L
lang 已提交
70 71 72
                    r: roseType
                        ? numberUtil.linearMap(value, extent, [r0, r])
                        : r
L
lang 已提交
73 74
                });

L
lang 已提交
75
                currentAngle = endAngle;
L
lang 已提交
76 77
            }, true);

L
lang 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
            // 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;
                    });
                }
            }

L
lang 已提交
105
            labelLayout(seriesModel, r, width, height);
L
lang 已提交
106 107
        });
    }
L
lang 已提交
108
});