@retikz/core 0.3.0-beta.2 → 0.4.0-alpha.1

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 (72) hide show
  1. package/dist/es/compile/node.js +1 -1
  2. package/dist/es/compile/path/anchor.js +1 -1
  3. package/dist/es/compile/path/index.js +1 -1
  4. package/dist/es/compile/path/relative.js +1 -1
  5. package/dist/es/compile/path/shrink.js +1 -1
  6. package/dist/es/compile/position.js +1 -1
  7. package/dist/es/geometry/contour.d.ts +1 -1
  8. package/dist/es/geometry/contour.d.ts.map +1 -1
  9. package/dist/es/geometry/contour.js +5 -45
  10. package/dist/es/geometry/edge.d.ts +1 -2
  11. package/dist/es/geometry/edge.d.ts.map +1 -1
  12. package/dist/es/geometry/edge.js +2 -3
  13. package/dist/es/geometry/index.d.ts +0 -1
  14. package/dist/es/geometry/index.d.ts.map +1 -1
  15. package/dist/es/geometry/point.d.ts +1 -29
  16. package/dist/es/geometry/point.d.ts.map +1 -1
  17. package/dist/es/geometry/point.js +2 -50
  18. package/dist/es/geometry/polar.d.ts +2 -2
  19. package/dist/es/geometry/polar.d.ts.map +1 -1
  20. package/dist/es/geometry/polar.js +13 -5
  21. package/dist/es/geometry/rect.d.ts +1 -1
  22. package/dist/es/geometry/rect.js +1 -1
  23. package/dist/es/geometry/transform.d.ts +1 -20
  24. package/dist/es/geometry/transform.d.ts.map +1 -1
  25. package/dist/es/geometry/transform.js +1 -26
  26. package/dist/es/index.js +2 -2
  27. package/dist/es/shapes/arc.js +1 -1
  28. package/dist/es/shapes/shared.js +1 -1
  29. package/dist/lib/compile/node.cjs +2 -2
  30. package/dist/lib/compile/path/anchor.cjs +4 -5
  31. package/dist/lib/compile/path/index.cjs +17 -17
  32. package/dist/lib/compile/path/relative.cjs +2 -2
  33. package/dist/lib/compile/path/shrink.cjs +3 -3
  34. package/dist/lib/compile/position.cjs +2 -2
  35. package/dist/lib/geometry/circle.cjs +6 -6
  36. package/dist/lib/geometry/contour.cjs +12 -52
  37. package/dist/lib/geometry/contour.d.ts +1 -1
  38. package/dist/lib/geometry/contour.d.ts.map +1 -1
  39. package/dist/lib/geometry/diamond.cjs +5 -5
  40. package/dist/lib/geometry/edge.cjs +2 -4
  41. package/dist/lib/geometry/edge.d.ts +1 -2
  42. package/dist/lib/geometry/edge.d.ts.map +1 -1
  43. package/dist/lib/geometry/ellipse.cjs +6 -6
  44. package/dist/lib/geometry/index.d.ts +0 -1
  45. package/dist/lib/geometry/index.d.ts.map +1 -1
  46. package/dist/lib/geometry/point.d.ts +1 -29
  47. package/dist/lib/geometry/point.d.ts.map +1 -1
  48. package/dist/lib/geometry/polar.cjs +13 -5
  49. package/dist/lib/geometry/polar.d.ts +2 -2
  50. package/dist/lib/geometry/polar.d.ts.map +1 -1
  51. package/dist/lib/geometry/rect.cjs +7 -7
  52. package/dist/lib/geometry/rect.d.ts +1 -1
  53. package/dist/lib/geometry/segment.cjs +9 -9
  54. package/dist/lib/geometry/transform.d.ts +1 -20
  55. package/dist/lib/geometry/transform.d.ts.map +1 -1
  56. package/dist/lib/index.cjs +20 -6
  57. package/dist/lib/shapes/arc.cjs +7 -8
  58. package/dist/lib/shapes/index.cjs +1 -1
  59. package/dist/lib/shapes/polygon.cjs +2 -2
  60. package/dist/lib/shapes/rectangle.cjs +5 -5
  61. package/dist/lib/shapes/sector.cjs +4 -4
  62. package/dist/lib/shapes/shared.cjs +4 -4
  63. package/dist/lib/shapes/star.cjs +2 -2
  64. package/package.json +3 -2
  65. package/dist/es/geometry/arc.d.ts +0 -34
  66. package/dist/es/geometry/arc.d.ts.map +0 -1
  67. package/dist/es/geometry/arc.js +0 -108
  68. package/dist/lib/geometry/arc.cjs +0 -113
  69. package/dist/lib/geometry/arc.d.ts +0 -34
  70. package/dist/lib/geometry/arc.d.ts.map +0 -1
  71. package/dist/lib/geometry/point.cjs +0 -50
  72. package/dist/lib/geometry/transform.cjs +0 -28
@@ -1,12 +1,12 @@
1
1
  const require_edge = require("./edge.cjs");
2
- const require_transform = require("./transform.cjs");
2
+ let _retikz_math = require("@retikz/math");
3
3
  //#region src/geometry/rect.ts
