123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942 |
- 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
- };
- });
|