@retikz/core 0.1.0-alpha.3 → 0.1.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/es/compile/compile.d.ts +9 -10
  2. package/dist/es/compile/compile.d.ts.map +1 -1
  3. package/dist/es/compile/compile.js +31 -8
  4. package/dist/es/compile/node.d.ts +56 -54
  5. package/dist/es/compile/node.d.ts.map +1 -1
  6. package/dist/es/compile/node.js +137 -39
  7. package/dist/es/compile/parseTarget.d.ts +3 -8
  8. package/dist/es/compile/parseTarget.d.ts.map +1 -1
  9. package/dist/es/compile/parseTarget.js +7 -19
  10. package/dist/es/compile/path.d.ts +2 -19
  11. package/dist/es/compile/path.d.ts.map +1 -1
  12. package/dist/es/compile/path.js +232 -213
  13. package/dist/es/compile/position.d.ts +4 -5
  14. package/dist/es/compile/position.d.ts.map +1 -1
  15. package/dist/es/compile/position.js +32 -5
  16. package/dist/es/compile/text-metrics.d.ts +2 -4
  17. package/dist/es/compile/text-metrics.d.ts.map +1 -1
  18. package/dist/es/compile/view-box.d.ts +1 -4
  19. package/dist/es/compile/view-box.d.ts.map +1 -1
  20. package/dist/es/compile/view-box.js +1 -4
  21. package/dist/es/geometry/arc.d.ts +3 -28
  22. package/dist/es/geometry/arc.d.ts.map +1 -1
  23. package/dist/es/geometry/arc.js +4 -31
  24. package/dist/es/geometry/bend.d.ts +2 -13
  25. package/dist/es/geometry/bend.d.ts.map +1 -1
  26. package/dist/es/geometry/bend.js +2 -13
  27. package/dist/es/geometry/circle.d.ts +5 -13
  28. package/dist/es/geometry/circle.d.ts.map +1 -1
  29. package/dist/es/geometry/circle.js +1 -4
  30. package/dist/es/geometry/diamond.d.ts +9 -24
  31. package/dist/es/geometry/diamond.d.ts.map +1 -1
  32. package/dist/es/geometry/diamond.js +4 -14
  33. package/dist/es/geometry/ellipse.d.ts +9 -15
  34. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  35. package/dist/es/geometry/ellipse.js +4 -8
  36. package/dist/es/geometry/point.d.ts +8 -9
  37. package/dist/es/geometry/point.d.ts.map +1 -1
  38. package/dist/es/geometry/point.js +8 -9
  39. package/dist/es/geometry/polar.d.ts +12 -21
  40. package/dist/es/geometry/polar.d.ts.map +1 -1
  41. package/dist/es/geometry/polar.js +7 -14
  42. package/dist/es/geometry/rect.d.ts +8 -32
  43. package/dist/es/geometry/rect.d.ts.map +1 -1
  44. package/dist/es/geometry/rect.js +7 -33
  45. package/dist/es/geometry/segment.d.ts +11 -18
  46. package/dist/es/geometry/segment.d.ts.map +1 -1
  47. package/dist/es/geometry/segment.js +9 -16
  48. package/dist/es/index.d.ts +6 -10
  49. package/dist/es/index.d.ts.map +1 -1
  50. package/dist/es/index.js +7 -4
  51. package/dist/es/ir/coordinate.d.ts +65 -0
  52. package/dist/es/ir/coordinate.d.ts.map +1 -0
  53. package/dist/es/ir/coordinate.js +22 -0
  54. package/dist/es/ir/index.d.ts +1 -0
  55. package/dist/es/ir/index.d.ts.map +1 -1
  56. package/dist/es/ir/node.d.ts +290 -50
  57. package/dist/es/ir/node.d.ts.map +1 -1
  58. package/dist/es/ir/node.js +32 -38
  59. package/dist/es/ir/path/arrow.d.ts +210 -12
  60. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  61. package/dist/es/ir/path/arrow.js +39 -12
  62. package/dist/es/ir/path/path.d.ts +477 -153
  63. package/dist/es/ir/path/path.d.ts.map +1 -1
  64. package/dist/es/ir/path/path.js +2 -2
  65. package/dist/es/ir/path/step.d.ts +395 -223
  66. package/dist/es/ir/path/step.d.ts.map +1 -1
  67. package/dist/es/ir/path/step.js +13 -14
  68. package/dist/es/ir/path/target.d.ts +25 -16
  69. package/dist/es/ir/path/target.d.ts.map +1 -1
  70. package/dist/es/ir/path/target.js +8 -6
  71. package/dist/es/ir/position/at-position.d.ts +43 -0
  72. package/dist/es/ir/position/at-position.d.ts.map +1 -0
  73. package/dist/es/ir/position/at-position.js +23 -0
  74. package/dist/es/ir/position/index.d.ts +2 -0
  75. package/dist/es/ir/position/index.d.ts.map +1 -1
  76. package/dist/es/ir/position/offset-position.d.ts +14 -0
  77. package/dist/es/ir/position/offset-position.d.ts.map +1 -0
  78. package/dist/es/ir/position/offset-position.js +14 -0
  79. package/dist/es/ir/position/polar-position.d.ts +1 -4
  80. package/dist/es/ir/position/polar-position.d.ts.map +1 -1
  81. package/dist/es/ir/position/polar-position.js +1 -4
  82. package/dist/es/ir/scene.d.ts +1736 -386
  83. package/dist/es/ir/scene.d.ts.map +1 -1
  84. package/dist/es/ir/scene.js +6 -1
  85. package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
  86. package/dist/es/parsers/parseTargetSugar.js +6 -19
  87. package/dist/es/parsers/parseWay.d.ts +26 -118
  88. package/dist/es/parsers/parseWay.d.ts.map +1 -1
  89. package/dist/es/parsers/parseWay.js +19 -61
  90. package/dist/es/primitive/ellipse.d.ts +4 -14
  91. package/dist/es/primitive/ellipse.d.ts.map +1 -1
  92. package/dist/es/primitive/group.d.ts +21 -3
  93. package/dist/es/primitive/group.d.ts.map +1 -1
  94. package/dist/es/primitive/path.d.ts +67 -7
  95. package/dist/es/primitive/path.d.ts.map +1 -1
  96. package/dist/es/primitive/scene.d.ts +2 -4
  97. package/dist/es/primitive/scene.d.ts.map +1 -1
  98. package/dist/es/primitive/text.d.ts +9 -32
  99. package/dist/es/primitive/text.d.ts.map +1 -1
  100. package/dist/lib/compile/compile.cjs +31 -8
  101. package/dist/lib/compile/compile.d.ts +9 -10
  102. package/dist/lib/compile/compile.d.ts.map +1 -1
  103. package/dist/lib/compile/node.cjs +137 -39
  104. package/dist/lib/compile/node.d.ts +56 -54
  105. package/dist/lib/compile/node.d.ts.map +1 -1
  106. package/dist/lib/compile/parseTarget.cjs +7 -19
  107. package/dist/lib/compile/parseTarget.d.ts +3 -8
  108. package/dist/lib/compile/parseTarget.d.ts.map +1 -1
  109. package/dist/lib/compile/path.cjs +231 -212
  110. package/dist/lib/compile/path.d.ts +2 -19
  111. package/dist/lib/compile/path.d.ts.map +1 -1
  112. package/dist/lib/compile/position.cjs +32 -5
  113. package/dist/lib/compile/position.d.ts +4 -5
  114. package/dist/lib/compile/position.d.ts.map +1 -1
  115. package/dist/lib/compile/text-metrics.d.ts +2 -4
  116. package/dist/lib/compile/text-metrics.d.ts.map +1 -1
  117. package/dist/lib/compile/view-box.cjs +1 -4
  118. package/dist/lib/compile/view-box.d.ts +1 -4
  119. package/dist/lib/compile/view-box.d.ts.map +1 -1
  120. package/dist/lib/geometry/arc.cjs +3 -31
  121. package/dist/lib/geometry/arc.d.ts +3 -28
  122. package/dist/lib/geometry/arc.d.ts.map +1 -1
  123. package/dist/lib/geometry/bend.cjs +2 -13
  124. package/dist/lib/geometry/bend.d.ts +2 -13
  125. package/dist/lib/geometry/bend.d.ts.map +1 -1
  126. package/dist/lib/geometry/circle.cjs +1 -4
  127. package/dist/lib/geometry/circle.d.ts +5 -13
  128. package/dist/lib/geometry/circle.d.ts.map +1 -1
  129. package/dist/lib/geometry/diamond.cjs +4 -14
  130. package/dist/lib/geometry/diamond.d.ts +9 -24
  131. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  132. package/dist/lib/geometry/ellipse.cjs +4 -8
  133. package/dist/lib/geometry/ellipse.d.ts +9 -15
  134. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  135. package/dist/lib/geometry/point.cjs +8 -9
  136. package/dist/lib/geometry/point.d.ts +8 -9
  137. package/dist/lib/geometry/point.d.ts.map +1 -1
  138. package/dist/lib/geometry/polar.cjs +7 -14
  139. package/dist/lib/geometry/polar.d.ts +12 -21
  140. package/dist/lib/geometry/polar.d.ts.map +1 -1
  141. package/dist/lib/geometry/rect.cjs +7 -33
  142. package/dist/lib/geometry/rect.d.ts +8 -32
  143. package/dist/lib/geometry/rect.d.ts.map +1 -1
  144. package/dist/lib/geometry/segment.cjs +9 -16
  145. package/dist/lib/geometry/segment.d.ts +11 -18
  146. package/dist/lib/geometry/segment.d.ts.map +1 -1
  147. package/dist/lib/index.cjs +15 -2
  148. package/dist/lib/index.d.ts +6 -10
  149. package/dist/lib/index.d.ts.map +1 -1
  150. package/dist/lib/ir/coordinate.cjs +22 -0
  151. package/dist/lib/ir/coordinate.d.ts +65 -0
  152. package/dist/lib/ir/coordinate.d.ts.map +1 -0
  153. package/dist/lib/ir/index.d.ts +1 -0
  154. package/dist/lib/ir/index.d.ts.map +1 -1
  155. package/dist/lib/ir/node.cjs +32 -37
  156. package/dist/lib/ir/node.d.ts +290 -50
  157. package/dist/lib/ir/node.d.ts.map +1 -1
  158. package/dist/lib/ir/path/arrow.cjs +43 -11
  159. package/dist/lib/ir/path/arrow.d.ts +210 -12
  160. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  161. package/dist/lib/ir/path/path.cjs +1 -1
  162. package/dist/lib/ir/path/path.d.ts +477 -153
  163. package/dist/lib/ir/path/path.d.ts.map +1 -1
  164. package/dist/lib/ir/path/step.cjs +13 -14
  165. package/dist/lib/ir/path/step.d.ts +395 -223
  166. package/dist/lib/ir/path/step.d.ts.map +1 -1
  167. package/dist/lib/ir/path/target.cjs +9 -7
  168. package/dist/lib/ir/path/target.d.ts +25 -16
  169. package/dist/lib/ir/path/target.d.ts.map +1 -1
  170. package/dist/lib/ir/position/at-position.cjs +24 -0
  171. package/dist/lib/ir/position/at-position.d.ts +43 -0
  172. package/dist/lib/ir/position/at-position.d.ts.map +1 -0
  173. package/dist/lib/ir/position/index.d.ts +2 -0
  174. package/dist/lib/ir/position/index.d.ts.map +1 -1
  175. package/dist/lib/ir/position/offset-position.cjs +14 -0
  176. package/dist/lib/ir/position/offset-position.d.ts +14 -0
  177. package/dist/lib/ir/position/offset-position.d.ts.map +1 -0
  178. package/dist/lib/ir/position/polar-position.cjs +1 -4
  179. package/dist/lib/ir/position/polar-position.d.ts +1 -4
  180. package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
  181. package/dist/lib/ir/scene.cjs +6 -1
  182. package/dist/lib/ir/scene.d.ts +1736 -386
  183. package/dist/lib/ir/scene.d.ts.map +1 -1
  184. package/dist/lib/parsers/parseTargetSugar.cjs +6 -19
  185. package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
  186. package/dist/lib/parsers/parseWay.cjs +19 -61
  187. package/dist/lib/parsers/parseWay.d.ts +26 -118
  188. package/dist/lib/parsers/parseWay.d.ts.map +1 -1
  189. package/dist/lib/primitive/ellipse.d.ts +4 -14
  190. package/dist/lib/primitive/ellipse.d.ts.map +1 -1
  191. package/dist/lib/primitive/group.d.ts +21 -3
  192. package/dist/lib/primitive/group.d.ts.map +1 -1
  193. package/dist/lib/primitive/path.d.ts +67 -7
  194. package/dist/lib/primitive/path.d.ts.map +1 -1
  195. package/dist/lib/primitive/scene.d.ts +2 -4
  196. package/dist/lib/primitive/scene.d.ts.map +1 -1
  197. package/dist/lib/primitive/text.d.ts +9 -32
  198. package/dist/lib/primitive/text.d.ts.map +1 -1
  199. package/package.json +1 -1
