@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
|
@@ -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"}
|
|
@@ -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
|
}
|
|
@@ -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
|
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,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
|
-
*
|
|
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"}
|
package/dist/es/geometry/arc.js
CHANGED
|
@@ -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)];
|
|
@@ -50,4 +23,4 @@ var arcBoundingPoints = (center, radius, startAngleDeg, endAngleDeg) => {
|
|
|
50
23
|
return points;
|
|
51
24
|
};
|
|
52
25
|
//#endregion
|
|
53
|
-
export { arcBoundingPoints, arcEndPoint
|
|
26
|
+
export { arcBoundingPoints, arcEndPoint };
|
|
@@ -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"}
|
package/dist/es/geometry/bend.js
CHANGED
|
@@ -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,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"}
|
|
@@ -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
|
-
/**
|
|
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"}
|
|
@@ -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,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"}
|
|
@@ -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);
|
|
@@ -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"}
|
|
@@ -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
|
-
/**
|
|
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 : polar.toPosition(a);
|