vislite 0.5.2-alpha.0 → 0.5.2-alpha.2

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.
Files changed (70) hide show
  1. package/CHANGELOG +7 -1
  2. package/lib/Buffer/index.umd.js +55 -0
  3. package/lib/Buffer/index.umd.min.js +11 -0
  4. package/lib/Canvas/index.umd.js +721 -0
  5. package/lib/Canvas/index.umd.min.js +11 -0
  6. package/lib/Cardinal/index.umd.js +112 -0
  7. package/lib/Cardinal/index.umd.min.js +11 -0
  8. package/lib/Eoap/index.umd.js +53 -0
  9. package/lib/Eoap/index.umd.min.js +11 -0
  10. package/lib/Geometry/index.umd.js +205 -0
  11. package/lib/Geometry/index.umd.min.js +11 -0
  12. package/lib/Hermite/index.umd.js +55 -0
  13. package/lib/Hermite/index.umd.min.js +11 -0
  14. package/lib/Matrix4/index.umd.js +146 -0
  15. package/lib/Matrix4/index.umd.min.js +11 -0
  16. package/lib/Mercator/index.umd.js +39 -0
  17. package/lib/Mercator/index.umd.min.js +11 -0
  18. package/lib/OralCanvas/index.es.js +657 -0
  19. package/lib/OralCanvas/index.es.min.js +11 -0
  20. package/lib/OralWebGL/index.es.js +611 -0
  21. package/lib/OralWebGL/index.es.min.js +11 -0
  22. package/lib/SVG/index.umd.js +540 -0
  23. package/lib/SVG/index.umd.min.js +11 -0
  24. package/lib/Shader/index.umd.js +134 -0
  25. package/lib/Shader/index.umd.min.js +11 -0
  26. package/lib/Texture/index.umd.js +72 -0
  27. package/lib/Texture/index.umd.min.js +11 -0
  28. package/lib/TreeLayout/index.umd.js +430 -0
  29. package/lib/TreeLayout/index.umd.min.js +11 -0
  30. package/lib/WebGL/index.umd.js +684 -0
  31. package/lib/WebGL/index.umd.min.js +11 -0
  32. package/lib/animation/index.umd.js +91 -0
  33. package/lib/animation/index.umd.min.js +11 -0
  34. package/lib/formatColor/index.umd.js +59 -0
  35. package/lib/formatColor/index.umd.min.js +11 -0
  36. package/lib/getLoopColors/index.umd.js +55 -0
  37. package/lib/getLoopColors/index.umd.min.js +11 -0
  38. package/lib/getWebGLContext/index.umd.js +65 -0
  39. package/lib/getWebGLContext/index.umd.min.js +11 -0
  40. package/lib/index.umd.js +2916 -0
  41. package/lib/index.umd.min.js +11 -0
  42. package/lib/move/index.umd.js +27 -0
  43. package/lib/move/index.umd.min.js +11 -0
  44. package/lib/resizeObserver/index.umd.js +48 -0
  45. package/lib/resizeObserver/index.umd.min.js +11 -0
  46. package/lib/rotate/index.umd.js +27 -0
  47. package/lib/rotate/index.umd.min.js +11 -0
  48. package/lib/ruler/index.umd.js +145 -0
  49. package/lib/ruler/index.umd.min.js +11 -0
  50. package/lib/scale/index.umd.js +26 -0
  51. package/lib/scale/index.umd.min.js +11 -0
  52. package/lib/throttle/index.umd.js +70 -0
  53. package/lib/throttle/index.umd.min.js +11 -0
  54. package/lib/viewHandler/index.umd.js +139 -0
  55. package/lib/viewHandler/index.umd.min.js +11 -0
  56. package/package/index.ts +4 -0
  57. package/package/move/index.ts +3 -0
  58. package/package/scale/index.ts +3 -0
  59. package/package.json +1 -1
  60. package/src/common/svg/config.ts +157 -145
  61. package/src/common/svg/gradient.ts +63 -0
  62. package/src/common/svg/index.ts +12 -0
  63. package/src/move.ts +8 -0
  64. package/src/scale.ts +7 -0
  65. package/types/Canvas.d.ts +2 -2
  66. package/types/Gradient.d.ts +2 -2
  67. package/types/SVG.d.ts +23 -0
  68. package/types/index.d.ts +6 -0
  69. package/types/move.d.ts +3 -0
  70. package/types/scale.d.ts +3 -0
