|  | @@ -0,0 +1,942 @@
 | 
	
		
			
				|  |  | +define('echarts/chart/radar', [
 | 
	
		
			
				|  |  | +    'require',
 | 
	
		
			
				|  |  | +    './base',
 | 
	
		
			
				|  |  | +    'zrender/shape/Polygon',
 | 
	
		
			
				|  |  | +    '../component/polar',
 | 
	
		
			
				|  |  | +    '../config',
 | 
	
		
			
				|  |  | +    '../util/ecData',
 | 
	
		
			
				|  |  | +    'zrender/tool/util',
 | 
	
		
			
				|  |  | +    'zrender/tool/color',
 | 
	
		
			
				|  |  | +    '../util/accMath',
 | 
	
		
			
				|  |  | +    '../chart'
 | 
	
		
			
				|  |  | +], function (require) {
 | 
	
		
			
				|  |  | +    var ChartBase = require('./base');
 | 
	
		
			
				|  |  | +    var PolygonShape = require('zrender/shape/Polygon');
 | 
	
		
			
				|  |  | +    require('../component/polar');
 | 
	
		
			
				|  |  | +    var ecConfig = require('../config');
 | 
	
		
			
				|  |  | +    ecConfig.radar = {
 | 
	
		
			
				|  |  | +        zlevel: 0,
 | 
	
		
			
				|  |  | +        z: 2,
 | 
	
		
			
				|  |  | +        clickable: true,
 | 
	
		
			
				|  |  | +        legendHoverLink: true,
 | 
	
		
			
				|  |  | +        polarIndex: 0,
 | 
	
		
			
				|  |  | +        itemStyle: {
 | 
	
		
			
				|  |  | +            normal: {
 | 
	
		
			
				|  |  | +                label: { show: false },
 | 
	
		
			
				|  |  | +                lineStyle: {
 | 
	
		
			
				|  |  | +                    width: 2,
 | 
	
		
			
				|  |  | +                    type: 'solid'
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            emphasis: { label: { show: false } }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        symbolSize: 2
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    var ecData = require('../util/ecData');
 | 
	
		
			
				|  |  | +    var zrUtil = require('zrender/tool/util');
 | 
	
		
			
				|  |  | +    var zrColor = require('zrender/tool/color');
 | 
	
		
			
				|  |  | +    function Radar(ecTheme, messageCenter, zr, option, myChart) {
 | 
	
		
			
				|  |  | +        ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);
 | 
	
		
			
				|  |  | +        this.refresh(option);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    Radar.prototype = {
 | 
	
		
			
				|  |  | +        type: ecConfig.CHART_TYPE_RADAR,
 | 
	
		
			
				|  |  | +        _buildShape: function () {
 | 
	
		
			
				|  |  | +            this.selectedMap = {};
 | 
	
		
			
				|  |  | +            this._symbol = this.option.symbolList;
 | 
	
		
			
				|  |  | +            this._queryTarget;
 | 
	
		
			
				|  |  | +            this._dropBoxList = [];
 | 
	
		
			
				|  |  | +            this._radarDataCounter = 0;
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            var legend = this.component.legend;
 | 
	
		
			
				|  |  | +            var serieName;
 | 
	
		
			
				|  |  | +            for (var i = 0, l = series.length; i < l; i++) {
 | 
	
		
			
				|  |  | +                if (series[i].type === ecConfig.CHART_TYPE_RADAR) {
 | 
	
		
			
				|  |  | +                    this.serie = this.reformOption(series[i]);
 | 
	
		
			
				|  |  | +                    this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;
 | 
	
		
			
				|  |  | +                    serieName = this.serie.name || '';
 | 
	
		
			
				|  |  | +                    this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true;
 | 
	
		
			
				|  |  | +                    if (this.selectedMap[serieName]) {
 | 
	
		
			
				|  |  | +                        this._queryTarget = [
 | 
	
		
			
				|  |  | +                            this.serie,
 | 
	
		
			
				|  |  | +                            this.option
 | 
	
		
			
				|  |  | +                        ];
 | 
	
		
			
				|  |  | +                        if (this.deepQuery(this._queryTarget, 'calculable')) {
 | 
	
		
			
				|  |  | +                            this._addDropBox(i);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        this._buildSingleRadar(i);
 | 
	
		
			
				|  |  | +                        this.buildMark(i);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            this.addShapeList();
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _buildSingleRadar: function (index) {
 | 
	
		
			
				|  |  | +            var legend = this.component.legend;
 | 
	
		
			
				|  |  | +            var iconShape;
 | 
	
		
			
				|  |  | +            var data = this.serie.data;
 | 
	
		
			
				|  |  | +            var defaultColor;
 | 
	
		
			
				|  |  | +            var name;
 | 
	
		
			
				|  |  | +            var pointList;
 | 
	
		
			
				|  |  | +            var calculable = this.deepQuery(this._queryTarget, 'calculable');
 | 
	
		
			
				|  |  | +            for (var i = 0; i < data.length; i++) {
 | 
	
		
			
				|  |  | +                name = data[i].name || '';
 | 
	
		
			
				|  |  | +                this.selectedMap[name] = legend ? legend.isSelected(name) : true;
 | 
	
		
			
				|  |  | +                if (!this.selectedMap[name]) {
 | 
	
		
			
				|  |  | +                    continue;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (legend) {
 | 
	
		
			
				|  |  | +                    defaultColor = legend.getColor(name);
 | 
	
		
			
				|  |  | +                    iconShape = legend.getItemShape(name);
 | 
	
		
			
				|  |  | +                    if (iconShape) {
 | 
	
		
			
				|  |  | +                        iconShape.style.brushType = this.deepQuery([
 | 
	
		
			
				|  |  | +                            data[i],
 | 
	
		
			
				|  |  | +                            this.serie
 | 
	
		
			
				|  |  | +                        ], 'itemStyle.normal.areaStyle') ? 'both' : 'stroke';
 | 
	
		
			
				|  |  | +                        legend.setItemShape(name, iconShape);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    defaultColor = this.zr.getColor(i);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                pointList = this._getPointList(this.serie.polarIndex, data[i]);
 | 
	
		
			
				|  |  | +                this._addSymbol(pointList, defaultColor, i, index, this.serie.polarIndex);
 | 
	
		
			
				|  |  | +                this._addDataShape(pointList, defaultColor, data[i], index, i, calculable);
 | 
	
		
			
				|  |  | +                this._radarDataCounter++;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getPointList: function (polarIndex, dataArr) {
 | 
	
		
			
				|  |  | +            var pointList = [];
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var polar = this.component.polar;
 | 
	
		
			
				|  |  | +            var value;
 | 
	
		
			
				|  |  | +            for (var i = 0, l = dataArr.value.length; i < l; i++) {
 | 
	
		
			
				|  |  | +                value = this.getDataFromOption(dataArr.value[i]);
 | 
	
		
			
				|  |  | +                vector = value != '-' ? polar.getVector(polarIndex, i, value) : false;
 | 
	
		
			
				|  |  | +                if (vector) {
 | 
	
		
			
				|  |  | +                    pointList.push(vector);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return pointList;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addSymbol: function (pointList, defaultColor, dataIndex, seriesIndex, polarIndex) {
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            var itemShape;
 | 
	
		
			
				|  |  | +            var polar = this.component.polar;
 | 
	
		
			
				|  |  | +            for (var i = 0, l = pointList.length; i < l; i++) {
 | 
	
		
			
				|  |  | +                itemShape = this.getSymbolShape(this.deepMerge([
 | 
	
		
			
				|  |  | +                    series[seriesIndex].data[dataIndex],
 | 
	
		
			
				|  |  | +                    series[seriesIndex]
 | 
	
		
			
				|  |  | +                ]), seriesIndex, series[seriesIndex].data[dataIndex].value[i], i, polar.getIndicatorText(polarIndex, i), pointList[i][0], pointList[i][1], this._symbol[this._radarDataCounter % this._symbol.length], defaultColor, '#fff', 'vertical');
 | 
	
		
			
				|  |  | +                itemShape.zlevel = this.getZlevelBase();
 | 
	
		
			
				|  |  | +                itemShape.z = this.getZBase() + 1;
 | 
	
		
			
				|  |  | +                ecData.set(itemShape, 'data', series[seriesIndex].data[dataIndex]);
 | 
	
		
			
				|  |  | +                ecData.set(itemShape, 'value', series[seriesIndex].data[dataIndex].value);
 | 
	
		
			
				|  |  | +                ecData.set(itemShape, 'dataIndex', dataIndex);
 | 
	
		
			
				|  |  | +                ecData.set(itemShape, 'special', i);
 | 
	
		
			
				|  |  | +                this.shapeList.push(itemShape);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addDataShape: function (pointList, defaultColor, data, seriesIndex, dataIndex, calculable) {
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            var queryTarget = [
 | 
	
		
			
				|  |  | +                data,
 | 
	
		
			
				|  |  | +                this.serie
 | 
	
		
			
				|  |  | +            ];
 | 
	
		
			
				|  |  | +            var nColor = this.getItemStyleColor(this.deepQuery(queryTarget, 'itemStyle.normal.color'), seriesIndex, dataIndex, data);
 | 
	
		
			
				|  |  | +            var nLineWidth = this.deepQuery(queryTarget, 'itemStyle.normal.lineStyle.width');
 | 
	
		
			
				|  |  | +            var nLineType = this.deepQuery(queryTarget, 'itemStyle.normal.lineStyle.type');
 | 
	
		
			
				|  |  | +            var nAreaColor = this.deepQuery(queryTarget, 'itemStyle.normal.areaStyle.color');
 | 
	
		
			
				|  |  | +            var nIsAreaFill = this.deepQuery(queryTarget, 'itemStyle.normal.areaStyle');
 | 
	
		
			
				|  |  | +            var shape = {
 | 
	
		
			
				|  |  | +                zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                z: this.getZBase(),
 | 
	
		
			
				|  |  | +                style: {
 | 
	
		
			
				|  |  | +                    pointList: pointList,
 | 
	
		
			
				|  |  | +                    brushType: nIsAreaFill ? 'both' : 'stroke',
 | 
	
		
			
				|  |  | +                    color: nAreaColor || nColor || (typeof defaultColor === 'string' ? zrColor.alpha(defaultColor, 0.5) : defaultColor),
 | 
	
		
			
				|  |  | +                    strokeColor: nColor || defaultColor,
 | 
	
		
			
				|  |  | +                    lineWidth: nLineWidth,
 | 
	
		
			
				|  |  | +                    lineType: nLineType
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                highlightStyle: {
 | 
	
		
			
				|  |  | +                    brushType: this.deepQuery(queryTarget, 'itemStyle.emphasis.areaStyle') || nIsAreaFill ? 'both' : 'stroke',
 | 
	
		
			
				|  |  | +                    color: this.deepQuery(queryTarget, 'itemStyle.emphasis.areaStyle.color') || nAreaColor || nColor || (typeof defaultColor === 'string' ? zrColor.alpha(defaultColor, 0.5) : defaultColor),
 | 
	
		
			
				|  |  | +                    strokeColor: this.getItemStyleColor(this.deepQuery(queryTarget, 'itemStyle.emphasis.color'), seriesIndex, dataIndex, data) || nColor || defaultColor,
 | 
	
		
			
				|  |  | +                    lineWidth: this.deepQuery(queryTarget, 'itemStyle.emphasis.lineStyle.width') || nLineWidth,
 | 
	
		
			
				|  |  | +                    lineType: this.deepQuery(queryTarget, 'itemStyle.emphasis.lineStyle.type') || nLineType
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            ecData.pack(shape, series[seriesIndex], seriesIndex, data, dataIndex, data.name, this.component.polar.getIndicator(series[seriesIndex].polarIndex));
 | 
	
		
			
				|  |  | +            if (calculable) {
 | 
	
		
			
				|  |  | +                shape.draggable = true;
 | 
	
		
			
				|  |  | +                this.setCalculable(shape);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            shape = new PolygonShape(shape);
 | 
	
		
			
				|  |  | +            this.shapeList.push(shape);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addDropBox: function (index) {
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            var polarIndex = this.deepQuery(this._queryTarget, 'polarIndex');
 | 
	
		
			
				|  |  | +            if (!this._dropBoxList[polarIndex]) {
 | 
	
		
			
				|  |  | +                var shape = this.component.polar.getDropBox(polarIndex);
 | 
	
		
			
				|  |  | +                shape.zlevel = this.getZlevelBase();
 | 
	
		
			
				|  |  | +                shape.z = this.getZBase();
 | 
	
		
			
				|  |  | +                this.setCalculable(shape);
 | 
	
		
			
				|  |  | +                ecData.pack(shape, series, index, undefined, -1);
 | 
	
		
			
				|  |  | +                this.shapeList.push(shape);
 | 
	
		
			
				|  |  | +                this._dropBoxList[polarIndex] = true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        ondragend: function (param, status) {
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            if (!this.isDragend || !param.target) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            var target = param.target;
 | 
	
		
			
				|  |  | +            var seriesIndex = ecData.get(target, 'seriesIndex');
 | 
	
		
			
				|  |  | +            var dataIndex = ecData.get(target, 'dataIndex');
 | 
	
		
			
				|  |  | +            this.component.legend && this.component.legend.del(series[seriesIndex].data[dataIndex].name);
 | 
	
		
			
				|  |  | +            series[seriesIndex].data.splice(dataIndex, 1);
 | 
	
		
			
				|  |  | +            status.dragOut = true;
 | 
	
		
			
				|  |  | +            status.needRefresh = true;
 | 
	
		
			
				|  |  | +            this.isDragend = false;
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        ondrop: function (param, status) {
 | 
	
		
			
				|  |  | +            var series = this.series;
 | 
	
		
			
				|  |  | +            if (!this.isDrop || !param.target) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            var target = param.target;
 | 
	
		
			
				|  |  | +            var dragged = param.dragged;
 | 
	
		
			
				|  |  | +            var seriesIndex = ecData.get(target, 'seriesIndex');
 | 
	
		
			
				|  |  | +            var dataIndex = ecData.get(target, 'dataIndex');
 | 
	
		
			
				|  |  | +            var data;
 | 
	
		
			
				|  |  | +            var legend = this.component.legend;
 | 
	
		
			
				|  |  | +            var value;
 | 
	
		
			
				|  |  | +            if (dataIndex === -1) {
 | 
	
		
			
				|  |  | +                data = {
 | 
	
		
			
				|  |  | +                    value: ecData.get(dragged, 'value'),
 | 
	
		
			
				|  |  | +                    name: ecData.get(dragged, 'name')
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                series[seriesIndex].data.push(data);
 | 
	
		
			
				|  |  | +                legend && legend.add(data.name, dragged.style.color || dragged.style.strokeColor);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                var accMath = require('../util/accMath');
 | 
	
		
			
				|  |  | +                data = series[seriesIndex].data[dataIndex];
 | 
	
		
			
				|  |  | +                legend && legend.del(data.name);
 | 
	
		
			
				|  |  | +                data.name += this.option.nameConnector + ecData.get(dragged, 'name');
 | 
	
		
			
				|  |  | +                value = ecData.get(dragged, 'value');
 | 
	
		
			
				|  |  | +                for (var i = 0; i < value.length; i++) {
 | 
	
		
			
				|  |  | +                    data.value[i] = accMath.accAdd(data.value[i], value[i]);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                legend && legend.add(data.name, dragged.style.color || dragged.style.strokeColor);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            status.dragIn = status.dragIn || true;
 | 
	
		
			
				|  |  | +            this.isDrop = false;
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        refresh: function (newOption) {
 | 
	
		
			
				|  |  | +            if (newOption) {
 | 
	
		
			
				|  |  | +                this.option = newOption;
 | 
	
		
			
				|  |  | +                this.series = newOption.series;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            this.backupShapeList();
 | 
	
		
			
				|  |  | +            this._buildShape();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    zrUtil.inherits(Radar, ChartBase);
 | 
	
		
			
				|  |  | +    require('../chart').define('radar', Radar);
 | 
	
		
			
				|  |  | +    return Radar;
 | 
	
		
			
				|  |  | +});define('echarts/component/polar', [
 | 
	
		
			
				|  |  | +    'require',
 | 
	
		
			
				|  |  | +    './base',
 | 
	
		
			
				|  |  | +    'zrender/shape/Text',
 | 
	
		
			
				|  |  | +    'zrender/shape/Line',
 | 
	
		
			
				|  |  | +    'zrender/shape/Polygon',
 | 
	
		
			
				|  |  | +    'zrender/shape/Circle',
 | 
	
		
			
				|  |  | +    'zrender/shape/Ring',
 | 
	
		
			
				|  |  | +    '../config',
 | 
	
		
			
				|  |  | +    'zrender/tool/util',
 | 
	
		
			
				|  |  | +    '../util/coordinates',
 | 
	
		
			
				|  |  | +    '../util/accMath',
 | 
	
		
			
				|  |  | +    '../util/smartSteps',
 | 
	
		
			
				|  |  | +    '../component'
 | 
	
		
			
				|  |  | +], function (require) {
 | 
	
		
			
				|  |  | +    var Base = require('./base');
 | 
	
		
			
				|  |  | +    var TextShape = require('zrender/shape/Text');
 | 
	
		
			
				|  |  | +    var LineShape = require('zrender/shape/Line');
 | 
	
		
			
				|  |  | +    var PolygonShape = require('zrender/shape/Polygon');
 | 
	
		
			
				|  |  | +    var Circle = require('zrender/shape/Circle');
 | 
	
		
			
				|  |  | +    var Ring = require('zrender/shape/Ring');
 | 
	
		
			
				|  |  | +    var ecConfig = require('../config');
 | 
	
		
			
				|  |  | +    ecConfig.polar = {
 | 
	
		
			
				|  |  | +        zlevel: 0,
 | 
	
		
			
				|  |  | +        z: 0,
 | 
	
		
			
				|  |  | +        center: [
 | 
	
		
			
				|  |  | +            '50%',
 | 
	
		
			
				|  |  | +            '50%'
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +        radius: '75%',
 | 
	
		
			
				|  |  | +        startAngle: 90,
 | 
	
		
			
				|  |  | +        boundaryGap: [
 | 
	
		
			
				|  |  | +            0,
 | 
	
		
			
				|  |  | +            0
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +        splitNumber: 5,
 | 
	
		
			
				|  |  | +        name: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            textStyle: { color: '#333' }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        axisLine: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            lineStyle: {
 | 
	
		
			
				|  |  | +                color: '#ccc',
 | 
	
		
			
				|  |  | +                width: 1,
 | 
	
		
			
				|  |  | +                type: 'solid'
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        axisLabel: {
 | 
	
		
			
				|  |  | +            show: false,
 | 
	
		
			
				|  |  | +            textStyle: { color: '#333' }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        splitArea: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            areaStyle: {
 | 
	
		
			
				|  |  | +                color: [
 | 
	
		
			
				|  |  | +                    'rgba(250,250,250,0.3)',
 | 
	
		
			
				|  |  | +                    'rgba(200,200,200,0.3)'
 | 
	
		
			
				|  |  | +                ]
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        splitLine: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            lineStyle: {
 | 
	
		
			
				|  |  | +                width: 1,
 | 
	
		
			
				|  |  | +                color: '#ccc'
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        type: 'polygon'
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    var zrUtil = require('zrender/tool/util');
 | 
	
		
			
				|  |  | +    var ecCoordinates = require('../util/coordinates');
 | 
	
		
			
				|  |  | +    function Polar(ecTheme, messageCenter, zr, option, myChart) {
 | 
	
		
			
				|  |  | +        Base.call(this, ecTheme, messageCenter, zr, option, myChart);
 | 
	
		
			
				|  |  | +        this.refresh(option);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    Polar.prototype = {
 | 
	
		
			
				|  |  | +        type: ecConfig.COMPONENT_TYPE_POLAR,
 | 
	
		
			
				|  |  | +        _buildShape: function () {
 | 
	
		
			
				|  |  | +            for (var i = 0; i < this.polar.length; i++) {
 | 
	
		
			
				|  |  | +                this._index = i;
 | 
	
		
			
				|  |  | +                this.reformOption(this.polar[i]);
 | 
	
		
			
				|  |  | +                this._queryTarget = [
 | 
	
		
			
				|  |  | +                    this.polar[i],
 | 
	
		
			
				|  |  | +                    this.option
 | 
	
		
			
				|  |  | +                ];
 | 
	
		
			
				|  |  | +                this._createVector(i);
 | 
	
		
			
				|  |  | +                this._buildSpiderWeb(i);
 | 
	
		
			
				|  |  | +                this._buildText(i);
 | 
	
		
			
				|  |  | +                this._adjustIndicatorValue(i);
 | 
	
		
			
				|  |  | +                this._addAxisLabel(i);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            for (var i = 0; i < this.shapeList.length; i++) {
 | 
	
		
			
				|  |  | +                this.zr.addShape(this.shapeList[i]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _createVector: function (index) {
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var indicator = this.deepQuery(this._queryTarget, 'indicator');
 | 
	
		
			
				|  |  | +            var length = indicator.length;
 | 
	
		
			
				|  |  | +            var startAngle = item.startAngle;
 | 
	
		
			
				|  |  | +            var dStep = 2 * Math.PI / length;
 | 
	
		
			
				|  |  | +            var radius = this._getRadius();
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator = [];
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < length; i++) {
 | 
	
		
			
				|  |  | +                vector = ecCoordinates.polar2cartesian(radius, startAngle * Math.PI / 180 + dStep * i);
 | 
	
		
			
				|  |  | +                __ecIndicator.push({
 | 
	
		
			
				|  |  | +                    vector: [
 | 
	
		
			
				|  |  | +                        vector[1],
 | 
	
		
			
				|  |  | +                        -vector[0]
 | 
	
		
			
				|  |  | +                    ]
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getRadius: function () {
 | 
	
		
			
				|  |  | +            var item = this.polar[this._index];
 | 
	
		
			
				|  |  | +            return this.parsePercent(item.radius, Math.min(this.zr.getWidth(), this.zr.getHeight()) / 2);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _buildSpiderWeb: function (index) {
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator;
 | 
	
		
			
				|  |  | +            var splitArea = item.splitArea;
 | 
	
		
			
				|  |  | +            var splitLine = item.splitLine;
 | 
	
		
			
				|  |  | +            var center = this.getCenter(index);
 | 
	
		
			
				|  |  | +            var splitNumber = item.splitNumber;
 | 
	
		
			
				|  |  | +            var strokeColor = splitLine.lineStyle.color;
 | 
	
		
			
				|  |  | +            var lineWidth = splitLine.lineStyle.width;
 | 
	
		
			
				|  |  | +            var show = splitLine.show;
 | 
	
		
			
				|  |  | +            var axisLine = this.deepQuery(this._queryTarget, 'axisLine');
 | 
	
		
			
				|  |  | +            this._addArea(__ecIndicator, splitNumber, center, splitArea, strokeColor, lineWidth, show);
 | 
	
		
			
				|  |  | +            axisLine.show && this._addLine(__ecIndicator, center, axisLine);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addAxisLabel: function (index) {
 | 
	
		
			
				|  |  | +            var accMath = require('../util/accMath');
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var indicator = this.deepQuery(this._queryTarget, 'indicator');
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator;
 | 
	
		
			
				|  |  | +            var axisLabel;
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var style;
 | 
	
		
			
				|  |  | +            var newStyle;
 | 
	
		
			
				|  |  | +            var splitNumber = this.deepQuery(this._queryTarget, 'splitNumber');
 | 
	
		
			
				|  |  | +            var center = this.getCenter(index);
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var value;
 | 
	
		
			
				|  |  | +            var text;
 | 
	
		
			
				|  |  | +            var theta;
 | 
	
		
			
				|  |  | +            var offset;
 | 
	
		
			
				|  |  | +            var interval;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < indicator.length; i++) {
 | 
	
		
			
				|  |  | +                axisLabel = this.deepQuery([
 | 
	
		
			
				|  |  | +                    indicator[i],
 | 
	
		
			
				|  |  | +                    item,
 | 
	
		
			
				|  |  | +                    this.option
 | 
	
		
			
				|  |  | +                ], 'axisLabel');
 | 
	
		
			
				|  |  | +                if (axisLabel.show) {
 | 
	
		
			
				|  |  | +                    var textStyle = this.deepQuery([
 | 
	
		
			
				|  |  | +                        axisLabel,
 | 
	
		
			
				|  |  | +                        item,
 | 
	
		
			
				|  |  | +                        this.option
 | 
	
		
			
				|  |  | +                    ], 'textStyle');
 | 
	
		
			
				|  |  | +                    var formatter = this.deepQuery([
 | 
	
		
			
				|  |  | +                        axisLabel,
 | 
	
		
			
				|  |  | +                        item
 | 
	
		
			
				|  |  | +                    ], 'formatter');
 | 
	
		
			
				|  |  | +                    style = {};
 | 
	
		
			
				|  |  | +                    style.textFont = this.getFont(textStyle);
 | 
	
		
			
				|  |  | +                    style.color = textStyle.color;
 | 
	
		
			
				|  |  | +                    style = zrUtil.merge(style, axisLabel);
 | 
	
		
			
				|  |  | +                    style.lineWidth = style.width;
 | 
	
		
			
				|  |  | +                    vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                    value = __ecIndicator[i].value;
 | 
	
		
			
				|  |  | +                    theta = i / indicator.length * 2 * Math.PI;
 | 
	
		
			
				|  |  | +                    offset = axisLabel.offset || 10;
 | 
	
		
			
				|  |  | +                    interval = axisLabel.interval || 0;
 | 
	
		
			
				|  |  | +                    if (!value) {
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    for (var j = 1; j <= splitNumber; j += interval + 1) {
 | 
	
		
			
				|  |  | +                        newStyle = zrUtil.merge({}, style);
 | 
	
		
			
				|  |  | +                        text = accMath.accAdd(value.min, accMath.accMul(value.step, j));
 | 
	
		
			
				|  |  | +                        if (typeof formatter === 'function') {
 | 
	
		
			
				|  |  | +                            text = formatter(text);
 | 
	
		
			
				|  |  | +                        } else if (typeof formatter === 'string') {
 | 
	
		
			
				|  |  | +                            text = formatter.replace('{a}', '{a0}').replace('{a0}', text);
 | 
	
		
			
				|  |  | +                        } else {
 | 
	
		
			
				|  |  | +                            text = this.numAddCommas(text);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        newStyle.text = text;
 | 
	
		
			
				|  |  | +                        newStyle.x = j * vector[0] / splitNumber + Math.cos(theta) * offset + center[0];
 | 
	
		
			
				|  |  | +                        newStyle.y = j * vector[1] / splitNumber + Math.sin(theta) * offset + center[1];
 | 
	
		
			
				|  |  | +                        this.shapeList.push(new TextShape({
 | 
	
		
			
				|  |  | +                            zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                            z: this.getZBase(),
 | 
	
		
			
				|  |  | +                            style: newStyle,
 | 
	
		
			
				|  |  | +                            draggable: false,
 | 
	
		
			
				|  |  | +                            hoverable: false
 | 
	
		
			
				|  |  | +                        }));
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _buildText: function (index) {
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator;
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var indicator = this.deepQuery(this._queryTarget, 'indicator');
 | 
	
		
			
				|  |  | +            var center = this.getCenter(index);
 | 
	
		
			
				|  |  | +            var style;
 | 
	
		
			
				|  |  | +            var textAlign;
 | 
	
		
			
				|  |  | +            var name;
 | 
	
		
			
				|  |  | +            var rotation;
 | 
	
		
			
				|  |  | +            var x = 0;
 | 
	
		
			
				|  |  | +            var y = 0;
 | 
	
		
			
				|  |  | +            var margin;
 | 
	
		
			
				|  |  | +            var textStyle;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < indicator.length; i++) {
 | 
	
		
			
				|  |  | +                name = this.deepQuery([
 | 
	
		
			
				|  |  | +                    indicator[i],
 | 
	
		
			
				|  |  | +                    item,
 | 
	
		
			
				|  |  | +                    this.option
 | 
	
		
			
				|  |  | +                ], 'name');
 | 
	
		
			
				|  |  | +                if (!name.show) {
 | 
	
		
			
				|  |  | +                    continue;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                textStyle = this.deepQuery([
 | 
	
		
			
				|  |  | +                    name,
 | 
	
		
			
				|  |  | +                    item,
 | 
	
		
			
				|  |  | +                    this.option
 | 
	
		
			
				|  |  | +                ], 'textStyle');
 | 
	
		
			
				|  |  | +                style = {};
 | 
	
		
			
				|  |  | +                style.textFont = this.getFont(textStyle);
 | 
	
		
			
				|  |  | +                style.color = textStyle.color;
 | 
	
		
			
				|  |  | +                if (typeof name.formatter == 'function') {
 | 
	
		
			
				|  |  | +                    style.text = name.formatter.call(this.myChart, indicator[i].text, i);
 | 
	
		
			
				|  |  | +                } else if (typeof name.formatter == 'string') {
 | 
	
		
			
				|  |  | +                    style.text = name.formatter.replace('{value}', indicator[i].text);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    style.text = indicator[i].text;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                __ecIndicator[i].text = style.text;
 | 
	
		
			
				|  |  | +                vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                if (Math.round(vector[0]) > 0) {
 | 
	
		
			
				|  |  | +                    textAlign = 'left';
 | 
	
		
			
				|  |  | +                } else if (Math.round(vector[0]) < 0) {
 | 
	
		
			
				|  |  | +                    textAlign = 'right';
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    textAlign = 'center';
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (name.margin == null) {
 | 
	
		
			
				|  |  | +                    vector = this._mapVector(vector, center, 1.1);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    margin = name.margin;
 | 
	
		
			
				|  |  | +                    x = vector[0] > 0 ? margin : -margin;
 | 
	
		
			
				|  |  | +                    y = vector[1] > 0 ? margin : -margin;
 | 
	
		
			
				|  |  | +                    x = vector[0] === 0 ? 0 : x;
 | 
	
		
			
				|  |  | +                    y = vector[1] === 0 ? 0 : y;
 | 
	
		
			
				|  |  | +                    vector = this._mapVector(vector, center, 1);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                style.textAlign = textAlign;
 | 
	
		
			
				|  |  | +                style.x = vector[0] + x;
 | 
	
		
			
				|  |  | +                style.y = vector[1] + y;
 | 
	
		
			
				|  |  | +                if (name.rotate) {
 | 
	
		
			
				|  |  | +                    rotation = [
 | 
	
		
			
				|  |  | +                        name.rotate / 180 * Math.PI,
 | 
	
		
			
				|  |  | +                        vector[0],
 | 
	
		
			
				|  |  | +                        vector[1]
 | 
	
		
			
				|  |  | +                    ];
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    rotation = [
 | 
	
		
			
				|  |  | +                        0,
 | 
	
		
			
				|  |  | +                        0,
 | 
	
		
			
				|  |  | +                        0
 | 
	
		
			
				|  |  | +                    ];
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                this.shapeList.push(new TextShape({
 | 
	
		
			
				|  |  | +                    zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                    z: this.getZBase(),
 | 
	
		
			
				|  |  | +                    style: style,
 | 
	
		
			
				|  |  | +                    draggable: false,
 | 
	
		
			
				|  |  | +                    hoverable: false,
 | 
	
		
			
				|  |  | +                    rotation: rotation
 | 
	
		
			
				|  |  | +                }));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getIndicatorText: function (polarIndex, indicatorIndex) {
 | 
	
		
			
				|  |  | +            return this.polar[polarIndex] && this.polar[polarIndex].__ecIndicator[indicatorIndex] && this.polar[polarIndex].__ecIndicator[indicatorIndex].text;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getDropBox: function (index) {
 | 
	
		
			
				|  |  | +            var index = index || 0;
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var center = this.getCenter(index);
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator;
 | 
	
		
			
				|  |  | +            var len = __ecIndicator.length;
 | 
	
		
			
				|  |  | +            var pointList = [];
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var shape;
 | 
	
		
			
				|  |  | +            var type = item.type;
 | 
	
		
			
				|  |  | +            if (type == 'polygon') {
 | 
	
		
			
				|  |  | +                for (var i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | +                    vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                    pointList.push(this._mapVector(vector, center, 1.2));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                shape = this._getShape(pointList, 'fill', 'rgba(0,0,0,0)', '', 1);
 | 
	
		
			
				|  |  | +            } else if (type == 'circle') {
 | 
	
		
			
				|  |  | +                shape = this._getCircle('', 1, 1.2, center, 'fill', 'rgba(0,0,0,0)');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return shape;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addArea: function (__ecIndicator, splitNumber, center, splitArea, strokeColor, lineWidth, show) {
 | 
	
		
			
				|  |  | +            var shape;
 | 
	
		
			
				|  |  | +            var scale;
 | 
	
		
			
				|  |  | +            var scale1;
 | 
	
		
			
				|  |  | +            var pointList;
 | 
	
		
			
				|  |  | +            var type = this.deepQuery(this._queryTarget, 'type');
 | 
	
		
			
				|  |  | +            for (var i = 0; i < splitNumber; i++) {
 | 
	
		
			
				|  |  | +                scale = (splitNumber - i) / splitNumber;
 | 
	
		
			
				|  |  | +                if (show) {
 | 
	
		
			
				|  |  | +                    if (type == 'polygon') {
 | 
	
		
			
				|  |  | +                        pointList = this._getPointList(__ecIndicator, scale, center);
 | 
	
		
			
				|  |  | +                        shape = this._getShape(pointList, 'stroke', '', strokeColor, lineWidth);
 | 
	
		
			
				|  |  | +                    } else if (type == 'circle') {
 | 
	
		
			
				|  |  | +                        shape = this._getCircle(strokeColor, lineWidth, scale, center, 'stroke');
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    this.shapeList.push(shape);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (splitArea.show) {
 | 
	
		
			
				|  |  | +                    scale1 = (splitNumber - i - 1) / splitNumber;
 | 
	
		
			
				|  |  | +                    this._addSplitArea(__ecIndicator, splitArea, scale, scale1, center, i);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getCircle: function (strokeColor, lineWidth, scale, center, brushType, color) {
 | 
	
		
			
				|  |  | +            var radius = this._getRadius();
 | 
	
		
			
				|  |  | +            return new Circle({
 | 
	
		
			
				|  |  | +                zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                z: this.getZBase(),
 | 
	
		
			
				|  |  | +                style: {
 | 
	
		
			
				|  |  | +                    x: center[0],
 | 
	
		
			
				|  |  | +                    y: center[1],
 | 
	
		
			
				|  |  | +                    r: radius * scale,
 | 
	
		
			
				|  |  | +                    brushType: brushType,
 | 
	
		
			
				|  |  | +                    strokeColor: strokeColor,
 | 
	
		
			
				|  |  | +                    lineWidth: lineWidth,
 | 
	
		
			
				|  |  | +                    color: color
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                hoverable: false,
 | 
	
		
			
				|  |  | +                draggable: false
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getRing: function (color, scale0, scale1, center) {
 | 
	
		
			
				|  |  | +            var radius = this._getRadius();
 | 
	
		
			
				|  |  | +            return new Ring({
 | 
	
		
			
				|  |  | +                zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                z: this.getZBase(),
 | 
	
		
			
				|  |  | +                style: {
 | 
	
		
			
				|  |  | +                    x: center[0],
 | 
	
		
			
				|  |  | +                    y: center[1],
 | 
	
		
			
				|  |  | +                    r: scale0 * radius,
 | 
	
		
			
				|  |  | +                    r0: scale1 * radius,
 | 
	
		
			
				|  |  | +                    color: color,
 | 
	
		
			
				|  |  | +                    brushType: 'fill'
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                hoverable: false,
 | 
	
		
			
				|  |  | +                draggable: false
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getPointList: function (__ecIndicator, scale, center) {
 | 
	
		
			
				|  |  | +            var pointList = [];
 | 
	
		
			
				|  |  | +            var len = __ecIndicator.length;
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | +                vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                pointList.push(this._mapVector(vector, center, scale));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return pointList;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getShape: function (pointList, brushType, color, strokeColor, lineWidth) {
 | 
	
		
			
				|  |  | +            return new PolygonShape({
 | 
	
		
			
				|  |  | +                zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                z: this.getZBase(),
 | 
	
		
			
				|  |  | +                style: {
 | 
	
		
			
				|  |  | +                    pointList: pointList,
 | 
	
		
			
				|  |  | +                    brushType: brushType,
 | 
	
		
			
				|  |  | +                    color: color,
 | 
	
		
			
				|  |  | +                    strokeColor: strokeColor,
 | 
	
		
			
				|  |  | +                    lineWidth: lineWidth
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                hoverable: false,
 | 
	
		
			
				|  |  | +                draggable: false
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addSplitArea: function (__ecIndicator, splitArea, scale, scale1, center, colorInd) {
 | 
	
		
			
				|  |  | +            var indLen = __ecIndicator.length;
 | 
	
		
			
				|  |  | +            var color;
 | 
	
		
			
				|  |  | +            var colorArr = splitArea.areaStyle.color;
 | 
	
		
			
				|  |  | +            var colorLen;
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var vector1;
 | 
	
		
			
				|  |  | +            var pointList = [];
 | 
	
		
			
				|  |  | +            var indLen = __ecIndicator.length;
 | 
	
		
			
				|  |  | +            var shape;
 | 
	
		
			
				|  |  | +            var type = this.deepQuery(this._queryTarget, 'type');
 | 
	
		
			
				|  |  | +            if (typeof colorArr == 'string') {
 | 
	
		
			
				|  |  | +                colorArr = [colorArr];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            colorLen = colorArr.length;
 | 
	
		
			
				|  |  | +            color = colorArr[colorInd % colorLen];
 | 
	
		
			
				|  |  | +            if (type == 'polygon') {
 | 
	
		
			
				|  |  | +                for (var i = 0; i < indLen; i++) {
 | 
	
		
			
				|  |  | +                    pointList = [];
 | 
	
		
			
				|  |  | +                    vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                    vector1 = __ecIndicator[(i + 1) % indLen].vector;
 | 
	
		
			
				|  |  | +                    pointList.push(this._mapVector(vector, center, scale));
 | 
	
		
			
				|  |  | +                    pointList.push(this._mapVector(vector, center, scale1));
 | 
	
		
			
				|  |  | +                    pointList.push(this._mapVector(vector1, center, scale1));
 | 
	
		
			
				|  |  | +                    pointList.push(this._mapVector(vector1, center, scale));
 | 
	
		
			
				|  |  | +                    shape = this._getShape(pointList, 'fill', color, '', 1);
 | 
	
		
			
				|  |  | +                    this.shapeList.push(shape);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else if (type == 'circle') {
 | 
	
		
			
				|  |  | +                shape = this._getRing(color, scale, scale1, center);
 | 
	
		
			
				|  |  | +                this.shapeList.push(shape);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _mapVector: function (vector, center, scale) {
 | 
	
		
			
				|  |  | +            return [
 | 
	
		
			
				|  |  | +                vector[0] * scale + center[0],
 | 
	
		
			
				|  |  | +                vector[1] * scale + center[1]
 | 
	
		
			
				|  |  | +            ];
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getCenter: function (index) {
 | 
	
		
			
				|  |  | +            var index = index || 0;
 | 
	
		
			
				|  |  | +            return this.parseCenter(this.zr, this.polar[index].center);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _addLine: function (__ecIndicator, center, axisLine) {
 | 
	
		
			
				|  |  | +            var indLen = __ecIndicator.length;
 | 
	
		
			
				|  |  | +            var line;
 | 
	
		
			
				|  |  | +            var vector;
 | 
	
		
			
				|  |  | +            var lineStyle = axisLine.lineStyle;
 | 
	
		
			
				|  |  | +            var strokeColor = lineStyle.color;
 | 
	
		
			
				|  |  | +            var lineWidth = lineStyle.width;
 | 
	
		
			
				|  |  | +            var lineType = lineStyle.type;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < indLen; i++) {
 | 
	
		
			
				|  |  | +                vector = __ecIndicator[i].vector;
 | 
	
		
			
				|  |  | +                line = this._getLine(center[0], center[1], vector[0] + center[0], vector[1] + center[1], strokeColor, lineWidth, lineType);
 | 
	
		
			
				|  |  | +                this.shapeList.push(line);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getLine: function (xStart, yStart, xEnd, yEnd, strokeColor, lineWidth, lineType) {
 | 
	
		
			
				|  |  | +            return new LineShape({
 | 
	
		
			
				|  |  | +                zlevel: this.getZlevelBase(),
 | 
	
		
			
				|  |  | +                z: this.getZBase(),
 | 
	
		
			
				|  |  | +                style: {
 | 
	
		
			
				|  |  | +                    xStart: xStart,
 | 
	
		
			
				|  |  | +                    yStart: yStart,
 | 
	
		
			
				|  |  | +                    xEnd: xEnd,
 | 
	
		
			
				|  |  | +                    yEnd: yEnd,
 | 
	
		
			
				|  |  | +                    strokeColor: strokeColor,
 | 
	
		
			
				|  |  | +                    lineWidth: lineWidth,
 | 
	
		
			
				|  |  | +                    lineType: lineType
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                hoverable: false
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _adjustIndicatorValue: function (index) {
 | 
	
		
			
				|  |  | +            var item = this.polar[index];
 | 
	
		
			
				|  |  | +            var indicator = this.deepQuery(this._queryTarget, 'indicator');
 | 
	
		
			
				|  |  | +            var len = indicator.length;
 | 
	
		
			
				|  |  | +            var __ecIndicator = item.__ecIndicator;
 | 
	
		
			
				|  |  | +            var max;
 | 
	
		
			
				|  |  | +            var min;
 | 
	
		
			
				|  |  | +            var data = this._getSeriesData(index);
 | 
	
		
			
				|  |  | +            var boundaryGap = item.boundaryGap;
 | 
	
		
			
				|  |  | +            var splitNumber = item.splitNumber;
 | 
	
		
			
				|  |  | +            var scale = item.scale;
 | 
	
		
			
				|  |  | +            var opts;
 | 
	
		
			
				|  |  | +            var smartSteps = require('../util/smartSteps');
 | 
	
		
			
				|  |  | +            for (var i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | +                if (typeof indicator[i].max == 'number') {
 | 
	
		
			
				|  |  | +                    max = indicator[i].max;
 | 
	
		
			
				|  |  | +                    min = indicator[i].min || 0;
 | 
	
		
			
				|  |  | +                    opts = {
 | 
	
		
			
				|  |  | +                        max: max,
 | 
	
		
			
				|  |  | +                        min: min
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    var value = this._findValue(data, i, splitNumber, boundaryGap);
 | 
	
		
			
				|  |  | +                    min = value.min;
 | 
	
		
			
				|  |  | +                    max = value.max;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!scale && min >= 0 && max >= 0) {
 | 
	
		
			
				|  |  | +                    min = 0;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!scale && min <= 0 && max <= 0) {
 | 
	
		
			
				|  |  | +                    max = 0;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                var stepOpt = smartSteps(min, max, splitNumber, opts);
 | 
	
		
			
				|  |  | +                __ecIndicator[i].value = {
 | 
	
		
			
				|  |  | +                    min: stepOpt.min,
 | 
	
		
			
				|  |  | +                    max: stepOpt.max,
 | 
	
		
			
				|  |  | +                    step: stepOpt.step
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _getSeriesData: function (index) {
 | 
	
		
			
				|  |  | +            var data = [];
 | 
	
		
			
				|  |  | +            var serie;
 | 
	
		
			
				|  |  | +            var serieData;
 | 
	
		
			
				|  |  | +            var legend = this.component.legend;
 | 
	
		
			
				|  |  | +            var polarIndex;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < this.series.length; i++) {
 | 
	
		
			
				|  |  | +                serie = this.series[i];
 | 
	
		
			
				|  |  | +                if (serie.type != ecConfig.CHART_TYPE_RADAR) {
 | 
	
		
			
				|  |  | +                    continue;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                serieData = serie.data || [];
 | 
	
		
			
				|  |  | +                for (var j = 0; j < serieData.length; j++) {
 | 
	
		
			
				|  |  | +                    polarIndex = this.deepQuery([
 | 
	
		
			
				|  |  | +                        serieData[j],
 | 
	
		
			
				|  |  | +                        serie,
 | 
	
		
			
				|  |  | +                        this.option
 | 
	
		
			
				|  |  | +                    ], 'polarIndex') || 0;
 | 
	
		
			
				|  |  | +                    if (polarIndex == index && (!legend || legend.isSelected(serieData[j].name))) {
 | 
	
		
			
				|  |  | +                        data.push(serieData[j]);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return data;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        _findValue: function (data, index, splitNumber, boundaryGap) {
 | 
	
		
			
				|  |  | +            var max;
 | 
	
		
			
				|  |  | +            var min;
 | 
	
		
			
				|  |  | +            var one;
 | 
	
		
			
				|  |  | +            if (!data || data.length === 0) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            function _compare(item) {
 | 
	
		
			
				|  |  | +                (item > max || max === undefined) && (max = item);
 | 
	
		
			
				|  |  | +                (item < min || min === undefined) && (min = item);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (data.length == 1) {
 | 
	
		
			
				|  |  | +                min = 0;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (data.length != 1) {
 | 
	
		
			
				|  |  | +                for (var i = 0; i < data.length; i++) {
 | 
	
		
			
				|  |  | +                    _compare(this.getDataFromOption(data[i].value[index]));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                one = data[0];
 | 
	
		
			
				|  |  | +                for (var i = 0; i < one.value.length; i++) {
 | 
	
		
			
				|  |  | +                    _compare(this.getDataFromOption(one.value[i]));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            var gap = Math.abs(max - min);
 | 
	
		
			
				|  |  | +            min = min - Math.abs(gap * boundaryGap[0]);
 | 
	
		
			
				|  |  | +            max = max + Math.abs(gap * boundaryGap[1]);
 | 
	
		
			
				|  |  | +            if (min === max) {
 | 
	
		
			
				|  |  | +                if (max === 0) {
 | 
	
		
			
				|  |  | +                    max = 1;
 | 
	
		
			
				|  |  | +                } else if (max > 0) {
 | 
	
		
			
				|  |  | +                    min = max / splitNumber;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    max = max / splitNumber;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return {
 | 
	
		
			
				|  |  | +                max: max,
 | 
	
		
			
				|  |  | +                min: min
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getVector: function (polarIndex, indicatorIndex, value) {
 | 
	
		
			
				|  |  | +            polarIndex = polarIndex || 0;
 | 
	
		
			
				|  |  | +            indicatorIndex = indicatorIndex || 0;
 | 
	
		
			
				|  |  | +            var __ecIndicator = this.polar[polarIndex].__ecIndicator;
 | 
	
		
			
				|  |  | +            if (indicatorIndex >= __ecIndicator.length) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            var indicator = this.polar[polarIndex].__ecIndicator[indicatorIndex];
 | 
	
		
			
				|  |  | +            var center = this.getCenter(polarIndex);
 | 
	
		
			
				|  |  | +            var vector = indicator.vector;
 | 
	
		
			
				|  |  | +            var max = indicator.value.max;
 | 
	
		
			
				|  |  | +            var min = indicator.value.min;
 | 
	
		
			
				|  |  | +            var alpha;
 | 
	
		
			
				|  |  | +            if (typeof value == 'undefined') {
 | 
	
		
			
				|  |  | +                return center;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            switch (value) {
 | 
	
		
			
				|  |  | +            case 'min':
 | 
	
		
			
				|  |  | +                value = min;
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  | +            case 'max':
 | 
	
		
			
				|  |  | +                value = max;
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  | +            case 'center':
 | 
	
		
			
				|  |  | +                value = (max + min) / 2;
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (max != min) {
 | 
	
		
			
				|  |  | +                alpha = (value - min) / (max - min);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                alpha = 0.5;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return this._mapVector(vector, center, alpha);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        isInside: function (vector) {
 | 
	
		
			
				|  |  | +            var polar = this.getNearestIndex(vector);
 | 
	
		
			
				|  |  | +            if (polar) {
 | 
	
		
			
				|  |  | +                return polar.polarIndex;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return -1;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getNearestIndex: function (vector) {
 | 
	
		
			
				|  |  | +            var item;
 | 
	
		
			
				|  |  | +            var center;
 | 
	
		
			
				|  |  | +            var radius;
 | 
	
		
			
				|  |  | +            var polarVector;
 | 
	
		
			
				|  |  | +            var startAngle;
 | 
	
		
			
				|  |  | +            var indicator;
 | 
	
		
			
				|  |  | +            var len;
 | 
	
		
			
				|  |  | +            var angle;
 | 
	
		
			
				|  |  | +            var finalAngle;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < this.polar.length; i++) {
 | 
	
		
			
				|  |  | +                item = this.polar[i];
 | 
	
		
			
				|  |  | +                center = this.getCenter(i);
 | 
	
		
			
				|  |  | +                if (vector[0] == center[0] && vector[1] == center[1]) {
 | 
	
		
			
				|  |  | +                    return {
 | 
	
		
			
				|  |  | +                        polarIndex: i,
 | 
	
		
			
				|  |  | +                        valueIndex: 0
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                radius = this._getRadius();
 | 
	
		
			
				|  |  | +                startAngle = item.startAngle;
 | 
	
		
			
				|  |  | +                indicator = item.indicator;
 | 
	
		
			
				|  |  | +                len = indicator.length;
 | 
	
		
			
				|  |  | +                angle = 2 * Math.PI / len;
 | 
	
		
			
				|  |  | +                polarVector = ecCoordinates.cartesian2polar(vector[0] - center[0], center[1] - vector[1]);
 | 
	
		
			
				|  |  | +                if (vector[0] - center[0] < 0) {
 | 
	
		
			
				|  |  | +                    polarVector[1] += Math.PI;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (polarVector[1] < 0) {
 | 
	
		
			
				|  |  | +                    polarVector[1] += 2 * Math.PI;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                finalAngle = polarVector[1] - startAngle / 180 * Math.PI + Math.PI * 2;
 | 
	
		
			
				|  |  | +                if (Math.abs(Math.cos(finalAngle % (angle / 2))) * radius > polarVector[0]) {
 | 
	
		
			
				|  |  | +                    return {
 | 
	
		
			
				|  |  | +                        polarIndex: i,
 | 
	
		
			
				|  |  | +                        valueIndex: Math.floor((finalAngle + angle / 2) / angle) % len
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        getIndicator: function (index) {
 | 
	
		
			
				|  |  | +            var index = index || 0;
 | 
	
		
			
				|  |  | +            return this.polar[index].indicator;
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        refresh: function (newOption) {
 | 
	
		
			
				|  |  | +            if (newOption) {
 | 
	
		
			
				|  |  | +                this.option = newOption;
 | 
	
		
			
				|  |  | +                this.polar = this.option.polar;
 | 
	
		
			
				|  |  | +                this.series = this.option.series;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            this.clear();
 | 
	
		
			
				|  |  | +            this._buildShape();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    zrUtil.inherits(Polar, Base);
 | 
	
		
			
				|  |  | +    require('../component').define('polar', Polar);
 | 
	
		
			
				|  |  | +    return Polar;
 | 
	
		
			
				|  |  | +});define('echarts/util/coordinates', [
 | 
	
		
			
				|  |  | +    'require',
 | 
	
		
			
				|  |  | +    'zrender/tool/math'
 | 
	
		
			
				|  |  | +], function (require) {
 | 
	
		
			
				|  |  | +    var zrMath = require('zrender/tool/math');
 | 
	
		
			
				|  |  | +    function polar2cartesian(r, theta) {
 | 
	
		
			
				|  |  | +        return [
 | 
	
		
			
				|  |  | +            r * zrMath.sin(theta),
 | 
	
		
			
				|  |  | +            r * zrMath.cos(theta)
 | 
	
		
			
				|  |  | +        ];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    function cartesian2polar(x, y) {
 | 
	
		
			
				|  |  | +        return [
 | 
	
		
			
				|  |  | +            Math.sqrt(x * x + y * y),
 | 
	
		
			
				|  |  | +            Math.atan(y / x)
 | 
	
		
			
				|  |  | +        ];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +        polar2cartesian: polar2cartesian,
 | 
	
		
			
				|  |  | +        cartesian2polar: cartesian2polar
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +});
 |