4
4
  var rect = {
5
5
  /** 几何中心 */
6
6
  center: (r) => [r.x, r.y],
7
7
  /** 点是否在矩形内(含边界,含旋转) */
8
8
  contains: (r, p) => {
9
- const [lx, ly] = require_transform.worldToLocal(r, p);
9
+ const [lx, ly] = (0, _retikz_math.worldToLocal)(r, p);
10
10
  const halfW = r.width / 2;
11
11
  const halfH = r.height / 2;
12
12
  return lx >= -halfW && lx <= halfW && ly >= -halfH && ly <= halfH;
@@ -48,30 +48,30 @@ var rect = {
48
48
  ly = halfH;
49
49
  break;
50
50
  }
51
- return require_transform.localToWorld(r, [lx, ly]);
51
+ return (0, _retikz_math.localToWorld)(r, [lx, ly]);
52
52
  },
53
53
  /** 从中心向 toward 方向射线与矩形边界交点(含旋转),Path 端点贴 Node 边界用 */
54
54
  boundaryPoint: (r, toward) => {
55
- const [localX, localY] = require_transform.worldToLocal(r, toward);
55
+ const [localX, localY] = (0, _retikz_math.worldToLocal)(r, toward);
56
56
  if (localX === 0 && localY === 0) return [r.x, r.y];
57
57
  const halfW = r.width / 2;
58
58
  const halfH = r.height / 2;
59
59
  const tx = localX === 0 ? Infinity : halfW / Math.abs(localX);
60
60
  const ty = localY === 0 ? Infinity : halfH / Math.abs(localY);
61
61
  const t = Math.min(tx, ty);
62
- return require_transform.localToWorld(r, [localX * t, localY * t]);
62
+ return (0, _retikz_math.localToWorld)(r, [localX * t, localY * t]);
63
63
  },
64
64
  /** 边上比例点:side 直边 t∈[0,1] 处(两角 anchor 线性插值,含旋转);方向见 EDGE_ENDS */
65
65
  edgePoint: (r, side, t) => {
66
66
  const [a, b] = require_edge.EDGE_ENDS[side];
67
- return require_edge.lerpPoint(rect.anchor(r, a), rect.anchor(r, b), t);
67
+ return (0, _retikz_math.lerp)(rect.anchor(r, a), rect.anchor(r, b), t);
68
68
  }
69
69
  };
70
70
  /**
71
71
  * 矩形 outline:两对角 → 顺时针 path 算子序列
72
72
  * @description from/to 任意顺序,归一化 (x0,y0)=min、(x1,y1)=max。直角 = 4 line + close(起点左上 (x0,y0));
73
73
  * 圆角 = 4 line + 4 quarter-arc + close(起点 (x0+r, y0))。cornerRadius clamp 到 min(w,h)/2。
74
- * 角度约定同 geometry/arc(y-down:0=+x, 90=+y/下, 180=-x, 270=-y/上)。
74
+ * 角度约定同 @retikz/math arc(y-down:0=+x, 90=+y/下, 180=-x, 270=-y/上)。
75
75
  */