@@ -0,0 +1,139 @@
1
+ /*!
2
+ * VISLite JavaScript Library v0.5.2-alpha.2
3
+ * git+https://github.com/oi-contrib/VISLite.git
4
+ *
5
+ * Copyright zxl20070701
6
+ * Released under the MIT license
7
+ * https://zxl20070701.github.io/notebook/home.html
8
+ *
9
+ * Publish Date: Mon Oct 23 2023 22:21:10 GMT+0800 (中国标准时间)
10
+ */
11
+ (function (global, factory) {
12
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
13
+ typeof define === 'function' && define.amd ? define(factory) :
14
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VISLite_viewHandler = factory());
15
+ })(this, (function () { 'use strict';
16
+
17
+ var mousePosition = function (el, event) {
18
+ var bounding = el.getBoundingClientRect();
19
+ return {
20
+ "x": event.clientX - bounding.left,
21
+ "y": event.clientY - bounding.top
22
+ };
23
+ };
24
+ var getKeyString = function (event) {
25
+ return {
26
+ 37: "left",
27
+ 38: "up",
28
+ 39: "right",
29
+ 40: "down",
30
+ }[event.keyCode || event.which];
31
+ };
32
+ function viewHandler (callback) {
33
+ var el = document.getElementsByTagName('body')[0];
34
+ el.addEventListener("keydown", function (event) {
35
+ var keyCode = getKeyString(event);
36
+ if (keyCode == 'up') {
37
+ callback({
38
+ type: "lookUp",
39
+ normal: [],
40
+ value: 0.1,
41
+ event: event
42
+ });
43
+ }
44
+ else if (keyCode == 'down') {
45
+ callback({
46
+ type: "lookDown",
47
+ normal: [],
48
+ value: 0.1,
49
+ event: event
50
+ });
51
+ }
52
+ else if (keyCode == 'left') {
53
+ callback({
54
+ type: "lookLeft",
55
+ normal: [],
56
+ value: 0.1,
57
+ event: event
58
+ });
59
+ }
60
+ else if (keyCode == 'right') {
61
+ callback({
62
+ type: "lookRight",
63
+ normal: [],
64
+ value: 0.1,
65
+ event: event
66
+ });
67
+ }
68
+ });
69
+ var mouseP = null;
70
+ var doMove = function (event) {
71
+ if (mouseP == null) {
72
+ callback({
73
+ type: "hover",
74
+ normal: [],
75
+ value: 0,
76
+ event: event
77
+ });
78
+ }
79
+ else {
80
+ var tempMouseP = mousePosition(el, event);
81
+ var normal = [tempMouseP.x - mouseP.x, tempMouseP.y - mouseP.y];
82
+ var rotateNormal = [
83
+ normal[1],
84
+ normal[0],
85
+ 0
86
+ ];
87
+ if (rotateNormal[0] == 0 && rotateNormal[1] == 0)
88
+ return;
89
+ callback({
90
+ type: "rotate",
91
+ normal: rotateNormal,
92
+ value: (Math.abs(tempMouseP.x - mouseP.x) + Math.abs(tempMouseP.y - mouseP.y)) * 0.01,
93
+ event: event
94
+ });
95
+ mouseP = tempMouseP;
96
+ }
97
+ };
98
+ el.addEventListener("mousedown", function (event) {
99
+ mouseP = mousePosition(el, event);
100
+ });
101
+ el.addEventListener("mouseup", function (event) {
102
+ mouseP = null;
103
+ });
104
+ el.addEventListener("mousemove", function (event) {
105
+ doMove(event);
106
+ });
107
+ el.addEventListener("touchend", function (event) {
108
+ mouseP = null;
109
+ });
110
+ el.addEventListener("touchstart", function (event) {
111
+ mouseP = mousePosition(el, event);
112
+ });
113
+ el.addEventListener("touchmove", function (event) {
114
+ doMove(event.touches[0]);
115
+ });
116
+ var doScale = function (value, event) {
117
+ if (value == 0)
118
+ return;
119
+ var baseTimes = 0.899;
120
+ callback({
121
+ type: "scale",
122
+ value: value < 0 ? baseTimes : 2 - baseTimes,
123
+ normal: [],
124
+ event: event
125
+ });
126
+ };
127
+ el.addEventListener("mousewheel", function (event) {
128
+ doScale(event.wheelDelta, event);
129
+ });
130
+ if (window.addEventListener) {
131
+ window.addEventListener('DOMMouseScroll', function (event) {
132
+ doScale(-1 * event.detail, event);
133
+ }, false);
134
+ }
135
+ }
136
+
137
+ return viewHandler;
138
+
139
+ }));
@@ -0,0 +1,11 @@
1
+ /*!
2
+ * VISLite JavaScript Library v0.5.2-alpha.2
3
+ * git+https://github.com/oi-contrib/VISLite.git
4
+ *
5
+ * Copyright zxl20070701
6
+ * Released under the MIT license
7
+ * https://zxl20070701.github.io/notebook/home.html
8
+ *
9
+ * Publish Date: Mon Oct 23 2023 22:21:10 GMT+0800 (中国标准时间)
10
+ */
11
+ var e,n;e=this,n=function(){"use strict";var e=function(e,n){var t=e.getBoundingClientRect();return{x:n.clientX-t.left,y:n.clientY-t.top}};return function(n){var t=document.getElementsByTagName("body")[0];t.addEventListener("keydown",(function(e){var t=function(e){return{37:"left",38:"up",39:"right",40:"down"}[e.keyCode||e.which]}(e);"up"==t?n({type:"lookUp",normal:[],value:.1,event:e}):"down"==t?n({type:"lookDown",normal:[],value:.1,event:e}):"left"==t?n({type:"lookLeft",normal:[],value:.1,event:e}):"right"==t&&n({type:"lookRight",normal:[],value:.1,event:e})}));var o=null,i=function(i){if(null==o)n({type:"hover",normal:[],value:0,event:i});else{var u=e(t,i),l=[u.x-o.x,u.y-o.y],a=[l[1],l[0],0];if(0==a[0]&&0==a[1])return;n({type:"rotate",normal:a,value:.01*(Math.abs(u.x-o.x)+Math.abs(u.y-o.y)),event:i}),o=u}};t.addEventListener("mousedown",(function(n){o=e(t,n)})),t.addEventListener("mouseup",(function(e){o=null})),t.addEventListener("mousemove",(function(e){i(e)})),t.addEventListener("touchend",(function(e){o=null})),t.addEventListener("touchstart",(function(n){o=e(t,n)})),t.addEventListener("touchmove",(function(e){i(e.touches[0])}));var u=function(e,t){0!=e&&n({type:"scale",value:e<0?.899:1.101,normal:[],event:t})};t.addEventListener("mousewheel",(function(e){u(e.wheelDelta,e)})),window.addEventListener&&window.addEventListener("DOMMouseScroll",(function(e){u(-1*e.detail,e)}),!1)}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).VISLite_viewHandler=n();
package/package/index.ts CHANGED
@@ -3,6 +3,8 @@ import Hermite from "./Hermite/index"
3
3
 
