11import { PolylineEdge , PolylineEdgeModel , h , LogicFlow } from '@logicflow/core'
22import PointTuple = LogicFlow . PointTuple
33
4+ // 方向类型:t=上(top), b=下(bottom), l=左(left), r=右(right),'' 表示未确定
45type DirectionType = 't' | 'b' | 'l' | 'r' | ''
6+ // 圆弧所在象限:tl=左上,tr=右上,bl=左下,br=右下,'-' 表示不需要圆弧
57type ArcQuadrantType = 'tl' | 'tr' | 'bl' | 'br' | '-'
68
9+ // 方向组合到圆弧象限的映射。
10+ // key 由进入方向(dir1)和离开方向(dir2)拼接,例如 'tr' 表示从上(t)到右(r)的拐角。
11+ // 通过该映射确定在拐点处应该绘制的圆弧象限,用于计算中间控制点。
712const directionMap : {
813 [ key : string ] : ArcQuadrantType
914} = {
@@ -17,19 +22,24 @@ const directionMap: {
1722 rt : 'br' ,
1823}
1924
25+ // 过滤折线中的共线中间点,减少不必要的顶点
2026function 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