Skip to content

Commit 3065078

Browse files
committed
fix(extension): 修复圆角折线插件会出现没有圆角或圆角旁多了一条线的问题
1 parent e5b2f88 commit 3065078

1 file changed

Lines changed: 19 additions & 4 deletions

File tree

  • packages/extension/src/materials/curved-edge

packages/extension/src/materials/curved-edge/index.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { PolylineEdge, PolylineEdgeModel, h, LogicFlow } from '@logicflow/core'
22
import PointTuple = LogicFlow.PointTuple
33

4+
// 方向类型:t=上(top), b=下(bottom), l=左(left), r=右(right),'' 表示未确定
45
type DirectionType = 't' | 'b' | 'l' | 'r' | ''
6+
// 圆弧所在象限:tl=左上,tr=右上,bl=左下,br=右下,'-' 表示不需要圆弧
57
type ArcQuadrantType = 'tl' | 'tr' | 'bl' | 'br' | '-'
68

9+
// 方向组合到圆弧象限的映射。
10+
// key 由进入方向(dir1)和离开方向(dir2)拼接,例如 'tr' 表示从上(t)到右(r)的拐角。
11+
// 通过该映射确定在拐点处应该绘制的圆弧象限,用于计算中间控制点。
712
const directionMap: {
813
[key: string]: ArcQuadrantType
914
} = {
@@ -17,19 +22,24 @@ const directionMap: {
1722
rt: 'br',
1823
}
1924

25+
// 过滤折线中的共线中间点,减少不必要的顶点
2026
function pointFilter(points: number[][]) {
27+
// 原地修改传入的数组
2128
const all = points
29+
// 从第二个点开始,检查三点是否共线
2230
let i = 1
2331
while (i < all.length - 1) {
2432
const [x, y] = all[i - 1]
2533
const [x1, y1] = all[i]
2634
const [x2, y2] = all[i + 1]
35+
// 如果三点在同一条水平或垂直直线上,删除中间点
2736
if ((x === x1 && x1 === x2) || (y === y1 && y1 === y2)) {
2837
all.splice(i, 1)
2938
} else {
3039
i++
3140
}
3241
}
42+
// 返回精简后的点集
3343
return all
3444
}
3545

@@ -93,18 +103,23 @@ function getPartialPath(
93103
next: PointTuple,
94104
radius: number,
95105
): string {
106+
// 定义误差容错变量
107+
const tolerance = 1
108+
96109
let dir1: DirectionType = ''
97110
let dir2: DirectionType = ''
98111

99-
if (prev[0] === cur[0]) {
112+
if (Math.abs(prev[0] - cur[0]) <= tolerance) {
113+
// 垂直方向
100114
dir1 = prev[1] > cur[1] ? 't' : 'b'
101-
} else if (prev[1] === cur[1]) {
115+
} else if (Math.abs(prev[1] - cur[1]) <= tolerance) {
116+
// 水平方向
102117
dir1 = prev[0] > cur[0] ? 'l' : 'r'
103118
}
104119

105-
if (cur[0] === next[0]) {
120+
if (Math.abs(cur[0] - next[0]) <= tolerance) {
106121
dir2 = cur[1] > next[1] ? 't' : 'b'
107-
} else if (cur[1] === next[1]) {
122+
} else if (Math.abs(cur[1] - next[1]) <= tolerance) {
108123
dir2 = cur[0] > next[0] ? 'l' : 'r'
109124
}
110125

0 commit comments

Comments
 (0)