Util.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.getDiamondResizeEdgePoint = exports.getEllipseResizeEdgePoint = exports.getRectResizeEdgePoint = exports.ModelType = void 0;
  4. var ModelType;
  5. (function (ModelType) {
  6. ModelType["NODE"] = "node";
  7. ModelType["CIRCLE_NODE"] = "circle-node";
  8. ModelType["POLYGON_NODE"] = "polygon-node";
  9. ModelType["RECT_NODE"] = "rect-node";
  10. ModelType["HTML_NODE"] = "html-node";
  11. ModelType["TEXT_NODE"] = "text-node";
  12. ModelType["ELLIPSE_NODE"] = "ellipse-node";
  13. ModelType["DIAMOND_NODE"] = "diamond-node";
  14. ModelType["EDGE"] = "edge";
  15. ModelType["LINE_EDGE"] = "line-edge";
  16. ModelType["POLYLINE_EDGE"] = "polyline-edge";
  17. ModelType["BEZIER_EDGE"] = "bezier-edge";
  18. ModelType["GRAPH"] = "graph";
  19. })(ModelType = exports.ModelType || (exports.ModelType = {}));
  20. // 计算节点的box四角数据
  21. function getNodeBox(node) {
  22. var x = node.x, y = node.y, width = node.width, height = node.height;
  23. return {
  24. minX: x - width / 2,
  25. minY: y - height / 2,
  26. maxX: x + width / 2,
  27. maxY: y + height / 2,
  28. };
  29. }
  30. // 计算矩形radius设置后,四个圆角的圆心
  31. function getRadiusCenter(node) {
  32. var nodeBox = getNodeBox(node);
  33. var radius = node.radius;
  34. var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY;
  35. return [
  36. {
  37. x: minX + radius,
  38. y: minY + radius,
  39. },
  40. {
  41. x: maxX - radius,
  42. y: minY + radius,
  43. },
  44. {
  45. x: maxX - radius,
  46. y: maxY - radius,
  47. },
  48. {
  49. x: minX + radius,
  50. y: maxY - radius,
  51. },
  52. ];
  53. }
  54. // 获取矩形resize之后,与矩形连接边的新端点
  55. function getRectResizeEdgePoint(_a) {
  56. var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
  57. var x = point.x, y = point.y;
  58. var afterPoint = {
  59. x: x, y: y,
  60. };
  61. var radius = beforeNode.radius;
  62. var beforeNodeBox = getNodeBox(beforeNode);
  63. var afterNodeBox = getNodeBox(afterNode);
  64. if (x === beforeNodeBox.minX) {
  65. // 左边
  66. afterPoint.x = afterNodeBox.minX;
  67. var pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius);
  68. if (pct) {
  69. afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct;
  70. }
  71. else {
  72. afterPoint.y = afterNode.y;
  73. }
  74. }
  75. else if (x === beforeNodeBox.maxX) {
  76. // 右边
  77. afterPoint.x = afterNodeBox.maxX;
  78. var pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius);
  79. if (pct) {
  80. afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct;
  81. }
  82. else {
  83. afterPoint.y = afterNode.y;
  84. }
  85. }
  86. else if (y === beforeNodeBox.minY) {
  87. // 上边
  88. afterPoint.y = afterNodeBox.minY;
  89. var pct = (x - beforeNode.x) / (beforeNode.width / 2 - radius);
  90. if (pct) {
  91. afterPoint.x = afterNode.x + (afterNode.width / 2 - radius) * pct;
  92. }
  93. else {
  94. afterPoint.x = afterNode.x;
  95. }
  96. }
  97. else if (y === beforeNodeBox.maxY) {
  98. // 下边
  99. afterPoint.y = afterNodeBox.maxY;
  100. var pct = (x - beforeNode.x) / (beforeNode.width / 2 - radius);
  101. if (pct) {
  102. afterPoint.x = afterNode.x + (afterNode.width / 2 - radius) * pct;
  103. }
  104. else {
  105. afterPoint.x = afterNode.x;
  106. }
  107. }
  108. else {
  109. // 在圆角部分
  110. var beforeCoc = getRadiusCenter(beforeNode);
  111. var afterCoc = getRadiusCenter(afterNode);
  112. var nodeBox = getNodeBox(beforeNode);
  113. var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY;
  114. var index = -1;
  115. if (x - minX < radius && y - minY < radius) {
  116. // 左上角
  117. index = 0;
  118. }
  119. else if (maxX - x < radius && y - minY < radius) {
  120. // 右上角
  121. index = 1;
  122. }
  123. else if (maxX - x < radius && maxY - y < radius) {
  124. // 右下角
  125. index = 2;
  126. }
  127. else if (x - minX < radius && minY - y < radius) {
  128. // 左下角
  129. index = 3;
  130. }
  131. if (index > -1) {
  132. // 根据夹角角度计算位置
  133. var angle = Math.atan2((y - beforeCoc[index].y), (x - beforeCoc[index].x));
  134. afterPoint.x = afterCoc[index].x + radius * Math.cos(angle);
  135. afterPoint.y = afterCoc[index].y + radius * Math.sin(angle);
  136. }
  137. }
  138. return afterPoint;
  139. }
  140. exports.getRectResizeEdgePoint = getRectResizeEdgePoint;
  141. // 获取椭圆resize之后,与椭圆连接边的新端点
  142. function getEllipseResizeEdgePoint(_a) {
  143. var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
  144. var rx = afterNode.rx, ry = afterNode.ry;
  145. var afterPoint = point;
  146. // 将椭圆中心当做中心点(0,0),放大缩小前点与X周夹角
  147. var tan = (point.y - beforeNode.y) / (point.x - beforeNode.x);
  148. // 方便与公式对照,将rx命名为a,ry命名为b
  149. var a = rx;
  150. var b = ry;
  151. var x;
  152. var y;
  153. // 将椭圆中心当做中心点(0,0),计算放大缩小后,同一夹角下,点相对位置
  154. if (tan >= Infinity) {
  155. // θ = PI / 2
  156. x = 0;
  157. y = b;
  158. }
  159. else if (tan <= -Infinity) {
  160. // θ = 3 * PI / 2
  161. x = 0;
  162. y = -b;
  163. }
  164. else if (point.x - beforeNode.x > 0) {
  165. // 0 < θ = PI / 2 或者 3 * PI / 2 < θ = 2 * PI
  166. // 一四象限
  167. x = (a * b) / (Math.sqrt((b * b) + a * a * tan * tan));
  168. y = (a * b * tan) / (Math.sqrt((b * b) + a * a * tan * tan));
  169. }
  170. else {
  171. // PI / 2 < θ 3 * PI / 2
  172. // 二三象限
  173. x = -(a * b) / (Math.sqrt((b * b) + a * a * tan * tan));
  174. y = -(a * b * tan) / (Math.sqrt((b * b) + a * a * tan * tan));
  175. }
  176. afterPoint = { x: x + afterNode.x, y: y + afterNode.y };
  177. return afterPoint;
  178. }
  179. exports.getEllipseResizeEdgePoint = getEllipseResizeEdgePoint;
  180. // 获取菱形resize之后,与菱形连接边的新端点
  181. function getDiamondResizeEdgePoint(_a) {
  182. var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
  183. var afterPoint = point;
  184. var x;
  185. var y;
  186. var px = point.x - beforeNode.x;
  187. var py = point.y - beforeNode.y;
  188. var rxBefore = beforeNode.rx;
  189. var ryBefore = beforeNode.ry;
  190. // eslint-disable-next-line max-len
  191. var pct = Math.sqrt((rxBefore - Math.abs(px)) * (rxBefore - Math.abs(px)) + py * py) / Math.sqrt(rxBefore * rxBefore + ryBefore * ryBefore);
  192. var rxAfter = afterNode.rx;
  193. var ryAfter = afterNode.ry;
  194. // eslint-disable-next-line max-len
  195. var a = Math.sqrt((rxAfter * rxAfter + ryAfter * ryAfter) * pct * pct * ((rxAfter * rxAfter) / (rxAfter * rxAfter + ryAfter * ryAfter)));
  196. var b = a * (ryAfter / rxAfter);
  197. if (px >= 0) {
  198. // eslint-disable-next-line max-len
  199. x = rxAfter - a;
  200. }
  201. else {
  202. x = a - rxAfter;
  203. }
  204. if (py > 0) {
  205. y = b;
  206. }
  207. else {
  208. y = -b;
  209. }
  210. afterPoint = {
  211. x: x + afterNode.x,
  212. y: y + afterNode.y,
  213. };
  214. return afterPoint;
  215. }
  216. exports.getDiamondResizeEdgePoint = getDiamondResizeEdgePoint;