circularLayoutHelper.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. var vec2 = require("zrender/lib/core/vector");
  2. function circularLayout(seriesModel) {
  3. var coordSys = seriesModel.coordinateSystem;
  4. if (coordSys && coordSys.type !== 'view') {
  5. return;
  6. }
  7. var rect = coordSys.getBoundingRect();
  8. var nodeData = seriesModel.getData();
  9. var graph = nodeData.graph;
  10. var angle = 0;
  11. var sum = nodeData.getSum('value');
  12. var unitAngle = Math.PI * 2 / (sum || nodeData.count());
  13. var cx = rect.width / 2 + rect.x;
  14. var cy = rect.height / 2 + rect.y;
  15. var r = Math.min(rect.width, rect.height) / 2;
  16. graph.eachNode(function (node) {
  17. var value = node.getValue('value');
  18. angle += unitAngle * (sum ? value : 1) / 2;
  19. node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);
  20. angle += unitAngle * (sum ? value : 1) / 2;
  21. });
  22. nodeData.setLayout({
  23. cx: cx,
  24. cy: cy
  25. });
  26. graph.eachEdge(function (edge) {
  27. var curveness = edge.getModel().get('lineStyle.normal.curveness') || 0;
  28. var p1 = vec2.clone(edge.node1.getLayout());
  29. var p2 = vec2.clone(edge.node2.getLayout());
  30. var cp1;
  31. var x12 = (p1[0] + p2[0]) / 2;
  32. var y12 = (p1[1] + p2[1]) / 2;
  33. if (+curveness) {
  34. curveness *= 3;
  35. cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)];
  36. }
  37. edge.setLayout([p1, p2, cp1]);
  38. });
  39. }
  40. exports.circularLayout = circularLayout;