@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.
- package/dist/es/compile/compile.d.ts +9 -10
- package/dist/es/compile/compile.d.ts.map +1 -1
- package/dist/es/compile/compile.js +31 -8
- package/dist/es/compile/node.d.ts +56 -54
- package/dist/es/compile/node.d.ts.map +1 -1
- package/dist/es/compile/node.js +137 -39
- package/dist/es/compile/parseTarget.d.ts +3 -8
- package/dist/es/compile/parseTarget.d.ts.map +1 -1
- package/dist/es/compile/parseTarget.js +7 -19
- package/dist/es/compile/path.d.ts +2 -19
- package/dist/es/compile/path.d.ts.map +1 -1
- package/dist/es/compile/path.js +232 -213
- package/dist/es/compile/position.d.ts +4 -5
- package/dist/es/compile/position.d.ts.map +1 -1
- package/dist/es/compile/position.js +32 -5
- package/dist/es/compile/text-metrics.d.ts +2 -4
- package/dist/es/compile/text-metrics.d.ts.map +1 -1
- package/dist/es/compile/view-box.d.ts +1 -4
- package/dist/es/compile/view-box.d.ts.map +1 -1
- package/dist/es/compile/view-box.js +1 -4
- package/dist/es/geometry/arc.d.ts +3 -28
- package/dist/es/geometry/arc.d.ts.map +1 -1
- package/dist/es/geometry/arc.js +4 -31
- package/dist/es/geometry/bend.d.ts +2 -13
- package/dist/es/geometry/bend.d.ts.map +1 -1
- package/dist/es/geometry/bend.js +2 -13
- package/dist/es/geometry/circle.d.ts +5 -13
- package/dist/es/geometry/circle.d.ts.map +1 -1
- package/dist/es/geometry/circle.js +1 -4
- package/dist/es/geometry/diamond.d.ts +9 -24
- package/dist/es/geometry/diamond.d.ts.map +1 -1
- package/dist/es/geometry/diamond.js +4 -14
- package/dist/es/geometry/ellipse.d.ts +9 -15
- package/dist/es/geometry/ellipse.d.ts.map +1 -1
- package/dist/es/geometry/ellipse.js +4 -8
- package/dist/es/geometry/point.d.ts +8 -9
- package/dist/es/geometry/point.d.ts.map +1 -1
- package/dist/es/geometry/point.js +8 -9
- package/dist/es/geometry/polar.d.ts +12 -21
- package/dist/es/geometry/polar.d.ts.map +1 -1
- package/dist/es/geometry/polar.js +7 -14
- package/dist/es/geometry/rect.d.ts +8 -32
- package/dist/es/geometry/rect.d.ts.map +1 -1
- package/dist/es/geometry/rect.js +7 -33
- package/dist/es/geometry/segment.d.ts +11 -18
- package/dist/es/geometry/segment.d.ts.map +1 -1
- package/dist/es/geometry/segment.js +9 -16
- package/dist/es/index.d.ts +6 -10
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/index.js +7 -4
- package/dist/es/ir/coordinate.d.ts +65 -0
- package/dist/es/ir/coordinate.d.ts.map +1 -0
- package/dist/es/ir/coordinate.js +22 -0
- package/dist/es/ir/index.d.ts +1 -0
- package/dist/es/ir/index.d.ts.map +1 -1
- package/dist/es/ir/node.d.ts +290 -50
- package/dist/es/ir/node.d.ts.map +1 -1
- package/dist/es/ir/node.js +32 -38
- package/dist/es/ir/path/arrow.d.ts +210 -12
- package/dist/es/ir/path/arrow.d.ts.map +1 -1
- package/dist/es/ir/path/arrow.js +39 -12
- package/dist/es/ir/path/path.d.ts +477 -153
- package/dist/es/ir/path/path.d.ts.map +1 -1
- package/dist/es/ir/path/path.js +2 -2
- package/dist/es/ir/path/step.d.ts +395 -223
- package/dist/es/ir/path/step.d.ts.map +1 -1
- package/dist/es/ir/path/step.js +13 -14
- package/dist/es/ir/path/target.d.ts +25 -16
- package/dist/es/ir/path/target.d.ts.map +1 -1
- package/dist/es/ir/path/target.js +8 -6
- package/dist/es/ir/position/at-position.d.ts +43 -0
- package/dist/es/ir/position/at-position.d.ts.map +1 -0
- package/dist/es/ir/position/at-position.js +23 -0
- package/dist/es/ir/position/index.d.ts +2 -0
- package/dist/es/ir/position/index.d.ts.map +1 -1
- package/dist/es/ir/position/offset-position.d.ts +14 -0
- package/dist/es/ir/position/offset-position.d.ts.map +1 -0
- package/dist/es/ir/position/offset-position.js +14 -0
- package/dist/es/ir/position/polar-position.d.ts +1 -4
- package/dist/es/ir/position/polar-position.d.ts.map +1 -1
- package/dist/es/ir/position/polar-position.js +1 -4
- package/dist/es/ir/scene.d.ts +1736 -386
- package/dist/es/ir/scene.d.ts.map +1 -1
- package/dist/es/ir/scene.js +6 -1
- package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
- package/dist/es/parsers/parseTargetSugar.js +6 -19
- package/dist/es/parsers/parseWay.d.ts +26 -118
- package/dist/es/parsers/parseWay.d.ts.map +1 -1
- package/dist/es/parsers/parseWay.js +19 -61
- package/dist/es/primitive/ellipse.d.ts +4 -14
- package/dist/es/primitive/ellipse.d.ts.map +1 -1
- package/dist/es/primitive/group.d.ts +21 -3
- package/dist/es/primitive/group.d.ts.map +1 -1
- package/dist/es/primitive/path.d.ts +67 -7
- package/dist/es/primitive/path.d.ts.map +1 -1
- package/dist/es/primitive/scene.d.ts +2 -4
- package/dist/es/primitive/scene.d.ts.map +1 -1
- package/dist/es/primitive/text.d.ts +9 -32
- package/dist/es/primitive/text.d.ts.map +1 -1
- package/dist/lib/compile/compile.cjs +31 -8
- package/dist/lib/compile/compile.d.ts +9 -10
- package/dist/lib/compile/compile.d.ts.map +1 -1
- package/dist/lib/compile/node.cjs +137 -39
- package/dist/lib/compile/node.d.ts +56 -54
- package/dist/lib/compile/node.d.ts.map +1 -1
- package/dist/lib/compile/parseTarget.cjs +7 -19
- package/dist/lib/compile/parseTarget.d.ts +3 -8
- package/dist/lib/compile/parseTarget.d.ts.map +1 -1
- package/dist/lib/compile/path.cjs +231 -212
- package/dist/lib/compile/path.d.ts +2 -19
- package/dist/lib/compile/path.d.ts.map +1 -1
- package/dist/lib/compile/position.cjs +32 -5
- package/dist/lib/compile/position.d.ts +4 -5
- package/dist/lib/compile/position.d.ts.map +1 -1
- package/dist/lib/compile/text-metrics.d.ts +2 -4
- package/dist/lib/compile/text-metrics.d.ts.map +1 -1
- package/dist/lib/compile/view-box.cjs +1 -4
- package/dist/lib/compile/view-box.d.ts +1 -4
- package/dist/lib/compile/view-box.d.ts.map +1 -1
- package/dist/lib/geometry/arc.cjs +3 -31
- package/dist/lib/geometry/arc.d.ts +3 -28
- package/dist/lib/geometry/arc.d.ts.map +1 -1
- package/dist/lib/geometry/bend.cjs +2 -13
- package/dist/lib/geometry/bend.d.ts +2 -13
- package/dist/lib/geometry/bend.d.ts.map +1 -1
- package/dist/lib/geometry/circle.cjs +1 -4
- package/dist/lib/geometry/circle.d.ts +5 -13
- package/dist/lib/geometry/circle.d.ts.map +1 -1
- package/dist/lib/geometry/diamond.cjs +4 -14
- package/dist/lib/geometry/diamond.d.ts +9 -24
- package/dist/lib/geometry/diamond.d.ts.map +1 -1
- package/dist/lib/geometry/ellipse.cjs +4 -8
- package/dist/lib/geometry/ellipse.d.ts +9 -15
- package/dist/lib/geometry/ellipse.d.ts.map +1 -1
- package/dist/lib/geometry/point.cjs +8 -9
- package/dist/lib/geometry/point.d.ts +8 -9
- package/dist/lib/geometry/point.d.ts.map +1 -1
- package/dist/lib/geometry/polar.cjs +7 -14
- package/dist/lib/geometry/polar.d.ts +12 -21
- package/dist/lib/geometry/polar.d.ts.map +1 -1
- package/dist/lib/geometry/rect.cjs +7 -33
- package/dist/lib/geometry/rect.d.ts +8 -32
- package/dist/lib/geometry/rect.d.ts.map +1 -1
- package/dist/lib/geometry/segment.cjs +9 -16
- package/dist/lib/geometry/segment.d.ts +11 -18
- package/dist/lib/geometry/segment.d.ts.map +1 -1
- package/dist/lib/index.cjs +15 -2
- package/dist/lib/index.d.ts +6 -10
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/ir/coordinate.cjs +22 -0
- package/dist/lib/ir/coordinate.d.ts +65 -0
- package/dist/lib/ir/coordinate.d.ts.map +1 -0
- package/dist/lib/ir/index.d.ts +1 -0
- package/dist/lib/ir/index.d.ts.map +1 -1
- package/dist/lib/ir/node.cjs +32 -37
- package/dist/lib/ir/node.d.ts +290 -50
- package/dist/lib/ir/node.d.ts.map +1 -1
- package/dist/lib/ir/path/arrow.cjs +43 -11
- package/dist/lib/ir/path/arrow.d.ts +210 -12
- package/dist/lib/ir/path/arrow.d.ts.map +1 -1
- package/dist/lib/ir/path/path.cjs +1 -1
- package/dist/lib/ir/path/path.d.ts +477 -153
- package/dist/lib/ir/path/path.d.ts.map +1 -1
- package/dist/lib/ir/path/step.cjs +13 -14
- package/dist/lib/ir/path/step.d.ts +395 -223
- package/dist/lib/ir/path/step.d.ts.map +1 -1
- package/dist/lib/ir/path/target.cjs +9 -7
- package/dist/lib/ir/path/target.d.ts +25 -16
- package/dist/lib/ir/path/target.d.ts.map +1 -1
- package/dist/lib/ir/position/at-position.cjs +24 -0
- package/dist/lib/ir/position/at-position.d.ts +43 -0
- package/dist/lib/ir/position/at-position.d.ts.map +1 -0
- package/dist/lib/ir/position/index.d.ts +2 -0
- package/dist/lib/ir/position/index.d.ts.map +1 -1
- package/dist/lib/ir/position/offset-position.cjs +14 -0
- package/dist/lib/ir/position/offset-position.d.ts +14 -0
- package/dist/lib/ir/position/offset-position.d.ts.map +1 -0
- package/dist/lib/ir/position/polar-position.cjs +1 -4
- package/dist/lib/ir/position/polar-position.d.ts +1 -4
- package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
- package/dist/lib/ir/scene.cjs +6 -1
- package/dist/lib/ir/scene.d.ts +1736 -386
- package/dist/lib/ir/scene.d.ts.map +1 -1
- package/dist/lib/parsers/parseTargetSugar.cjs +6 -19
- package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
- package/dist/lib/parsers/parseWay.cjs +19 -61
- package/dist/lib/parsers/parseWay.d.ts +26 -118
- package/dist/lib/parsers/parseWay.d.ts.map +1 -1
- package/dist/lib/primitive/ellipse.d.ts +4 -14
- package/dist/lib/primitive/ellipse.d.ts.map +1 -1
- package/dist/lib/primitive/group.d.ts +21 -3
- package/dist/lib/primitive/group.d.ts.map +1 -1
- package/dist/lib/primitive/path.d.ts +67 -7
- package/dist/lib/primitive/path.d.ts.map +1 -1
- package/dist/lib/primitive/scene.d.ts +2 -4
- package/dist/lib/primitive/scene.d.ts.map +1 -1
- package/dist/lib/primitive/text.d.ts +9 -32
- package/dist/lib/primitive/text.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -3,25 +3,8 @@ import { ScenePrimitive } from '../primitive';
|
|
|
3
3
|
import { NodeLayout } from './node';
|
|
4
4
|
import { TextMeasurer } from './text-metrics';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 关键算法(v0.1.0-alpha.1):每个绘制段(line / fold)**独立**地用节点中心
|
|
9
|
-
* 算两端 boundary clip——一个节点在路径中段时,"入边"和"出边" boundary 点
|
|
10
|
-
* 通常不同,路径会在该节点处可见地"断开"。这与 TikZ 原生语义一致:
|
|
11
|
-
*
|
|
12
|
-
* `\draw (A) -- (B) -- (C);`
|
|
13
|
-
* 段 1:A.center → B.center 决定 A 出口、B 入口的 boundary 交点
|
|
14
|
-
* 段 2:B.center → C.center 决定 B 出口、C 入口的 boundary 交点
|
|
15
|
-
* B 在两段里 clip 出来的点不同——视觉上看到两条独立线段。
|
|
16
|
-
*
|
|
17
|
-
* 实现上仍只产一个 PathPrim:d 字符串里以多组 `M ... L ...` 表达多个 sub-path。
|
|
18
|
-
* 当某段起点恰好等于上一段终点(例如直接坐标连续,或未触发 clip 差异)时,
|
|
19
|
-
* 复用 cursor,省掉冗余 M。
|
|
20
|
-
*
|
|
21
|
-
* cycle 段:闭回最近一次 move 起点。若 cycle 起点 == lastEnd 且终点 == subPathStart,
|
|
22
|
-
* 输出 `Z`(最优雅);否则显式画一段 line(与"段独立 clip"一致)。
|
|
23
|
-
*
|
|
24
|
-
* 引用未定义节点 / 解析失败时返回 null(path 整体跳过)。
|
|
6
|
+
* IR Path → PathPrim
|
|
7
|
+
* @description 每个绘制段独立用节点中心算两端 boundary clip——中段节点的入/出 boundary 点通常不同,path 在该节点可见"断开"(与 TikZ `\draw (A)--(B)--(C);` 段独立 clip 一致)。仍产一个 PathPrim:commands 用多组 move/line 表达 sub-path;段起点等于上段终点时复用 cursor 省 move。cycle 段闭回最近 move 起点,起点==lastEnd && 终点==subPathStart 时输出 close,否则显式画段 line。引用未定义节点/解析失败返回 null
|
|
25
8
|
*/
|
|
26
9
|
export declare const emitPathPrimitive: (path: IRPath, nodeIndex: Map<string, NodeLayout>, round: (n: number) => number, measureText?: TextMeasurer) => {
|
|
27
10
|
primitives: Array<ScenePrimitive>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/compile/path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/compile/path.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAGV,MAAM,EACN,UAAU,EAIX,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,UAAU,EAA8C,MAAM,QAAQ,CAAC;AAGrF,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA8VrE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAClC,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAa,YAA+B,KAC3C;IAAE,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAAE,GAAG,IAoerE,CAAC"}
|
|
@@ -1,19 +1,46 @@
|
|
|
1
1
|
//#region src/compile/position.ts
|
|
2
|
+
/** 默认相对定位距离(CompileOptions.nodeDistance 未配时使用) */
|
|
3
|
+
var DEFAULT_NODE_DISTANCE = 1;
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 解析失败返回 null(如引用了未定义节点)。
|
|
5
|
+
* 8 方向 → 屏幕坐标系(y 向下)单位向量
|
|
6
|
+
* @description above=视觉上方 (y 减小);4 对角分量 1/√2 保证斜向与水平/垂直距离等长(对角点落在半径=distance 圆周上)
|
|
6
7
|
*/
|
|
7
|
-
var
|
|
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
|
}
|
|
@@ -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
|
-
*
|
|
5
|
-
*
|
|
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
|
|
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;
|
|
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"}
|
|
@@ -21,10 +21,8 @@ export type TextMetrics = {
|
|
|
21
21
|
descent?: number;
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
|
-
* 文字度量函数接口(编译期由 adapter
|
|
25
|
-
*
|
|
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
|
|
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
|
//#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,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
|
|
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,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
|
-
*
|
|
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)];
|
|
@@ -52,4 +25,3 @@ var arcBoundingPoints = (center, radius, startAngleDeg, endAngleDeg) => {
|
|
|
52
25
|
//#endregion
|
|
53
26
|
exports.arcBoundingPoints = arcBoundingPoints;
|
|
54
27
|
exports.arcEndPoint = arcEndPoint;
|
|
55
|
-
exports.arcSvgFlags = arcSvgFlags;
|
|
@@ -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
|
-
*
|
|
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;
|
|
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,18 +1,7 @@
|
|
|
1
1
|
//#region src/geometry/bend.ts
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
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,18 +1,7 @@
|
|
|
1
1
|
import { Position } from './point';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
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
|
|
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"}
|
|
@@ -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,19 +1,14 @@
|
|
|
1
1
|
import { Position } from './point';
|
|
2
|
-
/** 圆形:几何中心
|
|
2
|
+
/** 圆形:几何中心 + 半径,预留旋转字段保持与 Rect 同形 API */
|
|
3
3
|
export type Circle = {
|
|
4
|
-
/** 圆心横坐标 */
|
|
5
4
|
x: number;
|
|
6
|
-
/** 圆心纵坐标 */
|
|
7
5
|
y: number;
|
|
8
|
-
/**
|
|
6
|
+
/** 半径 */
|
|
9
7
|
radius: number;
|
|
10
|
-
/**
|
|
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,
|
|
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"}
|
|
@@ -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
|
|
74
|
-
*
|
|
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,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
|
-
/**
|
|
6
|
+
/** 中心到 east/west 顶点距离 */
|
|
12
7
|
halfA: number;
|
|
13
|
-
/**
|
|
8
|
+
/** 中心到 north/south 顶点距离 */
|
|
14
9
|
halfB: number;
|
|
15
|
-
/**
|
|
10
|
+
/** 绕中心旋转弧度 */
|
|
16
11
|
rotate?: number;
|
|
17
12
|
};
|
|
18
|
-
/** 菱形 9 个标准 anchor
|
|
13
|
+
/** 菱形 9 个标准 anchor(4 顶点 + 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
|
|
38
|
-
*
|
|
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
|
|
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"}
|
|
@@ -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
|
|
30
|
-
*
|
|
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
|
-
*
|
|
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);
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { Position } from './point';
|
|
2
|
-
/**
|
|
2
|
+
/** 椭圆:中心 + 半长轴 rx / 半短轴 ry + 可选旋转 */
|
|
3
3
|
export type Ellipse = {
|
|
4
|
-
/** 中心横坐标 */
|
|
5
4
|
x: number;
|
|
6
|
-
/** 中心纵坐标 */
|
|
7
5
|
y: number;
|
|
8
|
-
/**
|
|
6
|
+
/** 沿本地 +x */
|
|
9
7
|
rx: number;
|
|
10
|
-
/**
|
|
8
|
+
/** 沿本地 +y */
|
|
11
9
|
ry: number;
|
|
12
|
-
/**
|
|
10
|
+
/** 绕中心旋转弧度 */
|
|
13
11
|
rotate?: number;
|
|
14
12
|
};
|
|
15
|
-
/** 椭圆 9 个标准 anchor
|
|
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
|
|
25
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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"}
|
|
@@ -3,25 +3,24 @@ const require_polar = require("./polar.cjs");
|
|
|
3
3
|
var RAD_TO_DEG = 180 / Math.PI;
|
|
4
4
|
/** 二维向量 / 坐标的基础运算工具集 */
|
|
5
5
|
var point = {
|
|
6
|
-
/**
|
|
6
|
+
/** 向量加 a + b */
|
|
7
7
|
add: (a, b) => [a[0] + b[0], a[1] + b[1]],
|
|
8
|
-
/**
|
|
8
|
+
/** 向量减 a - b */
|
|
9
9
|
sub: (a, b) => [a[0] - b[0], a[1] - b[1]],
|
|
10
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `polar.equal` 委托到本方法。
|
|
20
|
+
* 跨坐标系两点相同判断(笛卡尔或 PolarPosition)
|
|
21
|
+
* @description 极坐标先转笛卡尔再按 precision 四舍五入比较;polar.equal 委托到本方法
|
|
23
22
|
* @param precision 小数点后位数;默认 2
|
|
24
|
-
* @throws 当 PolarPosition
|
|
23
|
+
* @throws 当 PolarPosition.origin 是节点 id 字符串时(需 Scene 上下文)
|
|
25
24
|
*/
|
|
26
25
|
equalPolar: (a, b, precision = 2) => {
|
|
27
26
|
const aCart = Array.isArray(a) ? a : require_polar.polar.toPosition(a);
|
|
@@ -3,22 +3,21 @@ import { PolarPosition } from './polar';
|
|
|
3
3
|
export type Position = [number, number];
|
|
4
4
|
/** 二维向量 / 坐标的基础运算工具集 */
|
|
5
5
|
export declare const point: {
|
|
6
|
-
/**
|
|
6
|
+
/** 向量加 a + b */
|
|
7
7
|
add: (a: Position, b: Position) => Position;
|
|
8
|
-
/**
|
|
8
|
+
/** 向量减 a - b */
|
|
9
9
|
sub: (a: Position, b: Position) => Position;
|
|
10
|
-
/**
|
|
10
|
+
/** 等比缩放 a * k */
|
|
11
11
|
scale: (a: Position, k: number) => Position;
|
|
12
|
-
/**
|
|
12
|
+
/** 两点精确相等(不带容差) */
|
|
13
13
|
equal: (a: Position, b: Position) => boolean;
|
|
14
|
-
/**
|
|
14
|
+
/** 笛卡尔 → 极坐标(angle ∈ (-180,180],origin 默认 [0,0]) */
|
|
15
15
|
toPolar: (p: Position) => PolarPosition;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `polar.equal` 委托到本方法。
|
|
17
|
+
* 跨坐标系两点相同判断(笛卡尔或 PolarPosition)
|
|
18
|
+
* @description 极坐标先转笛卡尔再按 precision 四舍五入比较;polar.equal 委托到本方法
|
|
20
19
|
* @param precision 小数点后位数;默认 2
|
|
21
|
-
* @throws 当 PolarPosition
|
|
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,
|
|
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"}
|