util.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { each, isArray, isNil, isNumber } from '@antv/util';
  2. export function formatPadding(padding) {
  3. var top = 0;
  4. var left = 0;
  5. var right = 0;
  6. var bottom = 0;
  7. if (isNumber(padding)) {
  8. top = left = right = bottom = padding;
  9. }
  10. else if (isArray(padding)) {
  11. top = padding[0];
  12. right = !isNil(padding[1]) ? padding[1] : padding[0];
  13. bottom = !isNil(padding[2]) ? padding[2] : padding[0];
  14. left = !isNil(padding[3]) ? padding[3] : right;
  15. }
  16. return [top, right, bottom, left];
  17. }
  18. export function clearDom(container) {
  19. var children = container.childNodes;
  20. var length = children.length;
  21. for (var i = length - 1; i >= 0; i--) {
  22. container.removeChild(children[i]);
  23. }
  24. }
  25. export function hasClass(elements, cName) {
  26. return !!elements.className.match(new RegExp("(\\s|^)" + cName + "(\\s|$)"));
  27. }
  28. export function regionToBBox(region) {
  29. var start = region.start, end = region.end;
  30. var minX = Math.min(start.x, end.x);
  31. var minY = Math.min(start.y, end.y);
  32. var maxX = Math.max(start.x, end.x);
  33. var maxY = Math.max(start.y, end.y);
  34. return {
  35. x: minX,
  36. y: minY,
  37. minX: minX,
  38. minY: minY,
  39. maxX: maxX,
  40. maxY: maxY,
  41. width: maxX - minX,
  42. height: maxY - minY,
  43. };
  44. }
  45. export function pointsToBBox(points) {
  46. var xs = points.map(function (point) { return point.x; });
  47. var ys = points.map(function (point) { return point.y; });
  48. var minX = Math.min.apply(Math, xs);
  49. var minY = Math.min.apply(Math, ys);
  50. var maxX = Math.max.apply(Math, xs);
  51. var maxY = Math.max.apply(Math, ys);
  52. return {
  53. x: minX,
  54. y: minY,
  55. minX: minX,
  56. minY: minY,
  57. maxX: maxX,
  58. maxY: maxY,
  59. width: maxX - minX,
  60. height: maxY - minY,
  61. };
  62. }
  63. export function createBBox(x, y, width, height) {
  64. var maxX = x + width;
  65. var maxY = y + height;
  66. return {
  67. x: x,
  68. y: y,
  69. width: width,
  70. height: height,
  71. minX: x,
  72. minY: y,
  73. // 非常奇葩的 js 特性
  74. // Infinity + Infinity = Infinity
  75. // Infinity - Infinity = NaN
  76. // fixed https://github.com/antvis/G2Plot/issues/1243
  77. maxX: isNaN(maxX) ? 0 : maxX,
  78. maxY: isNaN(maxY) ? 0 : maxY,
  79. };
  80. }
  81. export function getValueByPercent(min, max, percent) {
  82. return (1 - percent) * min + max * percent;
  83. }
  84. export function getCirclePoint(center, radius, angle) {
  85. return {
  86. x: center.x + Math.cos(angle) * radius,
  87. y: center.y + Math.sin(angle) * radius,
  88. };
  89. }
  90. export function distance(p1, p2) {
  91. var dx = p2.x - p1.x;
  92. var dy = p2.y - p1.y;
  93. return Math.sqrt(dx * dx + dy * dy);
  94. }
  95. export var wait = function (interval) {
  96. return new Promise(function (resolve) {
  97. setTimeout(resolve, interval);
  98. });
  99. };
  100. /**
  101. * 判断两个数值 是否接近
  102. * - 解决精度问题(由于无法确定精度上限,根据具体场景可传入 精度 参数)
  103. */
  104. export var near = function (x, y, e) {
  105. if (e === void 0) { e = Math.pow(Number.EPSILON, 0.5); }
  106. return [x, y].includes(Infinity) ? Math.abs(x) === Math.abs(y) : Math.abs(x - y) < e;
  107. };
  108. export function intersectBBox(box1, box2) {
  109. var minX = Math.max(box1.minX, box2.minX);
  110. var minY = Math.max(box1.minY, box2.minY);
  111. var maxX = Math.min(box1.maxX, box2.maxX);
  112. var maxY = Math.min(box1.maxY, box2.maxY);
  113. return createBBox(minX, minY, maxX - minX, maxY - minY);
  114. }
  115. export function mergeBBox(box1, box2) {
  116. var minX = Math.min(box1.minX, box2.minX);
  117. var minY = Math.min(box1.minY, box2.minY);
  118. var maxX = Math.max(box1.maxX, box2.maxX);
  119. var maxY = Math.max(box1.maxY, box2.maxY);
  120. return createBBox(minX, minY, maxX - minX, maxY - minY);
  121. }
  122. export function getBBoxWithClip(element) {
  123. var clipShape = element.getClip();
  124. var clipBBox = clipShape && clipShape.getBBox();
  125. var bbox;
  126. if (!element.isGroup()) {
  127. // 如果是普通的图形
  128. bbox = element.getBBox();
  129. }
  130. else {
  131. var minX_1 = Infinity;
  132. var maxX_1 = -Infinity;
  133. var minY_1 = Infinity;
  134. var maxY_1 = -Infinity;
  135. var children = element.getChildren();
  136. if (children.length > 0) {
  137. each(children, function (child) {
  138. if (child.get('visible')) {
  139. // 如果分组没有子元素,则直接跳过
  140. if (child.isGroup() && child.get('children').length === 0) {
  141. return true;
  142. }
  143. var box = getBBoxWithClip(child);
  144. // 计算 4 个顶点
  145. var leftTop = child.applyToMatrix([box.minX, box.minY, 1]);
  146. var leftBottom = child.applyToMatrix([box.minX, box.maxY, 1]);
  147. var rightTop = child.applyToMatrix([box.maxX, box.minY, 1]);
  148. var rightBottom = child.applyToMatrix([box.maxX, box.maxY, 1]);
  149. // 从中取最小的范围
  150. var boxMinX = Math.min(leftTop[0], leftBottom[0], rightTop[0], rightBottom[0]);
  151. var boxMaxX = Math.max(leftTop[0], leftBottom[0], rightTop[0], rightBottom[0]);
  152. var boxMinY = Math.min(leftTop[1], leftBottom[1], rightTop[1], rightBottom[1]);
  153. var boxMaxY = Math.max(leftTop[1], leftBottom[1], rightTop[1], rightBottom[1]);
  154. if (boxMinX < minX_1) {
  155. minX_1 = boxMinX;
  156. }
  157. if (boxMaxX > maxX_1) {
  158. maxX_1 = boxMaxX;
  159. }
  160. if (boxMinY < minY_1) {
  161. minY_1 = boxMinY;
  162. }
  163. if (boxMaxY > maxY_1) {
  164. maxY_1 = boxMaxY;
  165. }
  166. }
  167. });
  168. }
  169. else {
  170. minX_1 = 0;
  171. maxX_1 = 0;
  172. minY_1 = 0;
  173. maxY_1 = 0;
  174. }
  175. bbox = createBBox(minX_1, minY_1, maxX_1 - minX_1, maxY_1 - minY_1);
  176. }
  177. if (clipBBox) {
  178. return intersectBBox(bbox, clipBBox);
  179. }
  180. else {
  181. return bbox;
  182. }
  183. }
  184. export function updateClip(element, newElement) {
  185. if (!element.getClip() && !newElement.getClip()) {
  186. // 两者都没有 clip
  187. return;
  188. }
  189. var newClipShape = newElement.getClip();
  190. if (!newClipShape) {
  191. // 新的 element 没有 clip
  192. element.setClip(null); // 移除 clip
  193. return;
  194. }
  195. var clipCfg = {
  196. type: newClipShape.get('type'),
  197. attrs: newClipShape.attr(),
  198. };
  199. element.setClip(clipCfg);
  200. }
  201. export function toPx(number) {
  202. return number + "px";
  203. }
  204. export function getTextPoint(start, end, position, offset) {
  205. var lineLength = distance(start, end);
  206. var offsetPercent = offset / lineLength; // 计算间距同线的比例,用于计算最终的位置
  207. var percent = 0;
  208. if (position === 'start') {
  209. percent = 0 - offsetPercent;
  210. }
  211. else if (position === 'end') {
  212. percent = 1 + offsetPercent;
  213. }
  214. return {
  215. x: getValueByPercent(start.x, end.x, percent),
  216. y: getValueByPercent(start.y, end.y, percent),
  217. };
  218. }
  219. //# sourceMappingURL=util.js.map