4
4
  import Matrix4 from "./Matrix4/index"
5
5
  import rotate from "./rotate/index"
6
+ import move from "./move/index"
7
+ import scale from "./scale/index"
6
8
 
7
9
  import getLoopColors from "./getLoopColors/index"
8
10
  import formatColor from "./formatColor/index"
@@ -38,6 +40,8 @@ export default {
38
40
  // 变换
39
41
  Matrix4,
40
42
  rotate,
43
+ move,
44
+ scale,
41
45
 
42
46
  // 工具
43
47
  getLoopColors,
@@ -0,0 +1,3 @@
1
+ import move from "../../src/move"
2
+
3
+ export default move
@@ -0,0 +1,3 @@
1
+ import scale from "../../src/scale"
2
+
3
+ export default scale
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vislite",
3
- "version": "0.5.2-alpha.0",
3
+ "version": "0.5.2-alpha.2",
4
4
  "description": "灵活、快速、简单的数据可视化交互式跨端前端库",
5
5
  "main": "./lib/index.umd.min.js",
6
6
  "typings": "./types/index.d.ts",
@@ -3,172 +3,184 @@ import type SVGConfigType from "../../../types/SVGConfig"
3
3
  import { setAttribute } from "./tool"
4
4
  import setStyle from "../setStyle"
5
5
  import arc from "../canvas/arc"
6
+ import { toNode } from "./tool"
7
+
8
+ export let initDefs = (el: SVGElement) => {
9
+ let defs = el.getElementsByTagName('defs')
10
+ if (defs.length <= 0) {
11
+ let newDefs = toNode("defs")
12
+ el.appendChild(newDefs)
13
+ return newDefs
14
+ } else {
15
+ return defs[0]
16
+ }
17
+ }
6
18
 
7
19
  // 文字统一设置方法
8
20
  export let initText = (
9
- el: SVGElement,
10
- config: SVGConfigType,
11
- x: number,
12
- y: number,
13
- deg: number
21
+ el: SVGElement,
22
+ config: SVGConfigType,
23
+ x: number,
24
+ y: number,
25
+ deg: number
14
26
  ) => {
15
- if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
16
-
17
- // 垂直对齐采用dy实现
18
- setAttribute(
19
- el,
20
- "dy",
21
- {
22
- top: config["fontSize"] * 0.5,
23
- middle: 0,
24
- bottom: -config["fontSize"] * 0.5,
25
- }[config.textBaseline]
26
- )
27
-
28
- setStyle(el, {
29
- // 文字对齐方式
30
- "text-anchor": {
31
- left: "start",
32
- right: "end",
33
- center: "middle",
34
- }[config.textAlign],
35
- "dominant-baseline": "central",
36
-
37
- // 文字大小和字体设置
38
- "font-size": config["fontSize"] + "px",
39
- "font-family": config["fontFamily"],
40
- })
41
-
42
- // 位置
43
- setAttribute(el, "x", x)
44
- setAttribute(el, "y", y)
45
-
46
- // 旋转
47
- if (typeof deg == "number") {
48
- deg = deg % 360
49
- setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
50
- }
27
+ if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
28
+
29
+ // 垂直对齐采用dy实现
30
+ setAttribute(
31
+ el,
32
+ "dy",
33
+ {
34
+ top: config["fontSize"] * 0.5,
35
+ middle: 0,
36
+ bottom: -config["fontSize"] * 0.5,
37
+ }[config.textBaseline]
38
+ )
39
+
40
+ setStyle(el, {
41
+ // 文字对齐方式
42
+ "text-anchor": {
43
+ left: "start",
44
+ right: "end",
45
+ center: "middle",
46
+ }[config.textAlign],
47
+ "dominant-baseline": "central",
48
+
49
+ // 文字大小和字体设置
50
+ "font-size": config["fontSize"] + "px",
51
+ "font-family": config["fontFamily"],
52
+ })
53
+
54
+ // 位置
55
+ setAttribute(el, "x", x)
56
+ setAttribute(el, "y", y)
57
+
58
+ // 旋转
59
+ if (typeof deg == "number") {
60
+ deg = deg % 360
61
+ setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
62
+ }
51
63
  }
52
64
 
53
65
  // 画圆统一设置方法
54
66
  export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
55
- if (el.nodeName.toLowerCase() !== "circle")
56
- throw new Error("Need a <circle> !")
57
- setAttribute(el, "cx", cx)
58
- setAttribute(el, "cy", cy)
59
- setAttribute(el, "r", r)
67
+ if (el.nodeName.toLowerCase() !== "circle")
68
+ throw new Error("Need a <circle> !")
69
+ setAttribute(el, "cx", cx)
70
+ setAttribute(el, "cy", cy)
71
+ setAttribute(el, "r", r)
60
72
  }
