vislite 0.6.0-alpha.2 → 0.6.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.
- package/.eslintrc.js +3 -1
- package/CHANGELOG +1 -1
- package/README.md +11 -3
- package/lib/Buffer/index.umd.js +2 -2
- package/lib/Buffer/index.umd.min.js +2 -2
- package/lib/Canvas/index.umd.js +2 -2
- package/lib/Canvas/index.umd.min.js +2 -2
- package/lib/Cardinal/index.umd.js +2 -2
- package/lib/Cardinal/index.umd.min.js +2 -2
- package/lib/Eoap/index.umd.js +2 -2
- package/lib/Eoap/index.umd.min.js +2 -2
- package/lib/Geometry/index.umd.js +2 -2
- package/lib/Geometry/index.umd.min.js +2 -2
- package/lib/Hermite/index.umd.js +2 -2
- package/lib/Hermite/index.umd.min.js +2 -2
- package/lib/Matrix4/index.umd.js +2 -2
- package/lib/Matrix4/index.umd.min.js +2 -2
- package/lib/Mercator/index.umd.js +2 -2
- package/lib/Mercator/index.umd.min.js +2 -2
- package/lib/OralCanvas/index.es.js +2 -2
- package/lib/OralCanvas/index.es.min.js +2 -2
- package/lib/OralWebGL/index.es.js +2 -2
- package/lib/OralWebGL/index.es.min.js +2 -2
- package/lib/SVG/index.umd.js +2 -2
- package/lib/SVG/index.umd.min.js +2 -2
- package/lib/Shader/index.umd.js +2 -2
- package/lib/Shader/index.umd.min.js +2 -2
- package/lib/Texture/index.umd.js +2 -2
- package/lib/Texture/index.umd.min.js +2 -2
- package/lib/TreeLayout/index.umd.js +2 -2
- package/lib/TreeLayout/index.umd.min.js +2 -2
- package/lib/WebGL/index.umd.js +2 -2
- package/lib/WebGL/index.umd.min.js +2 -2
- package/lib/animation/index.umd.js +2 -2
- package/lib/animation/index.umd.min.js +2 -2
- package/lib/formatColor/index.umd.js +2 -2
- package/lib/formatColor/index.umd.min.js +2 -2
- package/lib/getLoopColors/index.umd.js +2 -2
- package/lib/getLoopColors/index.umd.min.js +2 -2
- package/lib/getWebGLContext/index.umd.js +2 -2
- package/lib/getWebGLContext/index.umd.min.js +2 -2
- package/lib/index.umd.js +2 -2
- package/lib/index.umd.min.js +2 -2
- package/lib/move/index.umd.js +2 -2
- package/lib/move/index.umd.min.js +2 -2
- package/lib/resizeObserver/index.umd.js +2 -2
- package/lib/resizeObserver/index.umd.min.js +2 -2
- package/lib/rotate/index.umd.js +2 -2
- package/lib/rotate/index.umd.min.js +2 -2
- package/lib/ruler/index.umd.js +2 -2
- package/lib/ruler/index.umd.min.js +2 -2
- package/lib/scale/index.umd.js +2 -2
- package/lib/scale/index.umd.min.js +2 -2
- package/lib/throttle/index.umd.js +2 -2
- package/lib/throttle/index.umd.min.js +2 -2
- package/lib/viewHandler/index.umd.js +2 -2
- package/lib/viewHandler/index.umd.min.js +2 -2
- package/package.json +1 -1
- package/src/Canvas.ts +70 -70
- package/src/Eoap.ts +66 -66
- package/src/Geometry.ts +82 -82
- package/src/Matrix4/move.ts +12 -12
- package/src/Matrix4/rotate.ts +15 -15
- package/src/Matrix4/transform.ts +64 -64
- package/src/Mercator.ts +27 -27
- package/src/SVG.ts +24 -24
- package/src/WebGL.ts +66 -66
- package/src/animation.ts +98 -98
- package/src/common/assemble.ts +22 -22
- package/src/common/canvas/arc.ts +51 -51
- package/src/common/canvas/config.ts +158 -158
- package/src/common/canvas/gradient.ts +29 -29
- package/src/common/canvas/painter.ts +417 -417
- package/src/common/geometry/prism-horizontal.ts +35 -35
- package/src/common/geometry/prism-vertical.ts +40 -40
- package/src/common/geometry/sphere-fragment.ts +40 -40
- package/src/common/geometry/tool/circle.ts +11 -11
- package/src/common/mergeOption.ts +6 -6
- package/src/common/setStyle.ts +5 -5
- package/src/common/svg/config.ts +186 -186
- package/src/common/svg/gradient.ts +63 -63
- package/src/common/svg/index.ts +356 -356
- package/src/common/svg/tool.ts +44 -44
- package/src/common/tree/toInnerTree.ts +57 -57
- package/src/common/tree/toPlainTree.ts +132 -132
- package/src/common/webgl/buffer.ts +79 -79
- package/src/common/webgl/doDraw.ts +108 -108
- package/src/common/webgl/getColorFactory.ts +26 -26
- package/src/common/webgl/getShader.ts +48 -48
- package/src/common/webgl/getTexture.ts +11 -11
- package/src/common/webgl/getWebGLContext.ts +28 -28
- package/src/common/webgl/index.ts +224 -224
- package/src/common/webgl/shader.ts +75 -75
- package/src/common/webgl/texture.ts +97 -97
- package/src/formatColor.ts +44 -44
- package/src/getLoopColors.ts +42 -42
- package/src/interpolation/Cardinal.ts +110 -110
- package/src/interpolation/Hermite.ts +65 -65
- package/src/move.ts +7 -7
- package/src/resizeObserver.ts +37 -37
- package/src/rotate.ts +7 -7
- package/src/throttle.ts +52 -52
- package/src/viewHandler.ts +158 -158
- package/types/CanvasOption.d.ts +8 -8
package/src/Mercator.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type MapType from '../types/Map'
|
|
2
|
-
|
|
3
|
-
/* 墨卡托投影 */
|
|
4
|
-
class Mercator implements MapType {
|
|
5
|
-
readonly name: string = 'Mercator'
|
|
6
|
-
|
|
7
|
-
use: (λ: number, φ: number) => [number, number, number]
|
|
8
|
-
constructor(scale: number = 7, center: number[] = [107, 36]) {
|
|
9
|
-
|
|
10
|
-
const perimeter = 100 * scale * Math.PI // 半周长
|
|
11
|
-
|
|
12
|
-
const help = perimeter / 180
|
|
13
|
-
|
|
14
|
-
const cx = help * center[0] // 中心横坐标
|
|
15
|
-
const cy = -1 * help * center[1] // 中心纵坐标
|
|
16
|
-
|
|
17
|
-
this.use = (λ: number, φ: number) => {
|
|
18
|
-
return [
|
|
19
|
-
(help * λ - cx) * 0.8,
|
|
20
|
-
-1 * help * φ - cy,
|
|
21
|
-
0
|
|
22
|
-
]
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
1
|
+
import type MapType from '../types/Map'
|
|
2
|
+
|
|
3
|
+
/* 墨卡托投影 */
|
|
4
|
+
class Mercator implements MapType {
|
|
5
|
+
readonly name: string = 'Mercator'
|
|
6
|
+
|
|
7
|
+
use: (λ: number, φ: number) => [number, number, number]
|
|
8
|
+
constructor(scale: number = 7, center: number[] = [107, 36]) {
|
|
9
|
+
|
|
10
|
+
const perimeter = 100 * scale * Math.PI // 半周长
|
|
11
|
+
|
|
12
|
+
const help = perimeter / 180
|
|
13
|
+
|
|
14
|
+
const cx = help * center[0] // 中心横坐标
|
|
15
|
+
const cy = -1 * help * center[1] // 中心纵坐标
|
|
16
|
+
|
|
17
|
+
this.use = (λ: number, φ: number) => {
|
|
18
|
+
return [
|
|
19
|
+
(help * λ - cx) * 0.8,
|
|
20
|
+
-1 * help * φ - cy,
|
|
21
|
+
0
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
28
|
export default Mercator
|
package/src/SVG.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import type SVGType from '../types/SVG'
|
|
2
|
-
|
|
3
|
-
import OralSVG from './common/svg/index'
|
|
4
|
-
|
|
5
|
-
class SVG extends OralSVG implements SVGType {
|
|
6
|
-
constructor(el: HTMLElement | null) {
|
|
7
|
-
if (!el) {
|
|
8
|
-
throw new Error("VISLite SVG:The mount point requires an HTMLElement type but encountered null.")
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const width = el.clientWidth, height = el.clientHeight
|
|
12
|
-
|
|
13
|
-
const ViewSVG = document.createElementNS("http://www.w3.org/2000/svg", 'svg')
|
|
14
|
-
el.appendChild(ViewSVG)
|
|
15
|
-
|
|
16
|
-
ViewSVG.setAttribute("width", width + "")
|
|
17
|
-
ViewSVG.setAttribute("height", height + "")
|
|
18
|
-
|
|
19
|
-
ViewSVG.setAttribute("viewBox", "0 0 " + width + " " + height)
|
|
20
|
-
|
|
21
|
-
super(ViewSVG)
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
1
|
+
import type SVGType from '../types/SVG'
|
|
2
|
+
|
|
3
|
+
import OralSVG from './common/svg/index'
|
|
4
|
+
|
|
5
|
+
class SVG extends OralSVG implements SVGType {
|
|
6
|
+
constructor(el: HTMLElement | null) {
|
|
7
|
+
if (!el) {
|
|
8
|
+
throw new Error("VISLite SVG:The mount point requires an HTMLElement type but encountered null.")
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const width = el.clientWidth, height = el.clientHeight
|
|
12
|
+
|
|
13
|
+
const ViewSVG = document.createElementNS("http://www.w3.org/2000/svg", 'svg')
|
|
14
|
+
el.appendChild(ViewSVG)
|
|
15
|
+
|
|
16
|
+
ViewSVG.setAttribute("width", width + "")
|
|
17
|
+
ViewSVG.setAttribute("height", height + "")
|
|
18
|
+
|
|
19
|
+
ViewSVG.setAttribute("viewBox", "0 0 " + width + " " + height)
|
|
20
|
+
|
|
21
|
+
super(ViewSVG)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
25
|
export default SVG
|
package/src/WebGL.ts
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
import type WebGLOptionType from '../types/WebGLOption'
|
|
2
|
-
import type WebGLType from '../types/WebGL'
|
|
3
|
-
|
|
4
|
-
import OralWebGL from './common/webgl/index'
|
|
5
|
-
import mergeOption from './common/mergeOption'
|
|
6
|
-
|
|
7
|
-
class WebGL extends OralWebGL implements WebGLType {
|
|
8
|
-
constructor(el: HTMLElement | null, option: WebGLOptionType = {}) {
|
|
9
|
-
if (!el) {
|
|
10
|
-
throw new Error("VISLite WebGL:The mount point requires an HTMLElement type but encountered null.")
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
option = mergeOption(option, {
|
|
14
|
-
region: true
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
const width = el.clientWidth, height = el.clientHeight
|
|
18
|
-
|
|
19
|
-
let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement
|
|
20
|
-
|
|
21
|
-
const _el = el as any
|
|
22
|
-
|
|
23
|
-
// 如果已经初始化过了
|
|
24
|
-
if (_el._vislite_canvas_) {
|
|
25
|
-
ViewCanvas = _el._vislite_canvas_[0]
|
|
26
|
-
RegionCanvas = _el._vislite_canvas_[1]
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// 否则就初始化
|
|
30
|
-
else {
|
|
31
|
-
|
|
32
|
-
if (option.region) {
|
|
33
|
-
|
|
34
|
-
RegionCanvas = document.createElement('canvas')
|
|
35
|
-
el.appendChild(RegionCanvas)
|
|
36
|
-
|
|
37
|
-
RegionCanvas.style.position = 'absolute'
|
|
38
|
-
RegionCanvas.style.zIndex = "-1"
|
|
39
|
-
RegionCanvas.style.opacity = "0"
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
ViewCanvas = document.createElement('canvas')
|
|
44
|
-
el.appendChild(ViewCanvas)
|
|
45
|
-
|
|
46
|
-
_el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
|
|
47
|
-
|
|
48
|
-
el.setAttribute('vislite', 'WebGL')
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// 设置画布大小
|
|
52
|
-
for (const canvas of [ViewCanvas, RegionCanvas]) {
|
|
53
|
-
|
|
54
|
-
if (canvas) {
|
|
55
|
-
canvas.style.width = width + "px"
|
|
56
|
-
canvas.setAttribute('width', width + "")
|
|
57
|
-
|
|
58
|
-
canvas.style.height = height + "px"
|
|
59
|
-
canvas.setAttribute('height', height + "")
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
super(ViewCanvas, RegionCanvas)
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
1
|
+
import type WebGLOptionType from '../types/WebGLOption'
|
|
2
|
+
import type WebGLType from '../types/WebGL'
|
|
3
|
+
|
|
4
|
+
import OralWebGL from './common/webgl/index'
|
|
5
|
+
import mergeOption from './common/mergeOption'
|
|
6
|
+
|
|
7
|
+
class WebGL extends OralWebGL implements WebGLType {
|
|
8
|
+
constructor(el: HTMLElement | null, option: WebGLOptionType = {}) {
|
|
9
|
+
if (!el) {
|
|
10
|
+
throw new Error("VISLite WebGL:The mount point requires an HTMLElement type but encountered null.")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
option = mergeOption(option, {
|
|
14
|
+
region: true
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
const width = el.clientWidth, height = el.clientHeight
|
|
18
|
+
|
|
19
|
+
let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement
|
|
20
|
+
|
|
21
|
+
const _el = el as any
|
|
22
|
+
|
|
23
|
+
// 如果已经初始化过了
|
|
24
|
+
if (_el._vislite_canvas_) {
|
|
25
|
+
ViewCanvas = _el._vislite_canvas_[0]
|
|
26
|
+
RegionCanvas = _el._vislite_canvas_[1]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 否则就初始化
|
|
30
|
+
else {
|
|
31
|
+
|
|
32
|
+
if (option.region) {
|
|
33
|
+
|
|
34
|
+
RegionCanvas = document.createElement('canvas')
|
|
35
|
+
el.appendChild(RegionCanvas)
|
|
36
|
+
|
|
37
|
+
RegionCanvas.style.position = 'absolute'
|
|
38
|
+
RegionCanvas.style.zIndex = "-1"
|
|
39
|
+
RegionCanvas.style.opacity = "0"
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
ViewCanvas = document.createElement('canvas')
|
|
44
|
+
el.appendChild(ViewCanvas)
|
|
45
|
+
|
|
46
|
+
_el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
|
|
47
|
+
|
|
48
|
+
el.setAttribute('vislite', 'WebGL')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 设置画布大小
|
|
52
|
+
for (const canvas of [ViewCanvas, RegionCanvas]) {
|
|
53
|
+
|
|
54
|
+
if (canvas) {
|
|
55
|
+
canvas.style.width = width + "px"
|
|
56
|
+
canvas.setAttribute('width', width + "")
|
|
57
|
+
|
|
58
|
+
canvas.style.height = height + "px"
|
|
59
|
+
canvas.setAttribute('height', height + "")
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
super(ViewCanvas, RegionCanvas)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
67
|
export default WebGL
|
package/src/animation.ts
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
//当前正在运动的动画的tick函数堆栈
|
|
2
|
-
let $timers: any[] = []
|
|
3
|
-
//唯一定时器的定时间隔
|
|
4
|
-
const $interval = 13
|
|
5
|
-
//定时器ID
|
|
6
|
-
let $timerId: any
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* 动画轮播
|
|
10
|
-
* @param {function} doback 轮询函数,有一个形参deep,0-1,表示执行进度
|
|
11
|
-
* @param {number} duration 动画时长,可选
|
|
12
|
-
* @param {function} callback 动画结束回调,可选,有一个形参deep,0-1,表示执行进度
|
|
13
|
-
*
|
|
14
|
-
* @returns {function} 返回一个函数,调用该函数,可以提前结束动画
|
|
15
|
-
*/
|
|
16
|
-
export default function (doback: (deep: number) => void, duration: number = 400, callback: (deep: number) => void = () => { }): Function {
|
|
17
|
-
|
|
18
|
-
const clock = {
|
|
19
|
-
//把tick函数推入堆栈
|
|
20
|
-
"timer": function (tick: (deep: number) => void, duration: number, callback: (deep: number) => void) {
|
|
21
|
-
if (!tick) {
|
|
22
|
-
throw new Error('Tick is required!')
|
|
23
|
-
}
|
|
24
|
-
const id = new Date().valueOf() + "_" + (Math.random() * 1000).toFixed(0)
|
|
25
|
-
$timers.push({
|
|
26
|
-
"id": id,
|
|
27
|
-
"createTime": new Date(),
|
|
28
|
-
"tick": tick,
|
|
29
|
-
"duration": duration,
|
|
30
|
-
"callback": callback
|
|
31
|
-
});
|
|
32
|
-
clock.start()
|
|
33
|
-
return id
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
//开启唯一的定时器timerId
|
|
37
|
-
"start": function () {
|
|
38
|
-
if (!$timerId) {
|
|
39
|
-
$timerId = setInterval(clock.tick, $interval)
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
//被定时器调用,遍历timers堆栈
|
|
44
|
-
"tick": function () {
|
|
45
|
-
let createTime: Date, flag: number, tick: (deep: number) => void, callback: (deep: number) => void, timer: any, duration: number, passTime: number
|
|
46
|
-
const timers: any[] = $timers
|
|
47
|
-
$timers = []
|
|
48
|
-
$timers.length = 0
|
|
49
|
-
for (flag = 0; flag < timers.length; flag++) {
|
|
50
|
-
//初始化数据
|
|
51
|
-
timer = timers[flag]
|
|
52
|
-
createTime = timer.createTime
|
|
53
|
-
tick = timer.tick
|
|
54
|
-
duration = timer.duration
|
|
55
|
-
callback = timer.callback
|
|
56
|
-
|
|
57
|
-
//执行
|
|
58
|
-
passTime = (+new Date().valueOf() - createTime.valueOf()) / duration
|
|
59
|
-
passTime = passTime > 1 ? 1 : passTime
|
|
60
|
-
tick(passTime)
|
|
61
|
-
if (passTime < 1 && timer.id) {
|
|
62
|
-
//动画没有结束再添加
|
|
63
|
-
$timers.push(timer)
|
|
64
|
-
} else {
|
|
65
|
-
callback(passTime)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if ($timers.length <= 0) {
|
|
69
|
-
clock.stop()
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
//停止定时器,重置timerId=null
|
|
74
|
-
"stop": function () {
|
|
75
|
-
if ($timerId) {
|
|
76
|
-
clearInterval($timerId)
|
|
77
|
-
$timerId = null
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const id = clock.timer(function (deep: number) {
|
|
83
|
-
//其中deep为0-1,表示改变的程度
|
|
84
|
-
doback(deep)
|
|
85
|
-
}, duration, callback)
|
|
86
|
-
|
|
87
|
-
// 返回一个函数
|
|
88
|
-
// 用于在动画结束前结束动画
|
|
89
|
-
return function () {
|
|
90
|
-
let i: string
|
|
91
|
-
for (i in $timers) {
|
|
92
|
-
if ($timers[i].id == id) {
|
|
93
|
-
$timers[i].id = void 0
|
|
94
|
-
return
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
1
|
+
//当前正在运动的动画的tick函数堆栈
|
|
2
|
+
let $timers: any[] = []
|
|
3
|
+
//唯一定时器的定时间隔
|
|
4
|
+
const $interval = 13
|
|
5
|
+
//定时器ID
|
|
6
|
+
let $timerId: any
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 动画轮播
|
|
10
|
+
* @param {function} doback 轮询函数,有一个形参deep,0-1,表示执行进度
|
|
11
|
+
* @param {number} duration 动画时长,可选
|
|
12
|
+
* @param {function} callback 动画结束回调,可选,有一个形参deep,0-1,表示执行进度
|
|
13
|
+
*
|
|
14
|
+
* @returns {function} 返回一个函数,调用该函数,可以提前结束动画
|
|
15
|
+
*/
|
|
16
|
+
export default function (doback: (deep: number) => void, duration: number = 400, callback: (deep: number) => void = () => { }): Function {
|
|
17
|
+
|
|
18
|
+
const clock = {
|
|
19
|
+
//把tick函数推入堆栈
|
|
20
|
+
"timer": function (tick: (deep: number) => void, duration: number, callback: (deep: number) => void) {
|
|
21
|
+
if (!tick) {
|
|
22
|
+
throw new Error('Tick is required!')
|
|
23
|
+
}
|
|
24
|
+
const id = new Date().valueOf() + "_" + (Math.random() * 1000).toFixed(0)
|
|
25
|
+
$timers.push({
|
|
26
|
+
"id": id,
|
|
27
|
+
"createTime": new Date(),
|
|
28
|
+
"tick": tick,
|
|
29
|
+
"duration": duration,
|
|
30
|
+
"callback": callback
|
|
31
|
+
});
|
|
32
|
+
clock.start()
|
|
33
|
+
return id
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
//开启唯一的定时器timerId
|
|
37
|
+
"start": function () {
|
|
38
|
+
if (!$timerId) {
|
|
39
|
+
$timerId = setInterval(clock.tick, $interval)
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
//被定时器调用,遍历timers堆栈
|
|
44
|
+
"tick": function () {
|
|
45
|
+
let createTime: Date, flag: number, tick: (deep: number) => void, callback: (deep: number) => void, timer: any, duration: number, passTime: number
|
|
46
|
+
const timers: any[] = $timers
|
|
47
|
+
$timers = []
|
|
48
|
+
$timers.length = 0
|
|
49
|
+
for (flag = 0; flag < timers.length; flag++) {
|
|
50
|
+
//初始化数据
|
|
51
|
+
timer = timers[flag]
|
|
52
|
+
createTime = timer.createTime
|
|
53
|
+
tick = timer.tick
|
|
54
|
+
duration = timer.duration
|
|
55
|
+
callback = timer.callback
|
|
56
|
+
|
|
57
|
+
//执行
|
|
58
|
+
passTime = (+new Date().valueOf() - createTime.valueOf()) / duration
|
|
59
|
+
passTime = passTime > 1 ? 1 : passTime
|
|
60
|
+
tick(passTime)
|
|
61
|
+
if (passTime < 1 && timer.id) {
|
|
62
|
+
//动画没有结束再添加
|
|
63
|
+
$timers.push(timer)
|
|
64
|
+
} else {
|
|
65
|
+
callback(passTime)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if ($timers.length <= 0) {
|
|
69
|
+
clock.stop()
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
//停止定时器,重置timerId=null
|
|
74
|
+
"stop": function () {
|
|
75
|
+
if ($timerId) {
|
|
76
|
+
clearInterval($timerId)
|
|
77
|
+
$timerId = null
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const id = clock.timer(function (deep: number) {
|
|
83
|
+
//其中deep为0-1,表示改变的程度
|
|
84
|
+
doback(deep)
|
|
85
|
+
}, duration, callback)
|
|
86
|
+
|
|
87
|
+
// 返回一个函数
|
|
88
|
+
// 用于在动画结束前结束动画
|
|
89
|
+
return function () {
|
|
90
|
+
let i: string
|
|
91
|
+
for (i in $timers) {
|
|
92
|
+
if ($timers[i].id == id) {
|
|
93
|
+
$timers[i].id = void 0
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
99
|
}
|
package/src/common/assemble.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
export default function (begin: number, end: number, step: number, count: number) {
|
|
2
|
-
const val = []
|
|
3
|
-
for (let index = 0; index < count; index++) val[index] = begin
|
|
4
|
-
|
|
5
|
-
// 非常类似进制数,每次调用都+1
|
|
6
|
-
return function () {
|
|
7
|
-
for (let i = 0; i < count; i++) {
|
|
8
|
-
|
|
9
|
-
// 如果当前位可以进1
|
|
10
|
-
if (val[i] + step < end) {
|
|
11
|
-
val[i] = +(val[i] + step).toFixed(7)
|
|
12
|
-
break
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// 如果当前位不可以,那当前位归0,尝试下一位
|
|
16
|
-
else if (i < count - 1) {
|
|
17
|
-
val[i] = begin
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return val
|
|
22
|
-
}
|
|
1
|
+
export default function (begin: number, end: number, step: number, count: number) {
|
|
2
|
+
const val = []
|
|
3
|
+
for (let index = 0; index < count; index++) val[index] = begin
|
|
4
|
+
|
|
5
|
+
// 非常类似进制数,每次调用都+1
|
|
6
|
+
return function () {
|
|
7
|
+
for (let i = 0; i < count; i++) {
|
|
8
|
+
|
|
9
|
+
// 如果当前位可以进1
|
|
10
|
+
if (val[i] + step < end) {
|
|
11
|
+
val[i] = +(val[i] + step).toFixed(7)
|
|
12
|
+
break
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// 如果当前位不可以,那当前位归0,尝试下一位
|
|
16
|
+
else if (i < count - 1) {
|
|
17
|
+
val[i] = begin
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return val
|
|
22
|
+
}
|
|
23
23
|
}
|
package/src/common/canvas/arc.ts
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
// 点(x,y)围绕中心(cx,cy)旋转deg度
|
|
3
|
-
|
|
4
|
-
const rotate = function (cx: number, cy: number, deg: number, x: number, y: number) {
|
|
5
|
-
const cos = Math.cos(deg), sin = Math.sin(deg)
|
|
6
|
-
return [
|
|
7
|
-
+((x - cx) * cos - (y - cy) * sin + cx).toFixed(7),
|
|
8
|
-
+((x - cx) * sin + (y - cy) * cos + cy).toFixed(7)
|
|
9
|
-
]
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// r1和r2,内半径和外半径
|
|
13
|
-
// beginA起点弧度,rotateA旋转弧度式
|
|
14
|
-
|
|
15
|
-
export default function (beginA: number, rotateA: number, cx: number, cy: number, r1: number, r2: number, doback: Function) {
|
|
16
|
-
|
|
17
|
-
// 保证逆时针也是可以的
|
|
18
|
-
if (rotateA < 0) {
|
|
19
|
-
beginA += rotateA
|
|
20
|
-
rotateA *= -1
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const temp: number[] = []
|
|
24
|
-
let p: number[]
|
|
25
|
-
|
|
26
|
-
// 内部
|
|
27
|
-
p = rotate(0, 0, beginA, r1, 0)
|
|
28
|
-
temp[0] = p[0]
|
|
29
|
-
temp[1] = p[1]
|
|
30
|
-
p = rotate(0, 0, rotateA, p[0], p[1])
|
|
31
|
-
temp[2] = p[0]
|
|
32
|
-
temp[3] = p[1]
|
|
33
|
-
|
|
34
|
-
// 外部
|
|
35
|
-
p = rotate(0, 0, beginA, r2, 0)
|
|
36
|
-
temp[4] = p[0]
|
|
37
|
-
temp[5] = p[1]
|
|
38
|
-
p = rotate(0, 0, rotateA, p[0], p[1])
|
|
39
|
-
temp[6] = p[0]
|
|
40
|
-
temp[7] = p[1]
|
|
41
|
-
|
|
42
|
-
doback(
|
|
43
|
-
beginA, beginA + rotateA,
|
|
44
|
-
temp[0] + cx, temp[1] + cy,
|
|
45
|
-
temp[4] + cx, temp[5] + cy,
|
|
46
|
-
temp[2] + cx, temp[3] + cy,
|
|
47
|
-
temp[6] + cx, temp[7] + cy,
|
|
48
|
-
(r2 - r1) * 0.5
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
}
|
|
1
|
+
|
|
2
|
+
// 点(x,y)围绕中心(cx,cy)旋转deg度
|
|
3
|
+
|
|
4
|
+
const rotate = function (cx: number, cy: number, deg: number, x: number, y: number) {
|
|
5
|
+
const cos = Math.cos(deg), sin = Math.sin(deg)
|
|
6
|
+
return [
|
|
7
|
+
+((x - cx) * cos - (y - cy) * sin + cx).toFixed(7),
|
|
8
|
+
+((x - cx) * sin + (y - cy) * cos + cy).toFixed(7)
|
|
9
|
+
]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// r1和r2,内半径和外半径
|
|
13
|
+
// beginA起点弧度,rotateA旋转弧度式
|
|
14
|
+
|
|
15
|
+
export default function (beginA: number, rotateA: number, cx: number, cy: number, r1: number, r2: number, doback: Function) {
|
|
16
|
+
|
|
17
|
+
// 保证逆时针也是可以的
|
|
18
|
+
if (rotateA < 0) {
|
|
19
|
+
beginA += rotateA
|
|
20
|
+
rotateA *= -1
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const temp: number[] = []
|
|
24
|
+
let p: number[]
|
|
25
|
+
|
|
26
|
+
// 内部
|
|
27
|
+
p = rotate(0, 0, beginA, r1, 0)
|
|
28
|
+
temp[0] = p[0]
|
|
29
|
+
temp[1] = p[1]
|
|
30
|
+
p = rotate(0, 0, rotateA, p[0], p[1])
|
|
31
|
+
temp[2] = p[0]
|
|
32
|
+
temp[3] = p[1]
|
|
33
|
+
|
|
34
|
+
// 外部
|
|
35
|
+
p = rotate(0, 0, beginA, r2, 0)
|
|
36
|
+
temp[4] = p[0]
|
|
37
|
+
temp[5] = p[1]
|
|
38
|
+
p = rotate(0, 0, rotateA, p[0], p[1])
|
|
39
|
+
temp[6] = p[0]
|
|
40
|
+
temp[7] = p[1]
|
|
41
|
+
|
|
42
|
+
doback(
|
|
43
|
+
beginA, beginA + rotateA,
|
|
44
|
+
temp[0] + cx, temp[1] + cy,
|
|
45
|
+
temp[4] + cx, temp[5] + cy,
|
|
46
|
+
temp[2] + cx, temp[3] + cy,
|
|
47
|
+
temp[6] + cx, temp[7] + cy,
|
|
48
|
+
(r2 - r1) * 0.5
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
}
|