@@ -1,9 +1,8 @@
1
- import { IRPosition, PolarPosition } from '../ir';
1
+ import { IRAtPosition, IROffsetPosition, IRPosition, PolarPosition } from '../ir';
2
2
  import { NodeLayout } from './node';
3
3
  /**
4
- * IR 里出现的位置形态(笛卡尔 / 极坐标 / 节点 id)解析为笛卡尔位置。
5
- * 极坐标的 origin 可递归 / 可引用节点 id;按节点定义顺序处理(前向引用要求节点先定义)。
6
- * 解析失败返回 null(如引用了未定义节点)。
4
+ * IR 各种位置形态(笛卡尔/极坐标/相对定位/偏移定位/节点 id)→ 笛卡尔位置
5
+ * @description 极坐标 origin / 偏移定位 of 均可递归引用节点 id 或字面坐标;relative `AtPosition` of 必须引用已定义节点/coordinate;解析失败返回 null。nodeDistance 为容器 prop 注入默认距离,AtPosition 自带 distance 优先
7
6
  */
8
- export declare const resolvePosition: (pos: IRPosition | PolarPosition | string, nodeMap: Map<string, NodeLayout>) => IRPosition | null;
7
+ export declare const resolvePosition: (pos: IRPosition | PolarPosition | IRAtPosition | IROffsetPosition | string, nodeMap: Map<string, NodeLayout>, nodeDistance?: number) => IRPosition | null;
9
8
  //# sourceMappingURL=position.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/compile/position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,KAAK,UAAU,GAAG,aAAa,GAAG,MAAM,EACxC,SAAS,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KAC/B,UAAU,GAAG,IAoBf,CAAC"}
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/compile/position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAoBzC;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,KAAK,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAAG,MAAM,EAC1E,SAAS,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,eAAc,MAA8B,KAC3C,UAAU,GAAG,IAkCf,CAAC"}
@@ -1,19 +1,46 @@
1
1
  //#region src/compile/position.ts
