interval.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. var Util = require('../../util/common');
  2. var Shape = require('./shape');
  3. var Vector2 = require('../../graphic/util/vector2');
  4. var Global = require('../../global');
  5. function getRectPoints(cfg) {
  6. var x = cfg.x,
  7. y = cfg.y,
  8. y0 = cfg.y0,
  9. size = cfg.size;
  10. var ymin = y0;
  11. var ymax = y;
  12. if (Util.isArray(y)) {
  13. ymax = y[1];
  14. ymin = y[0];
  15. }
  16. var xmin;
  17. var xmax;
  18. if (Util.isArray(x)) {
  19. xmin = x[0];
  20. xmax = x[1];
  21. } else {
  22. xmin = x - size / 2;
  23. xmax = x + size / 2;
  24. }
  25. return [{
  26. x: xmin,
  27. y: ymin
  28. }, {
  29. x: xmin,
  30. y: ymax
  31. }, {
  32. x: xmax,
  33. y: ymax
  34. }, {
  35. x: xmax,
  36. y: ymin
  37. }];
  38. }
  39. function getRectRange(points) {
  40. var xValues = [];
  41. var yValues = [];
  42. for (var i = 0, len = points.length; i < len; i++) {
  43. var point = points[i];
  44. xValues.push(point.x);
  45. yValues.push(point.y);
  46. }
  47. var xMin = Math.min.apply(null, xValues);
  48. var yMin = Math.min.apply(null, yValues);
  49. var xMax = Math.max.apply(null, xValues);
  50. var yMax = Math.max.apply(null, yValues);
  51. return {
  52. x: xMin,
  53. y: yMin,
  54. width: xMax - xMin,
  55. height: yMax - yMin
  56. };
  57. }
  58. var Interval = Shape.registerFactory('interval', {
  59. defaultShapeType: 'rect',
  60. getDefaultPoints: function getDefaultPoints(cfg) {
  61. return getRectPoints(cfg);
  62. }
  63. });
  64. Shape.registerShape('interval', 'rect', {
  65. draw: function draw(cfg, container) {
  66. var points = this.parsePoints(cfg.points);
  67. var style = Util.mix({
  68. fill: cfg.color
  69. }, Global.shape.interval, cfg.style);
  70. if (cfg.isInCircle) {
  71. var newPoints = points.slice(0);
  72. if (this._coord.transposed) {
  73. newPoints = [points[0], points[3], points[2], points[1]];
  74. }
  75. var _cfg$center = cfg.center,
  76. x = _cfg$center.x,
  77. y = _cfg$center.y;
  78. var v = [1, 0];
  79. var v0 = [newPoints[0].x - x, newPoints[0].y - y];
  80. var v1 = [newPoints[1].x - x, newPoints[1].y - y];
  81. var v2 = [newPoints[2].x - x, newPoints[2].y - y];
  82. var startAngle = Vector2.angleTo(v, v1);
  83. var endAngle = Vector2.angleTo(v, v2);
  84. var r0 = Vector2.length(v0);
  85. var r = Vector2.length(v1);
  86. if (startAngle >= 1.5 * Math.PI) {
  87. startAngle = startAngle - 2 * Math.PI;
  88. }
  89. if (endAngle >= 1.5 * Math.PI) {
  90. endAngle = endAngle - 2 * Math.PI;
  91. }
  92. return container.addShape('Sector', {
  93. className: 'interval',
  94. attrs: Util.mix({
  95. x: x,
  96. y: y,
  97. r: r,
  98. r0: r0,
  99. startAngle: startAngle,
  100. endAngle: endAngle
  101. }, style)
  102. });
  103. }
  104. var rectCfg = getRectRange(points);
  105. return container.addShape('rect', {
  106. className: 'interval',
  107. attrs: Util.mix(rectCfg, style)
  108. });
  109. }
  110. });
  111. module.exports = Interval;