61
73
 
62
74
  // 路径统一设置方法
63
75
  export let initPath = (el: SVGElement, path: string) => {
64
- if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
65
- setAttribute(el, "d", path)
76
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
77
+ setAttribute(el, "d", path)
66
78
  }
67
79
 
68
80
  // 画矩形统一设置方法
69
81
  export let initRect = (
70
- el: SVGElement,
71
- x: number,
72
- y: number,
73
- width: number,
74
- height: number
82
+ el: SVGElement,
83
+ x: number,
84
+ y: number,
85
+ width: number,
86
+ height: number
75
87
  ) => {
76
- if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
77
-
78
- // 由于高和宽不可以是负数,校对一下
79
- if (height < 0) {
80
- height *= -1
81
- y -= height
82
- }
83
- if (width < 0) {
84
- width *= -1
85
- x -= width
86
- }
87
-
88
- setAttribute(el, "x", x)
89
- setAttribute(el, "y", y)
90
- setAttribute(el, "width", width)
91
- setAttribute(el, "height", height)
88
+ if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
89
+
90
+ // 由于高和宽不可以是负数,校对一下
91
+ if (height < 0) {
92
+ height *= -1
93
+ y -= height
94
+ }
95
+ if (width < 0) {
96
+ width *= -1
97
+ x -= width
98
+ }
99
+
100
+ setAttribute(el, "x", x)
101
+ setAttribute(el, "y", y)
102
+ setAttribute(el, "width", width)
103
+ setAttribute(el, "height", height)
92
104
  }
