chordCircularLayout.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. var zrUtil = require("zrender/lib/core/util");
  2. var _number = require("../../util/number");
  3. var parsePercent = _number.parsePercent;
  4. /**
  5. * Chord layout
  6. * @module echarts/chart/chord/chordCircularLayout
  7. * @author pissang(http://github.com/pissang)
  8. */
  9. /**
  10. * @param {module:echarts/data/Graph} graph
  11. */
  12. function layout(graphs, opts) {
  13. if (!zrUtil.isArray(graphs)) {
  14. graphs = [graphs];
  15. }
  16. var graph0 = graphs[0];
  17. var groups = []; // Init groups
  18. graph0.eachNode(function (node) {
  19. var group = {
  20. size: 0,
  21. subGroups: [],
  22. node: node
  23. };
  24. groups.push(group);
  25. });
  26. zrUtil.each(graphs, function (graph) {
  27. graph.eachEdge(function (edge) {
  28. var g1 = groups[edge.node1.dataIndex];
  29. g1.size += edge.getValue('value') || 0;
  30. g1.subGroups.push({
  31. size: edge.getValue('value'),
  32. edge: edge
  33. });
  34. });
  35. });
  36. var sumSize = zrUtil.reduce(groups, function (sumSize, group) {
  37. return sumSize + group.size;
  38. }, 0);
  39. if (opts.sort && opts.sort != 'none') {
  40. groups.sort(compareGroups);
  41. if (opts.sort === 'descending') {
  42. groups.reverse();
  43. }
  44. }
  45. var unitAngle = (Math.PI * 2 - opts.padding * graph0.data.count()) / sumSize;
  46. var angle = opts.startAngle * Math.PI / 180;
  47. var sign = opts.clockwise ? -1 : 1;
  48. zrUtil.each(groups, function (group) {
  49. if (opts.sortSub && opts.sortSub != 'none') {
  50. group.subGroups.sort(compareGroups);
  51. if (opts.sortSub === 'descending') {
  52. group.subGroups.reverse();
  53. }
  54. }
  55. var endAngle = angle + sign * group.size * unitAngle;
  56. group.node.setLayout({
  57. startAngle: -angle,
  58. endAngle: -endAngle,
  59. cx: opts.cx,
  60. cy: opts.cy,
  61. r0: opts.r0,
  62. r: opts.r,
  63. clockwise: opts.clockwise
  64. });
  65. zrUtil.each(group.subGroups, function (subGroup) {
  66. var startAngle = angle;
  67. var endAngle = angle + sign * subGroup.size * unitAngle;
  68. var layout = subGroup.edge.getLayout() || {
  69. cx: opts.cx,
  70. cy: opts.cy,
  71. r: opts.r0,
  72. clockwise: opts.clockwise
  73. };
  74. layout.startAngle = -startAngle;
  75. layout.endAngle = -endAngle;
  76. subGroup.edge.setLayout(layout);
  77. angle = endAngle;
  78. });
  79. angle = endAngle + sign * opts.padding;
  80. });
  81. }
  82. var compareGroups = function (a, b) {
  83. return a.size - b.size;
  84. };
  85. function _default(ecModel, api, payload) {
  86. ecModel.eachSeriesByType('chord', function (chordSeries) {
  87. var graph = chordSeries.getGraph();
  88. var center = chordSeries.get('center');
  89. var radius = chordSeries.get('radius');
  90. var viewWidth = api.getWidth();
  91. var viewHeight = api.getHeight();
  92. var viewSize = Math.min(viewWidth, viewHeight) / 2;
  93. layout(graph, {
  94. sort: chordSeries.get('sort'),
  95. sortSub: chordSeries.get('sortSub'),
  96. padding: chordSeries.get('padding'),
  97. startAngle: chordSeries.get('startAngle'),
  98. clockwise: chordSeries.get('clockwise'),
  99. cx: parsePercent(center[0], viewWidth),
  100. cy: parsePercent(center[1], viewHeight),
  101. r0: parsePercent(radius[0], viewSize),
  102. r: parsePercent(radius[1], viewSize)
  103. });
  104. });
  105. }
  106. module.exports = _default;