circle.js 7.1 KB

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