93
105
 
94
106
  // 画弧统一设置方法
95
107
  export let initArc = (
96
- el: SVGElement,
97
- config: SVGConfigType,
98
- cx: number,
99
- cy: number,
100
- r1: number,
101
- r2: number,
102
- beginDeg: number,
103
- deg: number
108
+ el: SVGElement,
109
+ config: SVGConfigType,
110
+ cx: number,
111
+ cy: number,
112
+ r1: number,
113
+ r2: number,
114
+ beginDeg: number,
115
+ deg: number
104
116
  ) => {
105
- if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
106
-
107
- beginDeg = (beginDeg / 180) * Math.PI
108
- deg = (deg / 180) * Math.PI
109
-
110
- beginDeg = beginDeg % (Math.PI * 2)
111
-
112
- if (r1 > r2) {
113
- let temp = r1
114
- r1 = r2
115
- r2 = temp
116
- }
117
-
118
- // 当|deg|>=2π的时候都认为是一个圆环
119
- if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
120
- deg = Math.PI * 1.999999
121
- } else {
122
- deg = deg % (Math.PI * 2)
123
- }
124
-
125
- arc(
126
- beginDeg,
127
- deg,
128
- cx,
129
- cy,
130
- r1,
131
- r2,
132
- function (
133
- beginA: number,
134
- endA: number,
135
- begInnerX: number,
136
- begInnerY: number,
137
- begOuterX: number,
138
- begOuterY: number,
139
- endInnerX: number,
140
- endInnerY: number,
141
- endOuterX: number,
142
- endOuterY: number,
143
- r: number
144
- ) {
145
- let f = endA - beginA > Math.PI ? 1 : 0,
146
- d = "M" + begInnerX + " " + begInnerY
147
- if (r < 0) r = -r
148
-
149
- d +=
150
- // 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
151
- "A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
152
-
153
- // 结尾
154
- if (config.arcEndCap == "round")
155
- d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
156
- else if (config.arcEndCap == "-round")
157
- d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
158
- else d += "L" + endOuterX + " " + endOuterY
159
- d +=
160
- "A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
161
-
162
- // 开头
163
- if (config.arcStartCap == "round")
164
- d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
165
- else if (config.arcStartCap == "-round")
166
- d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
167
- else d += "L" + begInnerX + " " + begInnerY
168
-
169
- if (config.arcStartCap == "butt") d += "Z"
170
-
171
- setAttribute(el, "d", d)
117
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
118
+
119
+ beginDeg = (beginDeg / 180) * Math.PI
120
+ deg = (deg / 180) * Math.PI
121
+
122
+ beginDeg = beginDeg % (Math.PI * 2)
123
+
124
+ if (r1 > r2) {
125
+ let temp = r1
126
+ r1 = r2
127
+ r2 = temp
172
128
  }
173
- )
129
+
130
+ // 当|deg|>=2π的时候都认为是一个圆环
131
+ if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
132
+ deg = Math.PI * 1.999999
133
+ } else {
134
+ deg = deg % (Math.PI * 2)
135
+ }
136
+
137
+ arc(
138
+ beginDeg,
139
+ deg,
140
+ cx,
141
+ cy,
142
+ r1,
143
+ r2,
144
+ function (
145
+ beginA: number,
146
+ endA: number,
147
+ begInnerX: number,
148
+ begInnerY: number,
149
+ begOuterX: number,
150
+ begOuterY: number,
151
+ endInnerX: number,
152
+ endInnerY: number,
153
+ endOuterX: number,
154
+ endOuterY: number,
155
+ r: number
156
+ ) {
157
+ let f = endA - beginA > Math.PI ? 1 : 0,
158
+ d = "M" + begInnerX + " " + begInnerY
159
+ if (r < 0) r = -r
160
+
161
+ d +=
162
+ // 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
163
+ "A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
164
+
165
+ // 结尾
166
+ if (config.arcEndCap == "round")
167
+ d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
168
+ else if (config.arcEndCap == "-round")
169
+ d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
170
+ else d += "L" + endOuterX + " " + endOuterY
171
+ d +=
172
+ "A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
173
+
174
+ // 开头
175
+ if (config.arcStartCap == "round")
176
+ d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
177
+ else if (config.arcStartCap == "-round")
178
+ d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
179
+ else d += "L" + begInnerX + " " + begInnerY
180
+
181
+ if (config.arcStartCap == "butt") d += "Z"
182
+
183
+ setAttribute(el, "d", d)
184
+ }
185
+ )
174
186
  }