76
76
  var rectOutline = (from, to, cornerRadius) => {
77
77
  const x0 = Math.min(from[0], to[0]);
@@ -42,7 +42,7 @@ export type RectOutlineOp = {
42
42
  * 矩形 outline:两对角 → 顺时针 path 算子序列
43
43
  * @description from/to 任意顺序,归一化 (x0,y0)=min、(x1,y1)=max。直角 = 4 line + close(起点左上 (x0,y0));
44
44
  * 圆角 = 4 line + 4 quarter-arc + close(起点 (x0+r, y0))。cornerRadius clamp 到 min(w,h)/2。
45
- * 角度约定同 geometry/arc(y-down:0=+x, 90=+y/下, 180=-x, 270=-y/上)。
45
+ * 角度约定同 @retikz/math arc(y-down:0=+x, 90=+y/下, 180=-x, 270=-y/上)。
46
46
  */
47
47
  export declare const rectOutline: (from: Position, to: Position, cornerRadius?: number) => Array<RectOutlineOp>;
48
48
  //# sourceMappingURL=rect.d.ts.map
@@ -1,4 +1,4 @@
1
- const require_point = require("./point.cjs");
1
+ let _retikz_math = require("@retikz/math");
2
2
  //#region src/geometry/segment.ts
3
3
  var DEG_TO_RAD = Math.PI / 180;
4
4
  var sampleEllipseArc = (center, rx, ry, startAngleDeg, endAngleDeg, t) => {
@@ -8,13 +8,13 @@ var sampleEllipseArc = (center, rx, ry, startAngleDeg, endAngleDeg, t) => {
8
8
  const sweepSign = endAngleDeg >= startAngleDeg ? 1 : -1;
9
9
  return {
10
10
  point: [center[0] + rx * cos, center[1] + ry * sin],
11
- tangent: require_point.point.normalize([-rx * sin * sweepSign, ry * cos * sweepSign])
11
+ tangent: _retikz_math.point.normalize([-rx * sin * sweepSign, ry * cos * sweepSign])
12
12
  };
13
13
  };
14
14
  /** 直线段 from → to */
15
15
  var lineSegmentSample = (from, to, t) => ({
16
16
  point: [from[0] + (to[0] - from[0]) * t, from[1] + (to[1] - from[1]) * t],
17
- tangent: require_point.point.normalize([to[0] - from[0], to[1] - from[1]])
17
+ tangent: _retikz_math.point.normalize([to[0] - from[0], to[1] - from[1]])
18
18
  });
19
19
  /**
20
20
  * 二次贝塞尔 from → control → to
@@ -22,12 +22,12 @@ var lineSegmentSample = (from, to, t) => ({
22
22
  */
23
23
  var quadSegmentSample = (from, control, to, t) => {
24
24
  const u = 1 - t;
25
- const point$1 = [u * u * from[0] + 2 * u * t * control[0] + t * t * to[0], u * u * from[1] + 2 * u * t * control[1] + t * t * to[1]];
25
+ const point = [u * u * from[0] + 2 * u * t * control[0] + t * t * to[0], u * u * from[1] + 2 * u * t * control[1] + t * t * to[1]];
26
26
  const tx = 2 * u * (control[0] - from[0]) + 2 * t * (to[0] - control[0]);
27
27
  const ty = 2 * u * (control[1] - from[1]) + 2 * t * (to[1] - control[1]);
28
28
  return {
29
- point: point$1,
30
- tangent: require_point.point.normalize([tx, ty])
29
+ point,
30
+ tangent: _retikz_math.point.normalize([tx, ty])
31
31
  };
32
32
  };
33
33
  /**
@@ -36,12 +36,12 @@ var quadSegmentSample = (from, control, to, t) => {
36
36
  */
37
37
  var cubicSegmentSample = (from, c1, c2, to, t) => {
38
38
  const u = 1 - t;
39
- const point$2 = [u * u * u * from[0] + 3 * u * u * t * c1[0] + 3 * u * t * t * c2[0] + t * t * t * to[0], u * u * u * from[1] + 3 * u * u * t * c1[1] + 3 * u * t * t * c2[1] + t * t * t * to[1]];
39
+ const point = [u * u * u * from[0] + 3 * u * u * t * c1[0] + 3 * u * t * t * c2[0] + t * t * t * to[0], u * u * u * from[1] + 3 * u * u * t * c1[1] + 3 * u * t * t * c2[1] + t * t * t * to[1]];
40
40
  const tx = 3 * u * u * (c1[0] - from[0]) + 6 * u * t * (c2[0] - c1[0]) + 3 * t * t * (to[0] - c2[0]);
41
41
  const ty = 3 * u * u * (c1[1] - from[1]) + 6 * u * t * (c2[1] - c1[1]) + 3 * t * t * (to[1] - c2[1]);
42
42
  return {
43
- point: point$2,
44
- tangent: require_point.point.normalize([tx, ty])
43
+ point,
44
+ tangent: _retikz_math.point.normalize([tx, ty])
45
45
  };
46
46
  };
47
47
  /**
@@ -1,21 +1,2 @@
1
- import { Position } from './point';
2
- /** 任何"中心 + 可选旋转"形状的几何契约(rect / circle / ellipse / diamond 共用) */
3
- export type CenteredShape = {
4
- /** 中心横坐标 */
5
- x: number;
6
- /** 中心纵坐标 */
7
- y: number;
8
- /** 绕中心旋转弧度(可选,0 / 缺省 = 不旋转) */
9
- rotate?: number;
10
- };
11
- /**
12
- * 本地坐标(以中心为原点)→ 世界坐标
13
- * @description rotate=0 / 缺省时退化为平移;非零时按右手系绕中心旋转后再平移
14
- */
15
- export declare const localToWorld: (s: CenteredShape, local: Position) => Position;
16
- /**
17
- * 世界坐标 → 本地坐标(`localToWorld` 逆变换)
18
- * @description 先反平移到中心、再反旋转回本地基;旋转矩阵转置即逆
19
- */
20
- export declare const worldToLocal: (s: CenteredShape, world: Position) => Position;
1
+ export { type CenteredShape, localToWorld, worldToLocal } from '@retikz/math';
21
2
  //# sourceMappingURL=transform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,YAAY;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,aAAa,EAAE,OAAO,QAAQ,KAAG,QAShE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,aAAa,EAAE,OAAO,QAAQ,KAAG,QAQhE,CAAC"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -22,13 +22,10 @@ const require_transform = require("./ir/transform.cjs");
22
22
  const require_scope = require("./ir/scope.cjs");
23
23
  const require_composite = require("./ir/composite.cjs");
24
24
  const require_scene = require("./ir/scene.cjs");
25
- const require_transform$1 = require("./geometry/transform.cjs");
26
25
  const require_rect = require("./geometry/rect.cjs");
27
26
  const require_define = require("./shapes/define.cjs");
28
27
  const require_ellipse = require("./geometry/ellipse.cjs");
29
28
  const require_anchor = require("./geometry/anchor.cjs");
30
- const require_polar = require("./geometry/polar.cjs");
31
- const require_point = require("./geometry/point.cjs");
32
29
  const require_index = require("./shapes/index.cjs");
33
30
  const require_define$1 = require("./arrows/define.cjs");
34
31
  const require_index$1 = require("./arrows/index.cjs");
@@ -44,8 +41,10 @@ const require_way = require("./parsers/way.cjs");
44
41
  const require_animation$1 = require("./presets/animation.cjs");
45
42
  const require_circle = require("./geometry/circle.cjs");
46
43
  const require_diamond = require("./geometry/diamond.cjs");
44
+ const require_polar = require("./geometry/polar.cjs");
47
45
  const require_define$3 = require("./path-generators/define.cjs");
48
46
  const require_define$4 = require("./composites/define.cjs");
47
+ let _retikz_math = require("@retikz/math");
49
48
  exports.ARROW_MARKER_DEFAULT_SIZE = require_arrow.ARROW_MARKER_DEFAULT_SIZE;
50
49
  exports.ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH = require_arrow.ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH;
51
50
  exports.AbsoluteTargetSchema = require_between_position.AbsoluteTargetSchema;
@@ -149,13 +148,23 @@ exports.flash = require_animation$1.flash;
149
148
  exports.formatCompileWarning = require_constant.formatCompileWarning;
150
149
  exports.grow = require_animation$1.grow;
151
150
  exports.growUp = require_animation$1.growUp;
152
- exports.localToWorld = require_transform$1.localToWorld;
151
+ Object.defineProperty(exports, "localToWorld", {
152
+ enumerable: true,
153
+ get: function() {
154
+ return _retikz_math.localToWorld;
155
+ }
156
+ });
153
157
  exports.loop = require_animation$1.loop;
154
158
  exports.normalizeCompassAnchor = require_anchor.normalizeCompassAnchor;
155
159
  exports.parseNodeTarget = require_node_target.parseNodeTarget;
156
160
  exports.parseTargetSugar = require_target_sugar.parseTargetSugar;
157
161
  exports.parseWay = require_way.parseWay;
158
- exports.point = require_point.point;
162
+ Object.defineProperty(exports, "point", {
163
+ enumerable: true,
164
+ get: function() {
165
+ return _retikz_math.point;
166
+ }
167
+ });
159
168
  exports.polar = require_polar.polar;
160
169
  exports.pulse = require_animation$1.pulse;
161
170
  exports.rect = require_rect.rect;
@@ -164,4 +173,9 @@ exports.slideIn = require_animation$1.slideIn;
164
173
  exports.spin = require_animation$1.spin;
165
174
  exports.stagger = require_animation$1.stagger;
166
175
  exports.wiggle = require_animation$1.wiggle;
167
- exports.worldToLocal = require_transform$1.worldToLocal;
176
+ Object.defineProperty(exports, "worldToLocal", {
177
+ enumerable: true,
178
+ get: function() {
179
+ return _retikz_math.worldToLocal;
180
+ }
181
+ });
@@ -1,15 +1,14 @@
1
- const require_transform = require("../geometry/transform.cjs");
2
- const require_arc = require("../geometry/arc.cjs");
3
1
  const require_define = require("./define.cjs");
4
2
  const require_shared = require("./shared.cjs");
5
3
  let zod = require("zod");
4
+ let _retikz_math = require("@retikz/math");
6
5
  //#region src/shapes/arc.ts
7
6
  var RAD_TO_DEG = 180 / Math.PI;
8
7
  /** arc 的派生几何:圆心局部系 AABB + 圆心相对 AABB 中心偏移 */
9
8
  var computeArcGeometry = (params) => {
10
9
  const { radius } = params;
11
10
  const range = require_shared.normalizeAngularRange(params.startAngle, params.endAngle);
12
- const points = require_arc.arcBoundingPoints([0, 0], radius, range.start, range.end);
11
+ const points = (0, _retikz_math.arcBoundingPoints)([0, 0], radius, range.start, range.end);
13
12
  let minX = Infinity;
14
13
  let maxX = -Infinity;
15
14
  let minY = Infinity;
@@ -40,7 +39,7 @@ var arcGeometry = (params) => {
40
39
  return geo;
41
40
  };
42
41
  /** 圆心局部点(相对圆心)→ 世界系(+centerOffset 到相对 AABB 中心后经 rect 投影) */
43
- var arcLocalToWorld = (rect, centerOffset, localFromCenter) => require_transform.localToWorld(rect, [localFromCenter[0] + centerOffset[0], localFromCenter[1] + centerOffset[1]]);
42
+ var arcLocalToWorld = (rect, centerOffset, localFromCenter) => (0, _retikz_math.localToWorld)(rect, [localFromCenter[0] + centerOffset[0], localFromCenter[1] + centerOffset[1]]);
44
43
  /**
45
44
  * arc 注册项:单半径曲线(描边、可选闭合为弓形)
46
45
  * @description circumscribe 返回弧 bbox 半轴(含弧跨过的 90°·k 轴向极值点),node position = AABB 中心;
@@ -63,20 +62,20 @@ var arc = require_define.defineShape({
63
62
  const geo = arcGeometry(params);
64
63
  const { radius } = params;
65
64
  const { start, end } = geo.range;
66
- const local = require_transform.worldToLocal(rect, toward);
65
+ const local = (0, _retikz_math.worldToLocal)(rect, toward);
67
66
  const fx = local[0] - geo.centerOffset[0];
68
67
  const fy = local[1] - geo.centerOffset[1];
69
68
  let theta = Math.atan2(fy, fx) * RAD_TO_DEG;
70
69
  while (theta < start) theta += 360;
71
70
  while (theta >= start + 360) theta -= 360;
72
71
  const angle = theta <= end ? theta : theta - end <= start + 360 - theta ? end : start;
73
- return arcLocalToWorld(rect, geo.centerOffset, require_arc.arcEndPoint([0, 0], radius, angle));
72
+ return arcLocalToWorld(rect, geo.centerOffset, (0, _retikz_math.arcEndPoint)([0, 0], radius, angle));
74
73
  },
75
74
  anchor: (rect, name, params) => {
76
75
  const geo = arcGeometry(params);
77
76
  const { radius } = params;
78
77
  const { start, end, mid } = geo.range;
79
- const at = (angle) => arcLocalToWorld(rect, geo.centerOffset, require_arc.arcEndPoint([0, 0], radius, angle));
78
+ const at = (angle) => arcLocalToWorld(rect, geo.centerOffset, (0, _retikz_math.arcEndPoint)([0, 0], radius, angle));
80
79
  switch (name) {
81
80
  case "center": return arcLocalToWorld(rect, geo.centerOffset, [0, 0]);
82
81
  case "arc-mid": return at(mid);
@@ -93,7 +92,7 @@ var arc = require_define.defineShape({
93
92
  const center = arcLocalToWorld(rect, geo.centerOffset, [0, 0]);
94
93
  const commands = [{
95
94
  kind: "move",
96
- to: rp(arcLocalToWorld(rect, geo.centerOffset, require_arc.arcEndPoint([0, 0], radius, start)))
95
+ to: rp(arcLocalToWorld(rect, geo.centerOffset, (0, _retikz_math.arcEndPoint)([0, 0], radius, start)))
97
96
  }, {
98
97
  kind: "arc",
99
98
  center: rp(center),
@@ -1,4 +1,3 @@
1
- require("../geometry/transform.cjs");
2
1
  require("./define.cjs");
3
2
  const require_arc = require("./arc.cjs");
4
3
  const require_ellipse = require("./ellipse.cjs");
@@ -6,6 +5,7 @@ const require_polygon = require("./polygon.cjs");
6
5
  const require_rectangle = require("./rectangle.cjs");
7
6
  const require_sector = require("./sector.cjs");
8
7
  const require_star = require("./star.cjs");
8
+ require("@retikz/math");
9
9
  //#region src/shapes/index.ts
10
10
  /** 内置 shape 注册项(circle / diamond 已收为 preset,不占独立项);与 `CompileOptions.shapes` 合并时被同名注入覆盖 */
11
11
  var BUILTIN_SHAPES = {
@@ -1,10 +1,10 @@
1
- const require_transform = require("../geometry/transform.cjs");
2
1
  const require_rect = require("../geometry/rect.cjs");
3
2
  const require_define = require("./define.cjs");
4
3
  const require_anchor = require("../geometry/anchor.cjs");
5
4
  const require_contour = require("../geometry/contour.cjs");
6
5
  const require_contour$1 = require("./contour.cjs");
7
6
  let zod = require("zod");
7
+ let _retikz_math = require("@retikz/math");
8
8
  //#region src/shapes/polygon.ts
9
9
  var DEG_TO_RAD = Math.PI / 180;
10
10
  var MAX_POLYGON_SIDES = 1024;
@@ -54,7 +54,7 @@ var circumradiusFromRect = (rect, params) => rect.width / 2 / maxAbsCos(params);
54
54
  */
55
55
  var polygonVertices = (rect, radius, params) => vertexAngles(params).map((deg) => {
56
56
  const a = deg * DEG_TO_RAD;
57
- return require_transform.localToWorld(rect, [radius * Math.cos(a), radius * Math.sin(a)]);
57
+ return (0, _retikz_math.localToWorld)(rect, [radius * Math.cos(a), radius * Math.sin(a)]);
58
58
  });
59
59
  /**
60
60
  * polygon 注册项:正多边形(sides 顶点均布外接圆,rotate 定起始角,cornerRadius 顶点倒角)
@@ -1,20 +1,20 @@
1
- const require_transform = require("../geometry/transform.cjs");
2
1
  const require_rect = require("../geometry/rect.cjs");
3
2
  const require_define = require("./define.cjs");
4
3
  const require_anchor = require("../geometry/anchor.cjs");
5
4
  const require_contour = require("../geometry/contour.cjs");
6
5
  const require_contour$1 = require("./contour.cjs");
7
6
  let zod = require("zod");
7
+ let _retikz_math = require("@retikz/math");
8
8
  //#region src/shapes/rectangle.ts
9
9
  /** 轴对齐 / 旋转矩形的 4 个角(CW 绕向:左上 → 右上 → 右下 → 左下),局部系经 localToWorld 投世界 */
10
10
  var rectVertices = (rect) => {
11
11
  const halfW = rect.width / 2;
12
12
  const halfH = rect.height / 2;
13
13
  return [
14
- require_transform.localToWorld(rect, [-halfW, -halfH]),
15
- require_transform.localToWorld(rect, [halfW, -halfH]),
16
- require_transform.localToWorld(rect, [halfW, halfH]),
17
- require_transform.localToWorld(rect, [-halfW, halfH])
14
+ (0, _retikz_math.localToWorld)(rect, [-halfW, -halfH]),
15
+ (0, _retikz_math.localToWorld)(rect, [halfW, -halfH]),
16
+ (0, _retikz_math.localToWorld)(rect, [halfW, halfH]),
17
+ (0, _retikz_math.localToWorld)(rect, [-halfW, halfH])
18
18
  ];
19
19
  };
20
20
  /**
@@ -1,13 +1,13 @@
1
- const require_transform = require("../geometry/transform.cjs");
2
1
  const require_define = require("./define.cjs");
3
2
  const require_shared = require("./shared.cjs");
4
3
  const require_contour = require("../geometry/contour.cjs");
5
4
  const require_contour$1 = require("./contour.cjs");
6
5
  let zod = require("zod");
6
+ let _retikz_math = require("@retikz/math");
7
7
  //#region src/shapes/sector.ts
8
8
  /** sector 局部 AABB 系点(圆心为原点偏移后)→ 世界系(含 rect 旋转 / 平移) */
9
9
  var toWorld = (rect, geo, localFromApex) => {
10
- return require_transform.localToWorld(rect, [localFromApex[0] + geo.apexOffset[0], localFromApex[1] + geo.apexOffset[1]]);
10
+ return (0, _retikz_math.localToWorld)(rect, [localFromApex[0] + geo.apexOffset[0], localFromApex[1] + geo.apexOffset[1]]);
11
11
  };
12
12
  /**
13
13
  * 构造 sector 闭合轮廓的有序段序列(line + arc),段序与现状 emit 完全一致
@@ -115,7 +115,7 @@ var sector = require_define.defineShape({
115
115
  },
116
116
  boundaryPoint: (rect, toward, params) => {
117
117
  const { geo, segments, fillets } = createSectorContour(rect, params);
118
- const originWorld = require_transform.localToWorld(rect, geo.boundaryOriginOffset);
118
+ const originWorld = (0, _retikz_math.localToWorld)(rect, geo.boundaryOriginOffset);
119
119
  return require_contour.boundaryFromContour(segments, params.cornerRadius, originWorld, toward, fillets) ?? originWorld;
120
120
  },
121
121
  anchor: (rect, name, params) => {
@@ -125,7 +125,7 @@ var sector = require_define.defineShape({
125
125
  switch (name) {
126
126
  case "apex":
127
127
  case "center": return toWorld(rect, geo, [0, 0]);
128
- case "centroid": return require_transform.localToWorld(rect, geo.centroidOffset);
128
+ case "centroid": return (0, _retikz_math.localToWorld)(rect, geo.centroidOffset);
129
129
  case "outer-arc-mid": return toWorld(rect, geo, require_shared.sectorPolarPoint(outerRadius, mid));
130
130
  case "inner-arc-mid": return toWorld(rect, geo, require_shared.sectorPolarPoint(innerRadius, mid));
131
131
  case "start-edge-mid": return toWorld(rect, geo, require_shared.sectorPolarPoint((innerRadius + outerRadius) / 2, start));
@@ -1,4 +1,4 @@
1
- const require_arc = require("../geometry/arc.cjs");
1
+ let _retikz_math = require("@retikz/math");
2
2
  //#region src/shapes/shared.ts
3
3
  var DEG_TO_RAD = Math.PI / 180;
4
4
  /**
@@ -29,8 +29,8 @@ var sectorGeometry = (params) => {
29
29
  const range = normalizeAngularRange(params.startAngle, params.endAngle);
30
30
  const apex = [0, 0];
31
31
  const candidates = innerRadius === 0 ? [apex] : [];
32
- candidates.push(...require_arc.arcBoundingPoints(apex, outerRadius, range.start, range.end));
33
- if (innerRadius > 0) candidates.push(...require_arc.arcBoundingPoints(apex, innerRadius, range.start, range.end));
32
+ candidates.push(...(0, _retikz_math.arcBoundingPoints)(apex, outerRadius, range.start, range.end));
33
+ if (innerRadius > 0) candidates.push(...(0, _retikz_math.arcBoundingPoints)(apex, innerRadius, range.start, range.end));
34
34
  let minX = Infinity;
35
35
  let maxX = -Infinity;
36
36
  let minY = Infinity;
@@ -71,7 +71,7 @@ var sectorGeometry = (params) => {
71
71
  };
72
72
  };
73
73
  /** sector 局部系点(圆心为原点):极角(度) + 半径 → 直角坐标 */
74
- var sectorPolarPoint = (radius, angleDeg) => require_arc.arcEndPoint([0, 0], radius, angleDeg);
74
+ var sectorPolarPoint = (radius, angleDeg) => (0, _retikz_math.arcEndPoint)([0, 0], radius, angleDeg);
75
75
  //#endregion
76
76
  exports.normalizeAngularRange = normalizeAngularRange;
77
77
  exports.sectorGeometry = sectorGeometry;
@@ -1,8 +1,8 @@
1
- const require_transform = require("../geometry/transform.cjs");
2
1
  const require_define = require("./define.cjs");
3
2
  const require_contour = require("../geometry/contour.cjs");
4
3
  const require_contour$1 = require("./contour.cjs");
5
4
  let zod = require("zod");
5
+ let _retikz_math = require("@retikz/math");
6
6
  //#region src/shapes/star.ts
7
7
  var DEG_TO_RAD = Math.PI / 180;
8
8
  var MAX_STAR_POINTS = 1024;
@@ -37,7 +37,7 @@ var starGeometry = (params) => {
37
37
  };
38
38
  };
39
39
  /** 局部顶点(中心为原点)→ 世界系(经 rect 旋转 / 平移) */
40
- var toWorld = (rect, local) => require_transform.localToWorld(rect, local);
40
+ var toWorld = (rect, local) => (0, _retikz_math.localToWorld)(rect, local);
41
41
  /**
42
42
  * 世界系顶点环(局部 2×points 顶点逐个经 rect 投世界)
43
43
  * @description emit 收轴对齐 rect(rotate=0)、boundaryPoint 收带 rotate 的 rect,二者共用此构造;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retikz/core",
3
- "version": "0.3.0-beta.2",
3
+ "version": "0.4.0-alpha.1",
4
4
  "description": "retikz core: framework-agnostic IR, scene compiler, schemas, geometry, and parsers.",
5
5
  "type": "module",
6
6
  "author": "Pionpill",
@@ -37,7 +37,8 @@
37
37
  "dist/**/*"
38
38
  ],
39
39
  "dependencies": {
40
- "zod": "^4.4.3"
40
+ "zod": "^4.4.3",
41
+ "@retikz/math": "0.4.0-alpha.1"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@types/node": "^25.6.0",
@@ -1,34 +0,0 @@
1
- import { Position } from './point';
2
- /** 圆心、半径、角度(度,与 polar.toPosition 同约定)→ 圆周上对应点 */
3
- export declare const arcEndPoint: (center: Position, radius: number, angleDeg: number) => Position;
4
- /**
5
- * 弧的 bbox 极值候选:起点、终点,加 [startAngle,endAngle] 内所有 90°·k 方向的圆周点
6
- * @description 弧投影到 x/y 轴的极值只可能在弧端点或圆周轴向四点出现。endAngle < startAngle 时按 min..max 扫描;跨 360°(270→450)按数值区间正确处理;不去重——端角恰在 90°·k 上时调用方处理
7
- */
8
- export declare const arcBoundingPoints: (center: Position, radius: number, startAngleDeg: number, endAngleDeg: number) => Array<Position>;
9
- /**
10
- * 角度 a(度)是否落在弧的角度区间 [startAngle, endAngle] 内(含端点,带容差)
11
- * @description 与 ir/path arc 同约定:弧从 startAngle 扫到 endAngle,counterClockwise=false(缺省)
12
- * 时角度递增(屏幕顺时针)、true 时角度递减(逆时针)。统一把扫描量化为「从 start 出发、沿扫描方向
13
- * 累积的非负 sweep ∈ [0, |span|]」判定,跨 360°、负角、巨型角都正确(不死循环)。
14
- */
15
- export declare const arcAngleInRange: (startAngleDeg: number, endAngleDeg: number, angleDeg: number, toleranceDeg?: number) => boolean;
16
- /**
17
- * 射线(origin + 单位方向 dir)∩ 圆弧(center, radius, [startAngle, endAngle])
18
- * @description 泛化 sector 的内联 rayCircle:先解 |origin + s·dir|² = radius² 得至多两个参数 s,
19
- * 再用 arcAngleInRange 过滤掉不在弧角度区间内的交点。返回沿射线的正向参数 s(命中点 = origin + s·dir),
20
- * 按 s 升序、仅含 s > tolerance 的正向交点;不在区间内的根被剔除。dir 必须为单位向量。
21
- */
22
- export declare const rayArc: (origin: Position, dir: Position, center: Position, radius: number, startAngleDeg: number, endAngleDeg: number, tolerance?: number) => Array<number>;
23
- /**
24
- * 椭圆弧参数点:中心 + 半轴 rx/ry + 参数角(度)→ 椭圆周上点
25
- * @description 与 arcEndPoint 同角度约定(SVG y-down);endpoint = [cx + rx·cosθ, cy + ry·sinθ]。
26
- * θ 是参数角(非真实极角,rx≠ry 时两者不等)
27
- */
28
- export declare const ellipseArcPoint: (center: Position, radiusX: number, radiusY: number, angleDeg: number) => Position;
29
- /**
30
- * 椭圆弧 bbox 极值候选:起点、终点,加 [start,end] 区间内所有 90°·k 参数角处的椭圆周点
31
- * @description 轴对齐椭圆的 x 极值在 θ=0/180、y 极值在 θ=90/270,与正圆同结构(仅半轴用 rx/ry)
32
- */
33
- export declare const ellipseArcBoundingPoints: (center: Position, radiusX: number, radiusY: number, startAngleDeg: number, endAngleDeg: number) => Array<Position>;
34
- //# sourceMappingURL=arc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arc.d.ts","sourceRoot":"","sources":["../../../src/geometry/arc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA8BxC,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,CAchB,CAAC;AAQF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,UAAU,MAAM,EAChB,qBAAmB,KAClB,OASF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GACjB,QAAQ,QAAQ,EAChB,KAAK,QAAQ,EACb,QAAQ,QAAQ,EAChB,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,aAAa,MAAM,EACnB,kBAAgB,KACf,KAAK,CAAC,MAAM,CAuBd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,QAAQ,EAChB,SAAS,MAAM,EACf,SAAS,MAAM,EACf,UAAU,MAAM,KACf,QAMF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,QAAQ,QAAQ,EAChB,SAAS,MAAM,EACf,SAAS,MAAM,EACf,eAAe,MAAM,EACrB,aAAa,MAAM,KAClB,KAAK,CAAC,QAAQ,CAYhB,CAAC"}
@@ -1,108 +0,0 @@
1
- //#region src/geometry/arc.ts
2
- var DEG_TO_RAD = Math.PI / 180;
3
- /**
4
- * 在 [lo, hi] 内枚举所有 90°·k 方向角(弧轴向极值候选)
5
- * @description 一圈最多 4 个轴向,合法弧 sweep ≤ 360° → 至多 5 个 90°·k;正常区间直接 for 扫。
6
- * 但 lo/hi 为巨型角度(如 1e308)时 k=ceil(lo/90) 落在浮点无整数分辨率区,`k++` 满足 k+1===k →
7
- * for 循环永不前进而挂死(DoS)。此时端点投影已覆盖全部 x/y 极值(巨角下弧实际是退化点 / 单端),
8
- * 轴向点无新增信息 → 直接跳过枚举。守卫:仅当 kEnd−kStart 是 finite 且 ≤ 安全上界(远大于
9
- * 任何合法弧的轴向点数)时才枚举,否则返回空(端点已足够定界)。
10
- */
11
- var axisAngles = (lo, hi) => {
12
- const kStart = Math.ceil(lo / 90);
13
- const kEnd = Math.floor(hi / 90);
14
- const span = kEnd - kStart;
15
- if (!Number.isFinite(span) || span < 0 || span > 1e6) return [];
16
- const angles = [];
17
- for (let k = kStart; k <= kEnd; k++) angles.push(k * 90);
18
- return angles;
19
- };
20
- /** 圆心、半径、角度(度,与 polar.toPosition 同约定)→ 圆周上对应点 */
21
- var arcEndPoint = (center, radius, angleDeg) => {
22
- const rad = angleDeg * DEG_TO_RAD;
23
- return [center[0] + Math.cos(rad) * radius, center[1] + Math.sin(rad) * radius];
24
- };
25
- /**
26
- * 弧的 bbox 极值候选:起点、终点,加 [startAngle,endAngle] 内所有 90°·k 方向的圆周点
27
- * @description 弧投影到 x/y 轴的极值只可能在弧端点或圆周轴向四点出现。endAngle < startAngle 时按 min..max 扫描;跨 360°(270→450)按数值区间正确处理;不去重——端角恰在 90°·k 上时调用方处理
28
- */
29
- var arcBoundingPoints = (center, radius, startAngleDeg, endAngleDeg) => {
30
- const points = [arcEndPoint(center, radius, startAngleDeg), arcEndPoint(center, radius, endAngleDeg)];
31
- const lo = Math.min(startAngleDeg, endAngleDeg);
32
- const hi = Math.max(startAngleDeg, endAngleDeg);
33
- for (const angle of axisAngles(lo, hi)) {
34
- if (angle === startAngleDeg || angle === endAngleDeg) continue;
35
- points.push(arcEndPoint(center, radius, angle));
36
- }
37
- return points;
38
- };
39
- /** 角度(度)→ 规范化到 [0, 360) */
40
- var normalizeDeg = (deg) => {
41
- const m = deg % 360;
42
- return m < 0 ? m + 360 : m;
43
- };
44
- /**
45
- * 角度 a(度)是否落在弧的角度区间 [startAngle, endAngle] 内(含端点,带容差)
46
- * @description 与 ir/path arc 同约定:弧从 startAngle 扫到 endAngle,counterClockwise=false(缺省)
47
- * 时角度递增(屏幕顺时针)、true 时角度递减(逆时针)。统一把扫描量化为「从 start 出发、沿扫描方向
48
- * 累积的非负 sweep ∈ [0, |span|]」判定,跨 360°、负角、巨型角都正确(不死循环)。
49
- */
50
- var arcAngleInRange = (startAngleDeg, endAngleDeg, angleDeg, toleranceDeg = 1e-7) => {
51
- const span = endAngleDeg - startAngleDeg;
52
- const total = Math.abs(span);
53
- if (total >= 360 - toleranceDeg) return true;
54
- const swept = normalizeDeg(span < 0 ? startAngleDeg - angleDeg : angleDeg - startAngleDeg);
55
- return swept <= total + toleranceDeg || swept >= 360 - toleranceDeg;
56
- };
57
- /**
58
- * 射线(origin + 单位方向 dir)∩ 圆弧(center, radius, [startAngle, endAngle])
59
- * @description 泛化 sector 的内联 rayCircle:先解 |origin + s·dir|² = radius² 得至多两个参数 s,
60
- * 再用 arcAngleInRange 过滤掉不在弧角度区间内的交点。返回沿射线的正向参数 s(命中点 = origin + s·dir),
61
- * 按 s 升序、仅含 s > tolerance 的正向交点;不在区间内的根被剔除。dir 必须为单位向量。
62
- */
63
- var rayArc = (origin, dir, center, radius, startAngleDeg, endAngleDeg, tolerance = 1e-9) => {
64
- const ox = origin[0] - center[0];
65
- const oy = origin[1] - center[1];
66
- const ux = dir[0];
67
- const uy = dir[1];
68
- const b = 2 * (ox * ux + oy * uy);
69
- const c = ox * ox + oy * oy - radius * radius;
70
- const disc = b * b - 4 * c;
71
- if (disc < 0) return [];
72
- const sq = Math.sqrt(disc);
73
- const roots = [(-b - sq) / 2, (-b + sq) / 2];
74
- const hits = [];
75
- for (const s of roots) {
76
- if (s <= tolerance) continue;
77
- const px = ox + s * ux;
78
- const py = oy + s * uy;
79
- if (arcAngleInRange(startAngleDeg, endAngleDeg, Math.atan2(py, px) * (180 / Math.PI))) hits.push(s);
80
- }
81
- hits.sort((a, z) => a - z);
82
- return hits;
83
- };
84
- /**
85
- * 椭圆弧参数点:中心 + 半轴 rx/ry + 参数角(度)→ 椭圆周上点
86
- * @description 与 arcEndPoint 同角度约定(SVG y-down);endpoint = [cx + rx·cosθ, cy + ry·sinθ]。
87
- * θ 是参数角(非真实极角,rx≠ry 时两者不等)
88
- */
89
- var ellipseArcPoint = (center, radiusX, radiusY, angleDeg) => {
90
- const rad = angleDeg * DEG_TO_RAD;
91
- return [center[0] + Math.cos(rad) * radiusX, center[1] + Math.sin(rad) * radiusY];
92
- };
93
- /**
94
- * 椭圆弧 bbox 极值候选:起点、终点,加 [start,end] 区间内所有 90°·k 参数角处的椭圆周点
95
- * @description 轴对齐椭圆的 x 极值在 θ=0/180、y 极值在 θ=90/270,与正圆同结构(仅半轴用 rx/ry)
96
- */
97
- var ellipseArcBoundingPoints = (center, radiusX, radiusY, startAngleDeg, endAngleDeg) => {
98
- const points = [ellipseArcPoint(center, radiusX, radiusY, startAngleDeg), ellipseArcPoint(center, radiusX, radiusY, endAngleDeg)];
99
- const lo = Math.min(startAngleDeg, endAngleDeg);
100
- const hi = Math.max(startAngleDeg, endAngleDeg);
101
- for (const angle of axisAngles(lo, hi)) {
102
- if (angle === startAngleDeg || angle === endAngleDeg) continue;
103
- points.push(ellipseArcPoint(center, radiusX, radiusY, angle));
104
- }
105
- return points;
106
- };
107
- //#endregion
108
- export { arcAngleInRange, arcBoundingPoints, arcEndPoint, ellipseArcBoundingPoints, ellipseArcPoint, rayArc };