circle.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var tslib_1 = require("tslib");
  4. var util_1 = require("@antv/util");
  5. var matrix_util_1 = require("@antv/matrix-util");
  6. var base_1 = require("./base");
  7. var OverlapUtil = require("./overlap");
  8. var Circle = /** @class */ (function (_super) {
  9. tslib_1.__extends(Circle, _super);
  10. function Circle() {
  11. return _super !== null && _super.apply(this, arguments) || this;
  12. }
  13. Circle.prototype.getDefaultCfg = function () {
  14. var cfg = _super.prototype.getDefaultCfg.call(this);
  15. return tslib_1.__assign(tslib_1.__assign({}, cfg), { type: 'circle', locationType: 'circle', center: null, radius: null, startAngle: -Math.PI / 2, endAngle: (Math.PI * 3) / 2 });
  16. };
  17. Circle.prototype.getLinePath = function () {
  18. var center = this.get('center');
  19. var x = center.x;
  20. var y = center.y;
  21. var rx = this.get('radius');
  22. var ry = rx;
  23. var startAngle = this.get('startAngle');
  24. var endAngle = this.get('endAngle');
  25. var path = [];
  26. if (Math.abs(endAngle - startAngle) === Math.PI * 2) {
  27. path = [['M', x, y - ry], ['A', rx, ry, 0, 1, 1, x, y + ry], ['A', rx, ry, 0, 1, 1, x, y - ry], ['Z']];
  28. }
  29. else {
  30. var startPoint = this.getCirclePoint(startAngle);
  31. var endPoint = this.getCirclePoint(endAngle);
  32. var large = Math.abs(endAngle - startAngle) > Math.PI ? 1 : 0;
  33. var sweep = startAngle > endAngle ? 0 : 1;
  34. path = [
  35. ['M', x, y],
  36. ['L', startPoint.x, startPoint.y],
  37. ['A', rx, ry, 0, large, sweep, endPoint.x, endPoint.y],
  38. ['L', x, y],
  39. ];
  40. }
  41. return path;
  42. };
  43. Circle.prototype.getTickPoint = function (tickValue) {
  44. var startAngle = this.get('startAngle');
  45. var endAngle = this.get('endAngle');
  46. var angle = startAngle + (endAngle - startAngle) * tickValue;
  47. return this.getCirclePoint(angle);
  48. };
  49. // 获取垂直于坐标轴的向量
  50. Circle.prototype.getSideVector = function (offset, point) {
  51. var center = this.get('center');
  52. var vector = [point.x - center.x, point.y - center.y];
  53. var factor = this.get('verticalFactor');
  54. var vecLen = matrix_util_1.vec2.length(vector);
  55. matrix_util_1.vec2.scale(vector, vector, (factor * offset) / vecLen);
  56. return vector;
  57. };
  58. // 获取沿坐标轴方向的向量
  59. Circle.prototype.getAxisVector = function (point) {
  60. var center = this.get('center');
  61. var vector = [point.x - center.x, point.y - center.y];
  62. return [vector[1], -1 * vector[0]]; // 获取顺时针方向的向量
  63. };
  64. // 根据圆心和半径获取点
  65. Circle.prototype.getCirclePoint = function (angle, radius) {
  66. var center = this.get('center');
  67. radius = radius || this.get('radius');
  68. return {
  69. x: center.x + Math.cos(angle) * radius,
  70. y: center.y + Math.sin(angle) * radius,
  71. };
  72. };
  73. /**
  74. * 是否可以执行某一 overlap
  75. * @param name
  76. */
  77. Circle.prototype.canProcessOverlap = function (name) {
  78. var labelCfg = this.get('label');
  79. // 对 autoRotate,如果配置了旋转角度,直接进行固定角度旋转
  80. if (name === 'autoRotate') {
  81. return util_1.isNil(labelCfg.rotate);
  82. }
  83. // 默认所有 overlap 都可执行
  84. return true;
  85. };
  86. Circle.prototype.processOverlap = function (labelGroup) {
  87. var _this = this;
  88. var labelCfg = this.get('label');
  89. var titleCfg = this.get('title');
  90. var verticalLimitLength = this.get('verticalLimitLength');
  91. var labelOffset = labelCfg.offset;
  92. var limitLength = verticalLimitLength;
  93. var titleHeight = 0;
  94. var titleSpacing = 0;
  95. if (titleCfg) {
  96. titleHeight = titleCfg.style.fontSize;
  97. titleSpacing = titleCfg.spacing;
  98. }
  99. if (limitLength) {
  100. limitLength = limitLength - labelOffset - titleSpacing - titleHeight;
  101. }
  102. var overlapOrder = this.get('overlapOrder');
  103. util_1.each(overlapOrder, function (name) {
  104. if (labelCfg[name] && _this.canProcessOverlap(name)) {
  105. _this.autoProcessOverlap(name, labelCfg[name], labelGroup, limitLength);
  106. }
  107. });
  108. if (titleCfg) {
  109. if (util_1.isNil(titleCfg.offset)) {
  110. // 调整 title 的 offset
  111. var length_1 = labelGroup.getCanvasBBox().height;
  112. // 如果用户没有设置 offset,则自动计算
  113. titleCfg.offset = labelOffset + length_1 + titleSpacing + titleHeight / 2;
  114. }
  115. }
  116. };
  117. Circle.prototype.autoProcessOverlap = function (name, value, labelGroup, limitLength) {
  118. var _this = this;
  119. var hasAdjusted = false;
  120. var util = OverlapUtil[name];
  121. if (limitLength > 0) {
  122. if (value === true) {
  123. // true 形式的配置:使用 overlap 默认的的处理方法进行处理
  124. hasAdjusted = util.getDefault()(false, labelGroup, limitLength);
  125. }
  126. else if (util_1.isFunction(value)) {
  127. // 回调函数形式的配置: 用户可以传入回调函数
  128. hasAdjusted = value(false, labelGroup, limitLength);
  129. }
  130. else if (util_1.isObject(value)) {
  131. // object 形式的配置方式:包括 处理方法 type, 和可选参数配置 cfg
  132. var overlapCfg = value;
  133. if (util[overlapCfg.type]) {
  134. hasAdjusted = util[overlapCfg.type](false, labelGroup, limitLength, overlapCfg.cfg);
  135. }
  136. }
  137. else if (util[value]) {
  138. // 字符串类型的配置:按照名称执行 overlap 处理方法
  139. hasAdjusted = util[value](false, labelGroup, limitLength);
  140. }
  141. }
  142. if (name === 'autoRotate') {
  143. // 文本旋转后,文本的对齐方式可能就不合适了
  144. if (hasAdjusted) {
  145. var labels = labelGroup.getChildren();
  146. var verticalFactor_1 = this.get('verticalFactor');
  147. util_1.each(labels, function (label) {
  148. var textAlign = label.attr('textAlign');
  149. if (textAlign === 'center') {
  150. // 居中的文本需要调整旋转度
  151. var newAlign = verticalFactor_1 > 0 ? 'end' : 'start';
  152. label.attr('textAlign', newAlign);
  153. }
  154. });
  155. }
  156. }
  157. else if (name === 'autoHide') {
  158. var children = labelGroup.getChildren().slice(0); // 复制数组,删除时不会出错
  159. util_1.each(children, function (label) {
  160. if (!label.get('visible')) {
  161. if (_this.get('isRegister')) {
  162. // 已经注册过了,则删除
  163. _this.unregisterElement(label);
  164. }
  165. label.remove(); // 防止 label 数量太多,所以统一删除
  166. }
  167. });
  168. }
  169. };
  170. return Circle;
  171. }(base_1.default));
  172. exports.default = Circle;
  173. //# sourceMappingURL=circle.js.map