@@ -0,0 +1,63 @@
1
+ import { initDefs } from './config'
2
+ import { toNode, setAttribute } from "./tool"
3
+
4
+ // 线性渐变
5
+ export let linearGradient = function (el: SVGElement, x0: number, y0: number, x1: number, y1: number) {
6
+
7
+ let defs = initDefs(el)
8
+ let gradientId = "vislite-lg-" + new Date().valueOf() + "-" + Math.random()
9
+
10
+ let linearGradient = toNode("linearGradient")
11
+ defs.appendChild(linearGradient)
12
+ setAttribute(linearGradient, "id", gradientId)
13
+ setAttribute(linearGradient, "x1", x0 + "%")
14
+ setAttribute(linearGradient, "y1", y0 + "%")
15
+ setAttribute(linearGradient, "x2", x1 + "%")
16
+ setAttribute(linearGradient, "y2", y1 + "%")
17
+
18
+ let enhanceGradient = {
19
+ "value": function () {
20
+ return "url(#" + gradientId + ")";
21
+ },
22
+ "setColor": function (stop: number, color: string) {
23
+
24
+ let stopEl = toNode("stop")
25
+ linearGradient.appendChild(stopEl)
26
+ setAttribute(stopEl, "offset", (stop * 100) + "%")
27
+ setAttribute(stopEl, "style", "stop-color:" + color + ";")
28
+
29
+ return enhanceGradient
30
+ }
31
+ }
32
+ return enhanceGradient
33
+ }
34
+
35
+ // 环形渐变
36
+ export let radialGradient = function (el: SVGElement, cx: number, cy: number, r: number) {
37
+
38
+ let defs = initDefs(el)
39
+ let gradientId = "vislite-rg-" + new Date().valueOf() + "-" + Math.random()
40
+
41
+ let radialGradient = toNode("radialGradient")
42
+ defs.appendChild(radialGradient)
43
+ setAttribute(radialGradient, "id", gradientId)
44
+ setAttribute(radialGradient, "cx", cx + "%")
45
+ setAttribute(radialGradient, "cy", cy + "%")
46
+ setAttribute(radialGradient, "r", r + "%")
47
+
48
+ let enhanceGradient = {
49
+ "value": function () {
50
+ return "url(#" + gradientId + ")";
51
+ },
52
+ "setColor": function (stop: number, color: string) {
53
+
54
+ let stopEl = toNode("stop")
55
+ radialGradient.appendChild(stopEl)
56
+ setAttribute(stopEl, "offset", (stop * 100) + "%")
57
+ setAttribute(stopEl, "style", "stop-color:" + color + ";")
58
+
59
+ return enhanceGradient
60
+ }
61
+ }
62
+ return enhanceGradient
63
+ }
@@ -4,6 +4,7 @@ import type { arcCapType, textAlignType, textBaselineType } from "../../../types
4
4
  import { initText, initCircle, initPath, initRect, initArc } from "./config"