2
+ /** 默认相对定位距离(CompileOptions.nodeDistance 未配时使用) */
3
+ var DEFAULT_NODE_DISTANCE = 1;
2
4
  /**
3
- * IR 里出现的位置形态(笛卡尔 / 极坐标 / 节点 id)解析为笛卡尔位置。
4
- * 极坐标的 origin 可递归 / 可引用节点 id;按节点定义顺序处理(前向引用要求节点先定义)。
5
- * 解析失败返回 null(如引用了未定义节点)。
5
+ * 8 方向 屏幕坐标系(y 向下)单位向量
6
+ * @description above=视觉上方 (y 减小);4 对角分量 1/√2 保证斜向与水平/垂直距离等长(对角点落在半径=distance 圆周上)
6
7
  */
7
- var resolvePosition = (pos, nodeMap) => {
8
+ var DIRECTION_VECTOR = {
9
+ above: [0, -1],
10
+ below: [0, 1],
11
+ left: [-1, 0],
12
+ right: [1, 0],
13
+ "above-left": [-Math.SQRT1_2, -Math.SQRT1_2],
14
+ "above-right": [Math.SQRT1_2, -Math.SQRT1_2],
15
+ "below-left": [-Math.SQRT1_2, Math.SQRT1_2],
16
+ "below-right": [Math.SQRT1_2, Math.SQRT1_2]
17
+ };
18
+ /**
19
+ * IR 各种位置形态(笛卡尔/极坐标/相对定位/偏移定位/节点 id)→ 笛卡尔位置
20
+ * @description 极坐标 origin / 偏移定位 of 均可递归引用节点 id 或字面坐标;relative `AtPosition` of 必须引用已定义节点/coordinate;解析失败返回 null。nodeDistance 为容器 prop 注入默认距离,AtPosition 自带 distance 优先
21
+ */
22
+ var resolvePosition = (pos, nodeMap, nodeDistance = DEFAULT_NODE_DISTANCE) => {
8
23
  if (typeof pos === "string") {
9
24
  const node = nodeMap.get(pos);
10
25
  return node ? [node.rect.x, node.rect.y] : null;
11
26
  }
12
27
  if (Array.isArray(pos)) return pos;
28
+ if ("direction" in pos) {
29
+ const ref = nodeMap.get(pos.of);
30
+ if (!ref) return null;
31
+ const distance = pos.distance ?? nodeDistance;
32
+ const [dx, dy] = DIRECTION_VECTOR[pos.direction];
33
+ return [ref.rect.x + dx * distance, ref.rect.y + dy * distance];
34
+ }
35
+ if ("offset" in pos) {
36
+ const base = resolvePosition(pos.of, nodeMap, nodeDistance);
37
+ if (!base) return null;
38
+ return [base[0] + pos.offset[0], base[1] + pos.offset[1]];
39
+ }
13
40
  let origin;
14
41
  if (!pos.origin) origin = [0, 0];
15
42
  else {
16
- const resolved = resolvePosition(pos.origin, nodeMap);
43
+ const resolved = resolvePosition(pos.origin, nodeMap, nodeDistance);
17
44
  if (!resolved) return null;
18
45
  origin = resolved;
19
46
  }
@@ -21,10 +21,8 @@ export type TextMetrics = {
21
21
  descent?: number;
22
22
  };
23
23
  /**
24
- * 文字度量函数接口(编译期由 adapter 注入)。
25
- * - @retikz/react:用 canvas measureText
26
- * - @retikz/ssr:用 opentype.js / fontkit
27
- * - @retikz/canvas:用 ctx.measureText
24
+ * 文字度量函数接口(编译期由 adapter 注入)
25
+ * @description @retikz/react: canvas measureText;@retikz/ssr: opentype.js/fontkit;@retikz/canvas: ctx.measureText
28
26
  */
29
27
  export type TextMeasurer = (text: string, font: FontSpec) => TextMetrics;
30
28
  /** 默认 fallback 度量:基于平均字宽估算,不准但保证可运行 */
@@ -1 +1 @@
1
- {"version":3,"file":"text-metrics.d.ts","sourceRoot":"","sources":["../../../src/compile/text-metrics.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,MAAM,QAAQ,GAAG;IACrB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,mCAAmC;IACnC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC;AAEzE,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,EAAE,YAG7B,CAAC"}
1
+ {"version":3,"file":"text-metrics.d.ts","sourceRoot":"","sources":["../../../src/compile/text-metrics.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,MAAM,QAAQ,GAAG;IACrB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,mCAAmC;IACnC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC;AAEzE,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,EAAE,YAG7B,CAAC"}
@@ -1,8 +1,5 @@
1
1
  import { IRPosition } from '../ir';
2
2
  import { ViewBox } from '../primitive';
3
- /**
4
- * 由所有"贡献给 bbox"的点算出 viewBox(含四周 padding)。
5
- * points 为空时返回固定的 100×100 兜底框。
6
- */
3
+ /** 由所有 bbox 候选点算出 viewBox(含 padding);points 为空时返回 100×100 兜底 */
7
4
  export declare const computeViewBox: (points: Array<IRPosition>, padding: number, round: (n: number) => number) => ViewBox;
8
5
  //# sourceMappingURL=view-box.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view-box.d.ts","sourceRoot":"","sources":["../../../src/compile/view-box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,KAAK,CAAC,UAAU,CAAC,EACzB,SAAS,MAAM,EACf,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAC3B,OAkBF,CAAC"}
1
+ {"version":3,"file":"view-box.d.ts","sourceRoot":"","sources":["../../../src/compile/view-box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,gEAAgE;AAChE,eAAO,MAAM,cAAc,GACzB,QAAQ,KAAK,CAAC,UAAU,CAAC,EACzB,SAAS,MAAM,EACf,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAC3B,OAkBF,CAAC"}
@@ -1,8 +1,5 @@
1
1
  //#region src/compile/view-box.ts
2
- /**
3
- * 由所有"贡献给 bbox"的点算出 viewBox(含四周 padding)。
4
- * points 为空时返回固定的 100×100 兜底框。
5
- */
2
+ /** 由所有 bbox 候选点算出 viewBox(含 padding);points 为空时返回 100×100 兜底 */
6
3
  var computeViewBox = (points, padding, round) => {
7
4
  if (points.length === 0) return {
8
5
  x: 0,
@@ -1,34 +1,9 @@
1
1
  import { Position } from './point';
2
- /**
3
- * 给定圆心、半径、角度(度,与 polar.toPosition 同约定),返回圆周上对应点。
4
- */
2
+ /** 圆心、半径、角度(度,与 polar.toPosition 同约定)→ 圆周上对应点 */
5
3
  export declare const arcEndPoint: (center: Position, radius: number, angleDeg: number) => Position;
6
4
  /**
7
- * 计算 SVG `<path>` A 命令需要的 large-arc-flag 与 sweep-flag。
8
- *
9
- * - `largeArc`:弧跨度 `|endAngle - startAngle|` 严格大于 180° 时为 1。
10
- * - `sweep`:`endAngle >= startAngle` 时为 1,否则为 0;与"角度增加方向 = 在
11
- * SVG 屏幕上视觉顺时针"一致——因为我们投影时未翻转 y,SVG sweep=1(屏幕 CW)
12
- * 恰好等价 math 角度增加。
13
- *
14
- * 边界:`|Δ|=180°` 时 `largeArc=0`(半弧不算大弧);恰好同点 `|Δ|=0` 也返回 0。
15
- */
16
- export declare const arcSvgFlags: (startAngleDeg: number, endAngleDeg: number) => {
17
- largeArc: 0 | 1;
18
- sweep: 0 | 1;
19
- };
20
- /**
21
- * 弧的 bounding box 极值候选点:起点、终点,以及 `[startAngle, endAngle]` 区间
22
- * 里所有 90°·k 的基本方向(0°、90°、180°、270° 及其周期延拓)对应的圆周点。
23
- *
24
- * 这些点是计算视图框(viewBox)/ bbox 时必须考虑的候选——因为弧线投影到 x/y
25
- * 轴的极值只可能在弧端点或圆周上的轴向四点处出现。
26
- *
27
- * 说明:
28
- * - 接受 `endAngle < startAngle`(CW math 方向):以 `min..max` 区间扫描 90°·k;
29
- * 语义上是"无论扫描方向,此弧覆盖到的角度区间内的基本方向都算极值候选"。
30
- * - 跨 360°(如 270° → 450°)也按数值区间处理,正确收录中间穿越的 0°、90° 等。
31
- * - 不去重:若起点恰好落在 90°·k 上会同时出现两次,调用方根据需要再处理。
5
+ * 弧的 bbox 极值候选:起点、终点,加 [startAngle,endAngle] 内所有 90°·k 方向的圆周点
6
+ * @description 弧投影到 x/y 轴的极值只可能在弧端点或圆周轴向四点出现。endAngle < startAngle 时按 min..max 扫描;跨 360°(270→450)按数值区间正确处理;不去重——端角恰在 90°·k 上时调用方处理
32
7
  */
33
8
  export declare const arcBoundingPoints: (center: Position, radius: number, startAngleDeg: number, endAngleDeg: number) => Array<Position>;
34
9
  //# sourceMappingURL=arc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arc.d.ts","sourceRoot":"","sources":["../../../src/geometry/arc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBxC;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,QAMF,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACtB,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB;IAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;CAMjC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,KAAK,CAAC,QAAQ,CAmBhB,CAAC"}
1
+ {"version":3,"file":"arc.d.ts","sourceRoot":"","sources":["../../../src/geometry/arc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWxC,iDAAiD;AACjD,eAAO,MAAM,WAAW,GACtB,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,QAMF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,KAAK,CAAC,QAAQ,CAiBhB,CAAC"}
@@ -1,40 +1,13 @@
1
1
  //#region src/geometry/arc.ts
2
2
  var DEG_TO_RAD = Math.PI / 180;
3
- /**
4
- * 给定圆心、半径、角度(度,与 polar.toPosition 同约定),返回圆周上对应点。
5
- */
3
+ /** 圆心、半径、角度(度,与 polar.toPosition 同约定)→ 圆周上对应点 */
6
4
  var arcEndPoint = (center, radius, angleDeg) => {
7
5
  const rad = angleDeg * DEG_TO_RAD;
8
6
  return [center[0] + Math.cos(rad) * radius, center[1] + Math.sin(rad) * radius];
9
7
  };
10
8
  /**
11
- * 计算 SVG `<path>` A 命令需要的 large-arc-flag 与 sweep-flag。
12
- *
13
- * - `largeArc`:弧跨度 `|endAngle - startAngle|` 严格大于 180° 时为 1。
14
- * - `sweep`:`endAngle >= startAngle` 时为 1,否则为 0;与"角度增加方向 = 在
15
- * SVG 屏幕上视觉顺时针"一致——因为我们投影时未翻转 y,SVG sweep=1(屏幕 CW)
16
- * 恰好等价 math 角度增加。
17
- *
18
- * 边界:`|Δ|=180°` 时 `largeArc=0`(半弧不算大弧);恰好同点 `|Δ|=0` 也返回 0。
19
- */
20
- var arcSvgFlags = (startAngleDeg, endAngleDeg) => {
21
- return {
22
- largeArc: Math.abs(endAngleDeg - startAngleDeg) > 180 ? 1 : 0,
23
- sweep: endAngleDeg >= startAngleDeg ? 1 : 0
24
- };
25
- };
26
- /**
27
- * 弧的 bounding box 极值候选点:起点、终点,以及 `[startAngle, endAngle]` 区间
28
- * 里所有 90°·k 的基本方向(0°、90°、180°、270° 及其周期延拓)对应的圆周点。
29
- *
30
- * 这些点是计算视图框(viewBox)/ bbox 时必须考虑的候选——因为弧线投影到 x/y
31
- * 轴的极值只可能在弧端点或圆周上的轴向四点处出现。
32
- *
33
- * 说明:
34
- * - 接受 `endAngle < startAngle`(CW math 方向):以 `min..max` 区间扫描 90°·k;
35
- * 语义上是"无论扫描方向,此弧覆盖到的角度区间内的基本方向都算极值候选"。
36
- * - 跨 360°(如 270° → 450°)也按数值区间处理,正确收录中间穿越的 0°、90° 等。
37
- * - 不去重:若起点恰好落在 90°·k 上会同时出现两次,调用方根据需要再处理。
9
+ * 弧的 bbox 极值候选:起点、终点,加 [startAngle,endAngle] 内所有 90°·k 方向的圆周点
10
+ * @description 弧投影到 x/y 轴的极值只可能在弧端点或圆周轴向四点出现。endAngle < startAngle 时按 min..max 扫描;跨 360°(270→450)按数值区间正确处理;不去重——端角恰在 90°·k 上时调用方处理
38
11
  */
39
12
  var arcBoundingPoints = (center, radius, startAngleDeg, endAngleDeg) => {
40
13
  const points = [arcEndPoint(center, radius, startAngleDeg), arcEndPoint(center, radius, endAngleDeg)];
@@ -50,4 +23,4 @@ var arcBoundingPoints = (center, radius, startAngleDeg, endAngleDeg) => {
50
23
  return points;
51
24
  };
52
25
  //#endregion
53
- export { arcBoundingPoints, arcEndPoint, arcSvgFlags };
26
+ export { arcBoundingPoints, arcEndPoint };
@@ -1,18 +1,7 @@
1
1
  import { Position } from './point';
2
2
  /**
3
- * cubic Bezier 拟合 from→to 的弧形 bend
4
- *
5
- * 算法(ADR-0001):
6
- * 1. apex offset = chord × tan(bendAngle / 2)(沿 path 法向 left / right 偏移量)
7
- * 2. 控制点取 chord 1/3 / 2/3 处沿法向偏移;为让 cubic 在 t=0.5 处穿过 apex,
8
- * 控制点 offset = (4/3) × apex offset(推导:B(0.5) = midpoint + (3/4)·s·n)
9
- *
10
- * 法向定义(SVG y 向下,"left/right" 按视觉,不按数学):
11
- * chord direction = (dx, dy) / |chord|
12
- * visual-left normal = ( dy, -dx) / |chord| (从 from 看向 to,向左偏)
13
- * visual-right normal = (-dy, dx) / |chord|
14
- *
15
- * chord 长度为 0 时无方向可推,两个控制点都返回 from。
3
+ * cubic Bezier 拟合 from→to 的弧形 bend
4
+ * @description apex offset = chord × tan(bendAngle/2);控制点取 chord 1/3 与 2/3 处沿法向偏移,让 cubic 在 t=0.5 穿过 apex 故 ctlOffset = 4/3 × apexOffset。法向 SVG y-down:visual-left=(dy,-dx)/|chord|,visual-right=(-dy,dx)/|chord|。chord=0 时两控制点都返回 from
16
5
  */
17
6
  export declare const bendControlPoints: (from: Position, to: Position, direction: "left" | "right", bendAngle: number) => [Position, Position];
18
7
  //# sourceMappingURL=bend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bend.d.ts","sourceRoot":"","sources":["../../../src/geometry/bend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,WAAW,MAAM,GAAG,OAAO,EAC3B,WAAW,MAAM,KAChB,CAAC,QAAQ,EAAE,QAAQ,CAgBrB,CAAC"}
1
+ {"version":3,"file":"bend.d.ts","sourceRoot":"","sources":["../../../src/geometry/bend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,WAAW,MAAM,GAAG,OAAO,EAC3B,WAAW,MAAM,KAChB,CAAC,QAAQ,EAAE,QAAQ,CAgBrB,CAAC"}
@@ -1,18 +1,7 @@
1
1
  //#region src/geometry/bend.ts
2
2
  /**
3
- * cubic Bezier 拟合 from→to 的弧形 bend
4
- *
5
- * 算法(ADR-0001):
6
- * 1. apex offset = chord × tan(bendAngle / 2)(沿 path 法向 left / right 偏移量)
7
- * 2. 控制点取 chord 1/3 / 2/3 处沿法向偏移;为让 cubic 在 t=0.5 处穿过 apex,
8
- * 控制点 offset = (4/3) × apex offset(推导:B(0.5) = midpoint + (3/4)·s·n)
9
- *
10
- * 法向定义(SVG y 向下,"left/right" 按视觉,不按数学):
11
- * chord direction = (dx, dy) / |chord|
12
- * visual-left normal = ( dy, -dx) / |chord| (从 from 看向 to,向左偏)
13
- * visual-right normal = (-dy, dx) / |chord|
14
- *
15
- * chord 长度为 0 时无方向可推,两个控制点都返回 from。
3
+ * cubic Bezier 拟合 from→to 的弧形 bend
4
+ * @description apex offset = chord × tan(bendAngle/2);控制点取 chord 1/3 与 2/3 处沿法向偏移,让 cubic 在 t=0.5 穿过 apex 故 ctlOffset = 4/3 × apexOffset。法向 SVG y-down:visual-left=(dy,-dx)/|chord|,visual-right=(-dy,dx)/|chord|。chord=0 时两控制点都返回 from
16
5
  */
17
6
  var bendControlPoints = (from, to, direction, bendAngle) => {
18
7
  const dx = to[0] - from[0];
@@ -1,19 +1,14 @@
1
1
  import { Position } from './point';
2
- /** 圆形:几何中心 (x, y) + 半径;与 Rect 一样支持可选旋转(圆对自身旋转无影响,预留供 anchor 命名一致性) */
2
+ /** 圆形:几何中心 + 半径,预留旋转字段保持与 Rect 同形 API */
3
3
  export type Circle = {
4
- /** 圆心横坐标 */
5
4
  x: number;
6
- /** 圆心纵坐标 */
7
5
  y: number;
8
- /** 半径(user units) */
6
+ /** 半径 */
9
7
  radius: number;
10
- /** 绕几何中心旋转弧度;保留与 Rect 同形 API,圆形本身旋转后视觉不变 */
8
+ /** 绕中心旋转弧度(圆视觉不变,与 Rect 同形保留) */
11
9
  rotate?: number;
12
10
  };
13
- /**
14
- * 圆形 9 个标准 anchor 名集合,与 RECT_ANCHORS 同名同义。
15
- * 圆的"4 方位 + 4 对角"在圆周上等距分布(每 45°)。
16
- */
11
+ /** 圆形 9 个标准 anchor(与 RECT_ANCHORS 同名同义,圆周每 45° 等距分布) */
17
12
  export type CircleAnchor = 'center' | 'north' | 'south' | 'east' | 'west' | 'north-east' | 'north-west' | 'south-east' | 'south-west';
18
13
  /** 圆形相关基础工具 */
19
14
  export declare const circle: {
@@ -23,10 +18,7 @@ export declare const circle: {
23
18
  contains: (c: Circle, p: Position) => boolean;
24
19
  /** 9 个标准 anchor 之一的世界坐标 */
25
20
  anchor: (c: Circle, name: CircleAnchor) => Position;
26
- /**
27
- * 从圆心向 toward 方向画射线,求与圆周的交点。
28
- * 用于把 Path 端点贴到 Node 边界。
29
- */
21
+ /** 从圆心向 toward 方向射线与圆周交点(Path 端点贴 Node 边界用) */
30
22
  boundaryPoint: (c: Circle, toward: Position) => Position;
31
23
  };
32
24
  //# sourceMappingURL=circle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"circle.d.ts","sourceRoot":"","sources":["../../../src/geometry/circle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,sEAAsE;AACtE,MAAM,MAAM,MAAM,GAAG;IACnB,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,MAAM;IACjB,SAAS;gBACG,MAAM,KAAG,QAAQ;IAC7B,oBAAoB;kBACN,MAAM,KAAK,QAAQ,KAAG,OAAO;IAI3C,2BAA2B;gBACf,MAAM,QAAQ,YAAY,KAAG,QAAQ;IAsCjD;;;OAGG;uBACgB,MAAM,UAAU,QAAQ,KAAG,QAAQ;CAOvD,CAAC"}
1
+ {"version":3,"file":"circle.d.ts","sourceRoot":"","sources":["../../../src/geometry/circle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS;IACT,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,wDAAwD;AACxD,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,MAAM;IACjB,SAAS;gBACG,MAAM,KAAG,QAAQ;IAC7B,oBAAoB;kBACN,MAAM,KAAK,QAAQ,KAAG,OAAO;IAI3C,2BAA2B;gBACf,MAAM,QAAQ,YAAY,KAAG,QAAQ;IAsCjD,+CAA+C;uBAC5B,MAAM,UAAU,QAAQ,KAAG,QAAQ;CAOvD,CAAC"}
@@ -63,10 +63,7 @@ var circle = {
63
63
  }
64
64
  return localToWorld(c, [lx, ly]);
65
65
  },
66
- /**
67
- * 从圆心向 toward 方向画射线,求与圆周的交点。
68
- * 用于把 Path 端点贴到 Node 边界。
69
- */
66
+ /** 从圆心向 toward 方向射线与圆周交点(Path 端点贴 Node 边界用) */
70
67
  boundaryPoint: (c, toward) => {
71
68
  const [lx, ly] = worldToLocal(c, toward);
72
69
  const len = Math.sqrt(lx * lx + ly * ly);
@@ -1,43 +1,28 @@
1
1
  import { Position } from './point';
2
- /**
3
- * 菱形:几何中心 (x, y) + 半轴长 halfA(水平)/ halfB(垂直)+ 可选旋转。
4
- * 4 个顶点位于 (±halfA, 0) 与 (0, ±halfB),4 条边界线把这些顶点两两相连。
5
- */
2
+ /** 菱形:中心 + halfA/halfB 半轴长 + 可选旋转;顶点在 (±halfA,0) 与 (0,±halfB) */
6
3
  export type Diamond = {
7
- /** 中心横坐标 */
8
4
  x: number;
9
- /** 中心纵坐标 */
10
5
  y: number;
11
- /** 水平半轴长(中心到 east/west 顶点的距离) */
6
+ /** 中心到 east/west 顶点距离 */
12
7
  halfA: number;
13
- /** 垂直半轴长(中心到 north/south 顶点的距离) */
8
+ /** 中心到 north/south 顶点距离 */
14
9
  halfB: number;
15
- /** 绕几何中心旋转弧度;省略或 0 表示不旋转 */
10
+ /** 绕中心旋转弧度 */
16
11
  rotate?: number;
17
12
  };
18
- /** 菱形 9 个标准 anchor 名(4 顶点 + 4 边中点 + 中心) */
13
+ /** 菱形 9 个标准 anchor4 顶点 + 4 边中点 + 中心) */
19
14
  export type DiamondAnchor = 'center' | 'north' | 'south' | 'east' | 'west' | 'north-east' | 'north-west' | 'south-east' | 'south-west';
20
15
  /** 菱形相关基础工具 */
21
16
  export declare const diamond: {
22
17
  /** 中心 */
23
18
  center: (d: Diamond) => Position;
24
- /**
25
- * 判断点是否在菱形内(含边界,考虑旋转)。
26
- * 菱形方程:|x|/halfA + |y|/halfB ≤ 1。
27
- */
19
+ /** 点是否在菱形内(含边界,含旋转);方程 |x|/halfA + |y|/halfB ≤ 1 */
28
20
  contains: (d: Diamond, p: Position) => boolean;
29
- /**
30
- * 9 个标准 anchor 的世界坐标。
31
- * - N/S/E/W:四个顶点
32
- * - NE/NW/SE/SW:四条边的中点
33
- * - center:几何中心
34
- */
21
+ /** 9 个 anchor:N/S/E/W=顶点,NE/NW/SE/SW=边中点,center=中心 */
35
22
  anchor: (d: Diamond, name: DiamondAnchor) => Position;
36
23
  /**
37
- * 从中心向 toward 方向画射线,求与菱形 4 条边之一的交点。
38
- * 菱形方程:|x|/halfA + |y|/halfB = 1
39
- * 沿方向 (lx, ly) 缩放 t 倍命中:t × (|lx|/halfA + |ly|/halfB) = 1
40
- * → t = 1 / (|lx|/halfA + |ly|/halfB)。
24
+ * 从中心向 toward 方向射线与菱形 4 边的交点
25
+ * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
41
26
  */
42
27
  boundaryPoint: (d: Diamond, toward: Position) => Position;
43
28
  };
@@ -1 +1 @@
1
- {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B;;;OAGG;kBACW,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C;;;;;OAKG;gBACS,OAAO,QAAQ,aAAa,KAAG,QAAQ;IAqCnD;;;;;OAKG;uBACgB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAOxD,CAAC"}
1
+ {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C,sDAAsD;gBAC1C,OAAO,QAAQ,aAAa,KAAG,QAAQ;IAqCrD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAOxD,CAAC"}
@@ -19,20 +19,12 @@ var worldToLocal = (d, world) => {
19
19
  var diamond = {
20
20
  /** 中心 */
21
21
  center: (d) => [d.x, d.y],
22
- /**
23
- * 判断点是否在菱形内(含边界,考虑旋转)。
24
- * 菱形方程:|x|/halfA + |y|/halfB ≤ 1。
25
- */
22
+ /** 点是否在菱形内(含边界,含旋转);方程 |x|/halfA + |y|/halfB ≤ 1 */
26
23
  contains: (d, p) => {
27
24
  const [lx, ly] = worldToLocal(d, p);
28
25
  return Math.abs(lx) / d.halfA + Math.abs(ly) / d.halfB <= 1.000000001;
29
26
  },
30
- /**
31
- * 9 个标准 anchor 的世界坐标。
32
- * - N/S/E/W:四个顶点
33
- * - NE/NW/SE/SW:四条边的中点
34
- * - center:几何中心
35
- */
27
+ /** 9 个 anchor:N/S/E/W=顶点,NE/NW/SE/SW=边中点,center=中心 */
36
28
  anchor: (d, name) => {
37
29
  let lx = 0;
38
30
  let ly = 0;
@@ -70,10 +62,8 @@ var diamond = {
70
62
  return localToWorld(d, [lx, ly]);
71
63
  },
72
64
  /**
73
- * 从中心向 toward 方向画射线,求与菱形 4 条边之一的交点。
74
- * 菱形方程:|x|/halfA + |y|/halfB = 1
75
- * 沿方向 (lx, ly) 缩放 t 倍命中:t × (|lx|/halfA + |ly|/halfB) = 1
76
- * → t = 1 / (|lx|/halfA + |ly|/halfB)。
65
+ * 从中心向 toward 方向射线与菱形 4 边的交点
66
+ * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
77
67
  */
78
68
  boundaryPoint: (d, toward) => {
79
69
  const [lx, ly] = worldToLocal(d, toward);
@@ -1,18 +1,16 @@
1
1
  import { Position } from './point';
2
- /** 椭圆:几何中心 (x, y) + 半长轴 rx / 半短轴 ry + 可选旋转(弧度) */
2
+ /** 椭圆:中心 + 半长轴 rx / 半短轴 ry + 可选旋转 */
3
3
  export type Ellipse = {
4
- /** 中心横坐标 */
5
4
  x: number;
6
- /** 中心纵坐标 */
7
5
  y: number;
8
- /** 半长轴(沿本地 +x 方向) */
6
+ /** 沿本地 +x */
9
7
  rx: number;
10
- /** 半短轴(沿本地 +y 方向) */
8
+ /** 沿本地 +y */
11
9
  ry: number;
12
- /** 绕几何中心旋转弧度;省略或 0 表示不旋转 */
10
+ /** 绕中心旋转弧度 */
13
11
  rotate?: number;
14
12
  };
15
- /** 椭圆 9 个标准 anchor 名(含义与 RECT_ANCHORS 一致) */
13
+ /** 椭圆 9 个标准 anchor(与 RECT_ANCHORS 同名同义) */
16
14
  export type EllipseAnchor = 'center' | 'north' | 'south' | 'east' | 'west' | 'north-east' | 'north-west' | 'south-east' | 'south-west';
17
15
  /** 椭圆相关基础工具 */
18
16
  export declare const ellipse: {
@@ -21,17 +19,13 @@ export declare const ellipse: {
21
19
  /** 判断点是否在椭圆内(含边界,考虑旋转) */
22
20
  contains: (e: Ellipse, p: Position) => boolean;
23
21
  /**
24
- * 9 个标准 anchor 的世界坐标。
25
- * 对角 anchor(NE/NW/SE/SW)取参数曲线 t=π/4 处的点:
26
- * (rx·cos(π/4), ry·sin(π/4)) = (rx/√2, ry/√2)。
27
- * 这与 TikZ 椭圆对角 anchor 的"参数等分"约定一致。
22
+ * 9 anchor 的世界坐标
23
+ * @description 对角(NE/NW/SE/SW)取参数曲线 t=π/4 处 (rx/√2, ry/√2),与 TikZ 椭圆 anchor 参数等分约定一致
28
24
  */
29
25
  anchor: (e: Ellipse, name: EllipseAnchor) => Position;
30
26
  /**
31
- * 从中心向 toward 方向画射线,求与椭圆的交点。
32
- * 椭圆方程:(x/rx)² + (y/ry)² = 1
33
- * 沿方向 (lx, ly) 缩放 t 倍命中:t² × ((lx/rx)² + (ly/ry)²) = 1
34
- * → t = 1 / √((lx/rx)² + (ly/ry)²)。
27
+ * 从中心向 toward 方向射线与椭圆交点
28
+ * @description 椭圆方程 (x/rx)² + (y/ry)² = 1;沿 (lx,ly) 缩放 t 倍命中 t = 1 / √((lx/rx)² + (ly/ry)²)
35
29
  */
36
30
  boundaryPoint: (e: Ellipse, toward: Position) => Position;
37
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,kDAAkD;AAClD,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C;;;;;OAKG;gBACS,OAAO,QAAQ,aAAa,KAAG,QAAQ;IAqCnD;;;;;OAKG;uBACgB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAQxD,CAAC"}
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,qCAAqC;AACrC,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAoBjB,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI9C;;;OAGG;gBACW,OAAO,QAAQ,aAAa,KAAG,QAAQ;IAqCrD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAQxD,CAAC"}
@@ -26,10 +26,8 @@ var ellipse = {
26
26
  return lx * lx / (e.rx * e.rx) + ly * ly / (e.ry * e.ry) <= 1;
27
27
  },
28
28
  /**
29
- * 9 个标准 anchor 的世界坐标。
30
- * 对角 anchor(NE/NW/SE/SW)取参数曲线 t=π/4 处的点:
31
- * (rx·cos(π/4), ry·sin(π/4)) = (rx/√2, ry/√2)。
32
- * 这与 TikZ 椭圆对角 anchor 的"参数等分"约定一致。
29
+ * 9 anchor 的世界坐标
30
+ * @description 对角(NE/NW/SE/SW)取参数曲线 t=π/4 处 (rx/√2, ry/√2),与 TikZ 椭圆 anchor 参数等分约定一致
33
31
  */
34
32
  anchor: (e, name) => {
35
33
  let lx = 0;
@@ -68,10 +66,8 @@ var ellipse = {
68
66
  return localToWorld(e, [lx, ly]);
69
67
  },
70
68
  /**
71
- * 从中心向 toward 方向画射线,求与椭圆的交点。
72
- * 椭圆方程:(x/rx)² + (y/ry)² = 1
73
- * 沿方向 (lx, ly) 缩放 t 倍命中:t² × ((lx/rx)² + (ly/ry)²) = 1
74
- * → t = 1 / √((lx/rx)² + (ly/ry)²)。
69
+ * 从中心向 toward 方向射线与椭圆交点
70
+ * @description 椭圆方程 (x/rx)² + (y/ry)² = 1;沿 (lx,ly) 缩放 t 倍命中 t = 1 / √((lx/rx)² + (ly/ry)²)
75
71
  */
76
72
  boundaryPoint: (e, toward) => {
77
73
  const [lx, ly] = worldToLocal(e, toward);
@@ -3,22 +3,21 @@ import { PolarPosition } from './polar';
3
3
  export type Position = [number, number];
4
4
  /** 二维向量 / 坐标的基础运算工具集 */
5
5
  export declare const point: {
6
- /** 两点相加(向量加法):a + b */
6
+ /** 向量加 a + b */
7
7
  add: (a: Position, b: Position) => Position;
8
- /** 两点相减(向量减法):a - b */
8
+ /** 向量减 a - b */
9
9
  sub: (a: Position, b: Position) => Position;
10
- /** 等比缩放:a * k */
10
+ /** 等比缩放 a * k */
11
11
  scale: (a: Position, k: number) => Position;
12
- /** 判断两点坐标是否完全相等(精确比较,不带容差) */
12
+ /** 两点精确相等(不带容差) */
13
13
  equal: (a: Position, b: Position) => boolean;
14
- /** 笛卡尔点 → 极坐标(angle 落在 (-180, 180],origin 取默认 [0, 0]) */
14
+ /** 笛卡尔 → 极坐标(angle (-180,180],origin 默认 [0,0]) */
15
15
  toPolar: (p: Position) => PolarPosition;
16
16
  /**
17
- * 判断两个点是否相同(跨坐标系)。每个参数可以是笛卡尔 [x, y] 或 PolarPosition
18
- * 极坐标先转为笛卡尔,再按 precision 指定的小数位数四舍五入比较。
19
- * `polar.equal` 委托到本方法。
17
+ * 跨坐标系两点相同判断(笛卡尔或 PolarPosition
18
+ * @description 极坐标先转笛卡尔再按 precision 四舍五入比较;polar.equal 委托到本方法
20
19
  * @param precision 小数点后位数;默认 2
21
- * @throws 当 PolarPositionorigin 是节点 id 字符串时——字符串解析需 Scene 上下文
20
+ * @throws 当 PolarPosition.origin 是节点 id 字符串时(需 Scene 上下文)
22
21
  */
23
22
  equalPolar: (a: Position | PolarPosition, b: Position | PolarPosition, precision?: number) => boolean;
24
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/geometry/point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAS,MAAM,SAAS,CAAC;AAEpD,oBAAoB;AACpB,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIxC,wBAAwB;AACxB,eAAO,MAAM,KAAK;IAChB,uBAAuB;aACd,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,uBAAuB;aACd,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,iBAAiB;eACN,QAAQ,KAAK,MAAM,KAAG,QAAQ;IACzC,8BAA8B;eACnB,QAAQ,KAAK,QAAQ,KAAG,OAAO;IAC1C,yDAAyD;iBAC5C,QAAQ,KAAG,aAAa;IAIrC;;;;;;OAMG;oBAEE,QAAQ,GAAG,aAAa,KACxB,QAAQ,GAAG,aAAa,yBAE1B,OAAO;CASX,CAAC"}
1
+ {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/geometry/point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAS,MAAM,SAAS,CAAC;AAEpD,oBAAoB;AACpB,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIxC,wBAAwB;AACxB,eAAO,MAAM,KAAK;IAChB,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,gBAAgB;aACP,QAAQ,KAAK,QAAQ,KAAG,QAAQ;IACzC,iBAAiB;eACN,QAAQ,KAAK,MAAM,KAAG,QAAQ;IACzC,mBAAmB;eACR,QAAQ,KAAK,QAAQ,KAAG,OAAO;IAC1C,oDAAoD;iBACvC,QAAQ,KAAG,aAAa;IAIrC;;;;;OAKG;oBAEE,QAAQ,GAAG,aAAa,KACxB,QAAQ,GAAG,aAAa,yBAE1B,OAAO;CASX,CAAC"}
@@ -3,25 +3,24 @@ import { polar } from "./polar.js";
3
3
  var RAD_TO_DEG = 180 / Math.PI;
4
4
  /** 二维向量 / 坐标的基础运算工具集 */
5
5
  var point = {
6
- /** 两点相加(向量加法):a + b */
6
+ /** 向量加 a + b */
7
7
  add: (a, b) => [a[0] + b[0], a[1] + b[1]],
8
- /** 两点相减(向量减法):a - b */
8
+ /** 向量减 a - b */
9
9
  sub: (a, b) => [a[0] - b[0], a[1] - b[1]],
10
- /** 等比缩放:a * k */
10
+ /** 等比缩放 a * k */
11
11
  scale: (a, k) => [a[0] * k, a[1] * k],
12
- /** 判断两点坐标是否完全相等(精确比较,不带容差) */
12
+ /** 两点精确相等(不带容差) */
13
13
  equal: (a, b) => a[0] === b[0] && a[1] === b[1],
14
- /** 笛卡尔点 → 极坐标(angle 落在 (-180, 180],origin 取默认 [0, 0]) */
14
+ /** 笛卡尔 → 极坐标(angle (-180,180],origin 默认 [0,0]) */
15
15
  toPolar: (p) => ({
16
16
  angle: Math.atan2(p[1], p[0]) * RAD_TO_DEG,
17
17
  radius: Math.hypot(p[0], p[1])
18
18
  }),
19
19
  /**
20
- * 判断两个点是否相同(跨坐标系)。每个参数可以是笛卡尔 [x, y] 或 PolarPosition
21
- * 极坐标先转为笛卡尔,再按 precision 指定的小数位数四舍五入比较。
22
- * `polar.equal` 委托到本方法。
20
+ * 跨坐标系两点相同判断(笛卡尔或 PolarPosition
21
+ * @description 极坐标先转笛卡尔再按 precision 四舍五入比较;polar.equal 委托到本方法
23
22
  * @param precision 小数点后位数;默认 2
24
- * @throws 当 PolarPositionorigin 是节点 id 字符串时——字符串解析需 Scene 上下文
23
+ * @throws 当 PolarPosition.origin 是节点 id 字符串时(需 Scene 上下文)
25
24
  */
26
25
  equalPolar: (a, b, precision = 2) => {
27
26
  const aCart = Array.isArray(a) ? a : polar.toPosition(a);