vislite 1.10.0 → 1.11.0

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.
@@ -0,0 +1,184 @@
1
+ # Canvas 画笔 API
2
+
3
+ Canvas 是 VISLite 的核心画笔之一,**绘制 API 完全一致**,但初始化方式因平台而异。
4
+
5
+ ## 平台初始化方式
6
+
7
+ ### H5 端
8
+
9
+ ```js
10
+ import { Canvas } from 'vislite';
11
+
12
+ var painter = new Canvas(document.getElementById('root'), {
13
+ scale: 2, // 缩放倍率,默认2
14
+ region: true, // 是否启用区域检测,默认true
15
+ willReadFrequently: false
16
+ }, width, height);
17
+ ```
18
+
19
+ ### 微信/支付宝小程序
20
+
21
+ 小程序端需要使用 ui-canvas 组件,详见:
22
+ - [微信小程序 Canvas](miniprogram/ui-canvas.md)
23
+ - [支付宝小程序 Canvas](minialipay/ui-canvas.md)
24
+
25
+ ### uni-app
26
+
27
+ uni-app 根据编译目标平台选择上述方式,详见:
28
+ - [uni-app Canvas](uniapp/ui-canvas.md)
29
+
30
+ ## 配置项 (config)
31
+
32
+ ```js
33
+ painter.config({
34
+ fillStyle: 'red', // 填充色
35
+ strokeStyle: 'black', // 轮廓色
36
+ lineWidth: 1, // 线宽
37
+ lineCap: 'butt', // 线端点类型:butt|round|square
38
+ lineJoin: 'miter', // 线拐角:miter|bevel|round
39
+ lineDash: [], // 虚线样式
40
+ textAlign: 'left', // 文字水平对齐:left|center|right
41
+ textBaseline: 'middle', // 文字垂直对齐:middle|top|bottom
42
+ shadowBlur: 0, // 阴影模糊
43
+ shadowColor: 'black', // 阴影颜色
44
+ fontSize: 16, // 字体大小
45
+ fontFamily: 'sans-serif', // 字体
46
+ fontWeight: 400, // 字重
47
+ fontStyle: 'normal', // 字类型
48
+ arcStartCap: 'butt', // 圆弧开始端闭合:butt|round|-round
49
+ arcEndCap: 'butt', // 圆弧结束端闭合
50
+ rectRadius: [10, 10, 10, 10] // 矩形圆角
51
+ });
52
+ ```
53
+
54
+ ### 渐变色
55
+
56
+ ```js
57
+ // 线性渐变
58
+ var gradient = painter.createLinearGradient(x1, y1, x2, y2);
59
+ gradient.setColor(0, 'red').setColor(1, 'blue');
60
+ painter.config({ fillStyle: gradient.value() });
61
+
62
+ // 环形渐变
63
+ var gradient = painter.createRadialGradient(cx, cy, r1, r2);
64
+ gradient.setColor(0, 'red').setColor(1, 'blue');
65
+
66
+ // 角度渐变 (1.2.0+)
67
+ var gradient = painter.createConicGradient(cx, cy, beginDeg, deg);
68
+ gradient.setColor(0, 'red').setColor(1, 'blue');
69
+ ```
70
+
71
+ ## 文字绘制
72
+
73
+ ```js
74
+ painter.fillText(text, x, y, deg); // 填充文字
75
+ painter.strokeText(text, x, y, deg); // 轮廓文字
76
+ painter.fullText(text, x, y, deg); // 填充+轮廓文字
77
+
78
+ // 多行文字
79
+ painter.fillTexts(contents, x, y, width, lineHeight, deg);
80
+ painter.strokeTexts(contents, x, y, width, lineHeight, deg);
81
+ painter.fullTexts(contents, x, y, width, lineHeight, deg);
82
+
83
+ // 计算文字宽度
84
+ painter.textWidth(text);
85
+ ```
86
+
87
+ ## 路径操作
88
+
89
+ ```js
90
+ painter.beginPath(); // 开始路径
91
+ painter.closePath(); // 闭合路径
92
+ painter.moveTo(x, y); // 移动起点
93
+ painter.lineTo(x, y); // 画线
94
+ painter.arc(x, y, r, beginDeg, deg); // 圆弧
95
+ painter.quadraticCurveTo(cpx, cpy, x, y); // 二次贝塞尔
96
+ painter.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); // 三次贝塞尔
97
+ painter.fill(); // 填充
98
+ painter.stroke(); // 描边
99
+ painter.full(); // 填充+描边
100
+ painter.clip(); // 裁剪
101
+ ```
102
+
103
+ ## 画布操作
104
+
105
+ ```js
106
+ painter.save(); // 保存状态
107
+ painter.restore(); // 恢复状态
108
+ painter.clearRect(x, y, w, h); // 清除矩形区域
109
+ painter.clearCircle(cx, cy, r); // 清除圆形区域
110
+
111
+ // 缩放
112
+ painter.scale(x, y);
113
+
114
+ // 获取画布信息
115
+ painter.getInfo(); // { width, height }
116
+
117
+ // 获取原始画布上下文
118
+ painter.getContext(); // CanvasRenderingContext2D
119
+ ```
120
+
121
+ ## 区域交互
122
+
123
+ ```js
124
+ // 设置当前绑定的区域名称
125
+ painter.setRegion('regionName');
126
+
127
+ // 获取点击所在的区域名称
128
+ painter.getRegion(x, y).then(regionName => {
129
+ console.log(regionName);
130
+ });
131
+
132
+ // 绑定点击事件
133
+ painter.bind('click', (regionName, x, y) => {
134
+ console.log(regionName, x, y);
135
+ });
136
+
137
+ // 只绘制区域(用于交互检测)
138
+ painter.onlyRegion(true);
139
+
140
+ // 只绘制视图
141
+ painter.onlyView(true);
142
+ ```
143
+
144
+ ## 图形绘制(便捷方法)
145
+
146
+ ```js
147
+ // 圆
148
+ painter.fillCircle(x, y, r); // 填充圆
149
+ painter.strokeCircle(x, y, r); // 描边圆
150
+ painter.fullCircle(x, y, r); // 填充+描边圆
151
+
152
+ // 矩形
153
+ painter.fillRect(x, y, w, h);
154
+ painter.strokeRect(x, y, w, h);
155
+ painter.fullRect(x, y, w, h);
156
+
157
+ // 圆环 (1.1.0+)
158
+ painter.fillRing(x, y, r1, r2);
159
+ painter.strokeRing(x, y, r1, r2);
160
+ painter.fullRing(x, y, r1, r2);
161
+
162
+ // 椭圆 (1.1.0+)
163
+ painter.fillEllipse(x, y, r1, r2, deg);
164
+ painter.strokeEllipse(x, y, r1, r2, deg);
165
+ ```
166
+
167
+ ## 导出
168
+
169
+ ```js
170
+ // 导出为图片
171
+ painter.toDataURL(type, encoderOptions).then(dataUrl => {
172
+ // dataUrl 即为 base64 图片
173
+ });
174
+ ```
175
+
176
+ ## 重置
177
+
178
+ ```js
179
+ // 重置为默认配置
180
+ painter.reset();
181
+
182
+ // 带自定义配置重置
183
+ painter.reset({ fillStyle: 'blue', fontSize: 20 });
184
+ ```
@@ -0,0 +1,130 @@
1
+ # 插值函数 API
2
+
3
+ VISLite 提供 Cardinal 和 Hermite 两种三次插值函数,用于平滑曲线绘制。
4
+
5
+ ## Hermite 插值
6
+
7
+ Hermite 插值需要指定两个端点和两个端点处的斜率。
8
+
9
+ ### 引入
10
+
11
+ ```js
12
+ import { Hermite } from 'vislite';
13
+ ```
14
+
15
+ ### 初始化
16
+
17
+ ```js
18
+ var hermite = new Hermite(u);
19
+ ```
20
+
21
+ - **u**: 张弛系数,控制曲线在端点处的弯曲程度,默认 0.5
22
+
23
+ ### 设置点位置
24
+
25
+ ```js
26
+ hermite.setP(x1, y1, x2, y2, s1, s2);
27
+ ```
28
+
29
+ 参数说明:
30
+ - **x1, y1**: 左边点位置
31
+ - **x2, y2**: 右边点位置
32
+ - **s1**: 左边点的切线斜率
33
+ - **s2**: 右边点的切线斜率
34
+
35
+ ### 计算插值
36
+
37
+ ```js
38
+ var y = hermite.use(x);
39
+ ```
40
+
41
+ 根据 x 值返回对应的 y 值。
42
+
43
+ ### 示例
44
+
45
+ ```js
46
+ var hermite = new Hermite(0.5);
47
+
48
+ hermite.setP(0, 0, 100, 100, 0, 1);
49
+
50
+ // 计算x=50时的y值
51
+ var y = hermite.use(50);
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Cardinal 插值
57
+
58
+ Cardinal 插值是 Hermite 的扩展,只需提供点序列,系统自动计算斜率。
59
+
60
+ ### 引入
61
+
62
+ ```js
63
+ import { Cardinal } from 'vislite';
64
+ ```
65
+
66
+ ### 初始化
67
+
68
+ ```js
69
+ var cardinal = new Cardinal(t);
70
+ ```
71
+
72
+ - **t**: 张弛系数,控制曲线走势,默认 0
73
+ - t = 0:默认曲线
74
+ - t = -1:分水岭效果
75
+ - |t| 越大,曲线调整越剧烈
76
+
77
+ ### 设置点序列
78
+
79
+ ```js
80
+ cardinal.setP([[x1, y1], [x2, y2], [x3, y3], ...]);
81
+ ```
82
+
83
+ 至少需要两个点。
84
+
85
+ ### 计算插值
86
+
87
+ ```js
88
+ var y = cardinal.use(x);
89
+ ```
90
+
91
+ 根据 x 值返回对应的 y 值。
92
+
93
+ ### 示例
94
+
95
+ ```js
96
+ var cardinal = new Cardinal(0);
97
+
98
+ cardinal.setP([
99
+ [0, 0],
100
+ [25, 25],
101
+ [50, 10],
102
+ [75, 50],
103
+ [100, 100]
104
+ ]);
105
+
106
+ // 绘制平滑曲线
107
+ for (var x = 0; x <= 100; x += 1) {
108
+ var y = cardinal.use(x);
109
+ painter.lineTo(x, y);
110
+ }
111
+ painter.stroke();
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 对比与选择
117
+
118
+ | 特性 | Hermite | Cardinal |
119
+ |------|---------|----------|
120
+ | 端点斜率 | 手动指定 | 自动计算 |
121
+ | 参数数量 | 6个 | 2个(点序列) |
122
+ | 灵活性 | 高(可自定义斜率) | 中(受邻近点影响) |
123
+ | 适用场景 | 精确控制曲线形状 | 自然平滑的曲线 |
124
+
125
+ ## 应用场景
126
+
127
+ - **折线图平滑**: 使用 Cardinal
128
+ - **动画路径**: 使用 Hermite 自定义缓动
129
+ - **字体渲染**: 使用 Cardinal 平滑字形边缘
130
+ - **地图等高线**: 使用 Hermite 精确控制地形变化
@@ -0,0 +1,175 @@
1
+ # Matrix4 矩阵变换
2
+
3
+ Matrix4 提供 4x4 矩阵变换能力,用于复杂的图形变换。
4
+
5
+ ## 引入
6
+
7
+ ```js
8
+ import { Matrix4 } from 'vislite';
9
+ ```
10
+
11
+ ## 初始化
12
+
13
+ ```js
14
+ var matrix = new Matrix4();
15
+ // 或指定初始矩阵
16
+ var matrix = new Matrix4([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
17
+ ```
18
+
19
+ ## 基本变换
20
+
21
+ ### 平移
22
+
23
+ ```js
24
+ matrix.move(dis, a, b, c);
25
+ ```
26
+
27
+ 参数说明:
28
+ - **dis**: 移动距离
29
+ - **a, b, c**: 移动方向向量的 x, y, z 分量
30
+
31
+ ```js
32
+ // 向x轴正方向移动10
33
+ matrix.move(10, 1, 0, 0);
34
+
35
+ // 向y轴负方向移动5
36
+ matrix.move(-5, 0, 1, 0);
37
+ ```
38
+
39
+ ### 旋转
40
+
41
+ ```js
42
+ matrix.rotate(deg, a1, b1, c1, a2, b2, c2);
43
+ ```
44
+
45
+ 参数说明:
46
+ - **deg**: 旋转角度(弧度制)
47
+ - **a1, b1, c1**: 旋转轴向量(确定旋转平面)
48
+ - **a2, b2, c2**: 旋转正方向向量
49
+
50
+ ```js
51
+ // 绕x轴旋转
52
+ matrix.rotate(Math.PI, 1, 0, 0);
53
+
54
+ // 绕y轴旋转
55
+ matrix.rotate(Math.PI, 0, 1, 0);
56
+
57
+ // 绕z轴旋转
58
+ matrix.rotate(Math.PI, 0, 0, 1);
59
+ ```
60
+
61
+ ### 缩放
62
+
63
+ ```js
64
+ matrix.scale(xTimes, yTimes, zTimes, cx, cy, cz);
65
+ ```
66
+
67
+ 参数说明:
68
+ - **xTimes, yTimes, zTimes**: 各轴缩放比例
69
+ - **cx, cy, cz**: 缩放中心点坐标
70
+
71
+ ```js
72
+ // 以原点为中心放大2倍
73
+ matrix.scale(2, 2, 2);
74
+
75
+ // 以(10, 10, 0)为中心放大
76
+ matrix.scale(2, 2, 1, 10, 10, 0);
77
+ ```
78
+
79
+ ## 矩阵运算
80
+
81
+ ### 矩阵乘法
82
+
83
+ ```js
84
+ matrix.multiply(newMatrix4, flag);
85
+ ```
86
+
87
+ - **flag**: false(默认)新矩阵左乘当前矩阵;true 则右乘
88
+
89
+ ### 应用变换
90
+
91
+ ```js
92
+ var [x, y, z, w] = matrix.use(px, py, pz, pw);
93
+ ```
94
+
95
+ 将变换应用到坐标点,返回变换后的齐次坐标。
96
+
97
+ ### 获取矩阵值
98
+
99
+ ```js
100
+ var values = matrix.value();
101
+ ```
102
+
103
+ 返回 4x4 矩阵的 16 个元素数组(列主序存储)。
104
+
105
+ ### 重置矩阵
106
+
107
+ ```js
108
+ matrix.setValue([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
109
+ ```
110
+
111
+ ## 使用示例
112
+
113
+ ### 组合变换
114
+
115
+ ```js
116
+ var matrix = new Matrix4();
117
+
118
+ // 先平移再旋转
119
+ matrix.move(100, 1, 0, 0);
120
+ matrix.rotate(Math.PI / 4, 0, 0, 1);
121
+
122
+ // 应用到点
123
+ var [x, y] = matrix.use(10, 20, 0);
124
+ ```
125
+
126
+ ### 3D 变换
127
+
128
+ ```js
129
+ var matrix = new Matrix4();
130
+
131
+ // 绕x轴旋转45度
132
+ matrix.rotate(Math.PI / 4, 1, 0, 0);
133
+
134
+ // 绕y轴旋转30度
135
+ matrix.rotate(Math.PI / 6, 0, 1, 0);
136
+
137
+ // 应用到3D点
138
+ var [x, y, z, w] = matrix.use(10, 20, 30);
139
+ ```
140
+
141
+ ---
142
+
143
+ ## 基础变换函数
144
+
145
+ 除 Matrix4 类外,还提供独立的基础变换函数:
146
+
147
+ ### rotate 旋转
148
+
149
+ ```js
150
+ import { rotate } from 'vislite';
151
+
152
+ var [x, y] = rotate(cx, cy, deg, px, py);
153
+ ```
154
+
155
+ 绕点 (cx, cy) 旋转 deg 弧度后的 (px, py) 坐标。
156
+
157
+ ### move 平移
158
+
159
+ ```js
160
+ import { move } from 'vislite';
161
+
162
+ var [x, y, z] = move(dis, a, b, c, px, py, pz);
163
+ ```
164
+
165
+ 沿向量 (a, b, c) 方向移动 dis 距离后的坐标。
166
+
167
+ ### scale 缩放
168
+
169
+ ```js
170
+ import { scale } from 'vislite';
171
+
172
+ var [x, y, z] = scale(times, cx, cy, cz, px, py, pz);
173
+ ```
174
+
175
+ 以 (cx, cy, cz) 为中心缩放 times 倍后的坐标。
@@ -0,0 +1,132 @@
1
+ # PieLayout 饼图布局
2
+
3
+ PieLayout 用于绘制饼图/环形图,支持交互和动画。
4
+
5
+ ## 引入
6
+
7
+ ```js
8
+ import { PieLayout } from 'vislite';
9
+ ```
10
+
11
+ ## 初始化
12
+
13
+ ```js
14
+ var pieLayout = new PieLayout(config);
15
+ ```
16
+
17
+ ### config 配置
18
+
19
+ ```js
20
+ {
21
+ // 获取名称
22
+ name: function(pieData, initPie) {
23
+ return pieData.name;
24
+ },
25
+
26
+ // 获取值
27
+ value: function(pieData, initPie) {
28
+ return pieData.value;
29
+ }
30
+ }
31
+ ```
32
+
33
+ ## setOption 设置布局行为
34
+
35
+ ```js
36
+ pieLayout.setOption({
37
+ cx: 200, // 圆心x坐标
38
+ cy: 200, // 圆心y坐标
39
+ radius: [50, 100], // 半径:[内半径, 外半径]
40
+ duration: 200 // 动画时长(ms)
41
+ });
42
+ ```
43
+
44
+ ## use 坐标计算
45
+
46
+ ```js
47
+ var pie = pieLayout.use(initPie, hoverIndex);
48
+ ```
49
+
50
+ ### 返回值 pie 结构
51
+
52
+ ```js
53
+ {
54
+ count: 数据项数量,
55
+ cx: 圆心x,
56
+ cy: 圆心y,
57
+ radius: [内半径, 外半径],
58
+ hoverIndex: 当前悬浮项索引,
59
+ node: [
60
+ {
61
+ value: 数值,
62
+ name: 名称,
63
+ beginDeg: 开始弧度,
64
+ deg: 跨越弧度,
65
+ isHover: 是否悬浮,
66
+ radius: [当前内半径, 当前外半径],
67
+ label: {
68
+ line: [[x1,y1], [x2,y2], [x3,y3]], // 标签线
69
+ position: [x, y], // 标签位置
70
+ align: 'left' | 'right' // 对齐方式
71
+ }
72
+ }
73
+ ]
74
+ }
75
+ ```
76
+
77
+ ## bind 绑定渲染
78
+
79
+ ```js
80
+ pieLayout.bind(initPie, function(pie) {
81
+ // 绘制饼图
82
+ for (var i = 0; i < pie.count; i++) {
83
+ var node = pie.node[i];
84
+ // 绘制扇形...
85
+ }
86
+ });
87
+ ```
88
+
89
+ ## 交互方法
90
+
91
+ ```js
92
+ // 设置悬浮项
93
+ pieLayout.setHover(index);
94
+
95
+ // 更新布局
96
+ pieLayout.doUpdate();
97
+
98
+ // 解绑
99
+ pieLayout.unbind();
100
+ ```
101
+
102
+ ## 使用示例
103
+
104
+ ```js
105
+ var pieLayout = new PieLayout();
106
+
107
+ pieLayout.setOption({
108
+ cx: 200,
109
+ cy: 200,
110
+ radius: [30, 100],
111
+ duration: 300
112
+ });
113
+
114
+ var data = [
115
+ { name: 'HTML', value: 30 },
116
+ { name: 'CSS', value: 20 },
117
+ { name: 'JavaScript', value: 50 }
118
+ ];
119
+
120
+ var pie = pieLayout.use(data);
121
+
122
+ // 绘制饼图
123
+ for (var i = 0; i < pie.count; i++) {
124
+ var node = pie.node[i];
125
+ var colors = ['red', 'green', 'blue'];
126
+
127
+ painter.config({
128
+ fillStyle: colors[i]
129
+ }).fillArc(pie.cx, pie.cy, node.radius[0], node.radius[1],
130
+ node.beginDeg, node.deg);
131
+ }
132
+ ```