5
5
  import { toNode, setAttribute, getAttribute, full, fill, stroke } from "./tool"
6
6
  import rotate from "../../rotate"
7
+ import { linearGradient, radialGradient } from "./gradient"
7
8
 
8
9
  // 属性名向下兼容
9
10
  let oldAttrName = {
@@ -339,6 +340,17 @@ class SVG {
339
340
  }, false)
340
341
  return this
341
342
  }
343
+
344
+
345
+ // 线性渐变
346
+ createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
347
+ return linearGradient(this.__svg, x0, y0, x1, y1)
348
+ }
349
+
350
+ // 环形渐变
351
+ createRadialGradient(cx: number, cy: number, r: number) {
352
+ return radialGradient(this.__svg, cx, cy, r)
353
+ }
342
354
  }
343
355
 
344
356
  export default SVG
package/src/move.ts ADDED
@@ -0,0 +1,8 @@
1
+ // 点(x,y)沿着向量(ax,ay)方向移动距离d
2
+ export default function (ax: number, ay: number, d: number, x: number, y: number): [number, number] {
3
+ let sqrt = Math.sqrt(ax * ax + ay * ay)
4
+ return [
5
+ ax * d / sqrt + x,
6
+ ay * d / sqrt + y
7
+ ]
8
+ }
package/src/scale.ts ADDED
@@ -0,0 +1,7 @@
1
+ // 点(x,y)围绕中心(cx,cy)缩放times倍
2
+ export default function (cx: number, cy: number, times: number, x: number, y: number): [number, number] {
3
+ return [
4
+ times * (x - cx) + cx,
5
+ times * (y - cy) + cy
6
+ ]
7
+ }
package/types/Canvas.d.ts CHANGED
@@ -274,7 +274,7 @@ export default interface CanvasType {
274
274
  y0: number,
275
275
  x1: number,
276
276
  y1: number
277
- ): GradientType
277
+ ): GradientType<CanvasGradient>
278
278
 
279
279
  /**
280
280
  * 创建环形渐变
@@ -282,7 +282,7 @@ export default interface CanvasType {
282
282
  * @param cy
283
283
  * @param r 半径
284
284
  */
285
- createRadialGradient(cx: number, cy: number, r: number): GradientType
285
+ createRadialGradient(cx: number, cy: number, r: number): GradientType<CanvasGradient>
286
286
 
287
287
  /**
288
288
  * 获取指定位置颜色
@@ -1,4 +1,4 @@
1
- export default interface GradientType {
1
+ export default interface GradientType<T> {
2
2
 
3
3
  /**
4
4
  * 设置程度颜色
@@ -10,6 +10,6 @@ export default interface GradientType {
10
10
  /**
11
11
  * 返回渐变色值
12
12
  */
13
- value(): CanvasGradient
13
+ value(): T
14
14
 
15
15
  }