vislite 0.7.1 → 0.8.0-alpha.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/CHANGELOG +28 -2
- package/README.md +144 -135
- package/lib/Buffer/index.umd.d.ts +3 -0
- package/lib/Buffer/index.umd.js +2 -2
- package/lib/Buffer/index.umd.min.d.ts +3 -0
- package/lib/Buffer/index.umd.min.js +2 -2
- package/lib/Canvas/index.umd.d.ts +3 -0
- package/lib/Canvas/index.umd.js +26 -2
- package/lib/Canvas/index.umd.min.d.ts +3 -0
- package/lib/Canvas/index.umd.min.js +3 -3
- package/lib/Cardinal/index.umd.d.ts +3 -0
- package/lib/Cardinal/index.umd.js +2 -2
- package/lib/Cardinal/index.umd.min.d.ts +3 -0
- package/lib/Cardinal/index.umd.min.js +2 -2
- package/lib/Eoap/index.umd.d.ts +3 -0
- package/lib/Eoap/index.umd.js +2 -2
- package/lib/Eoap/index.umd.min.d.ts +3 -0
- package/lib/Eoap/index.umd.min.js +2 -2
- package/lib/Geometry/index.umd.d.ts +3 -0
- package/lib/Geometry/index.umd.js +61 -11
- package/lib/Geometry/index.umd.min.d.ts +3 -0
- package/lib/Geometry/index.umd.min.js +3 -3
- package/lib/Hermite/index.umd.d.ts +3 -0
- package/lib/Hermite/index.umd.js +2 -2
- package/lib/Hermite/index.umd.min.d.ts +3 -0
- package/lib/Hermite/index.umd.min.js +2 -2
- package/lib/Matrix4/index.umd.d.ts +3 -0
- package/lib/Matrix4/index.umd.js +2 -2
- package/lib/Matrix4/index.umd.min.d.ts +3 -0
- package/lib/Matrix4/index.umd.min.js +2 -2
- package/lib/Mercator/index.umd.d.ts +3 -0
- package/lib/Mercator/index.umd.js +2 -2
- package/lib/Mercator/index.umd.min.d.ts +3 -0
- package/lib/Mercator/index.umd.min.js +2 -2
- package/lib/OralCanvas/index.es.d.ts +3 -0
- package/lib/OralCanvas/index.es.js +26 -2
- package/lib/OralCanvas/index.es.min.d.ts +3 -0
- package/lib/OralCanvas/index.es.min.js +3 -3
- package/lib/OralWebGL/index.es.d.ts +3 -0
- package/lib/OralWebGL/index.es.js +26 -8
- package/lib/OralWebGL/index.es.min.d.ts +3 -0
- package/lib/OralWebGL/index.es.min.js +3 -3
- package/lib/SVG/index.umd.d.ts +3 -0
- package/lib/SVG/index.umd.js +2 -2
- package/lib/SVG/index.umd.min.d.ts +3 -0
- package/lib/SVG/index.umd.min.js +2 -2
- package/lib/Shader/index.umd.d.ts +3 -0
- package/lib/Shader/index.umd.js +2 -2
- package/lib/Shader/index.umd.min.d.ts +3 -0
- package/lib/Shader/index.umd.min.js +2 -2
- package/lib/Texture/index.umd.d.ts +3 -0
- package/lib/Texture/index.umd.js +2 -2
- package/lib/Texture/index.umd.min.d.ts +3 -0
- package/lib/Texture/index.umd.min.js +2 -2
- package/lib/TreeLayout/index.umd.d.ts +3 -0
- package/lib/TreeLayout/index.umd.js +2 -2
- package/lib/TreeLayout/index.umd.min.d.ts +3 -0
- package/lib/TreeLayout/index.umd.min.js +2 -2
- package/lib/WebGL/index.umd.d.ts +3 -0
- package/lib/WebGL/index.umd.js +27 -9
- package/lib/WebGL/index.umd.min.d.ts +3 -0
- package/lib/WebGL/index.umd.min.js +3 -3
- package/lib/animation/index.umd.d.ts +3 -0
- package/lib/animation/index.umd.js +2 -2
- package/lib/animation/index.umd.min.d.ts +3 -0
- package/lib/animation/index.umd.min.js +2 -2
- package/lib/formatColor/index.umd.d.ts +3 -0
- package/lib/formatColor/index.umd.js +2 -2
- package/lib/formatColor/index.umd.min.d.ts +3 -0
- package/lib/formatColor/index.umd.min.js +2 -2
- package/lib/getLoopColors/index.umd.d.ts +3 -0
- package/lib/getLoopColors/index.umd.js +2 -2
- package/lib/getLoopColors/index.umd.min.d.ts +3 -0
- package/lib/getLoopColors/index.umd.min.js +2 -2
- package/lib/getWebGLContext/index.umd.d.ts +3 -0
- package/lib/getWebGLContext/index.umd.js +25 -7
- package/lib/getWebGLContext/index.umd.min.d.ts +3 -0
- package/lib/getWebGLContext/index.umd.min.js +3 -3
- package/lib/index.umd.js +112 -20
- package/lib/index.umd.min.js +3 -3
- package/lib/move/index.umd.d.ts +3 -0
- package/lib/move/index.umd.js +2 -2
- package/lib/move/index.umd.min.d.ts +3 -0
- package/lib/move/index.umd.min.js +2 -2
- package/lib/resizeObserver/index.umd.d.ts +3 -0
- package/lib/resizeObserver/index.umd.js +2 -2
- package/lib/resizeObserver/index.umd.min.d.ts +3 -0
- package/lib/resizeObserver/index.umd.min.js +2 -2
- package/lib/rotate/index.umd.d.ts +3 -0
- package/lib/rotate/index.umd.js +2 -2
- package/lib/rotate/index.umd.min.d.ts +3 -0
- package/lib/rotate/index.umd.min.js +2 -2
- package/lib/ruler/index.umd.d.ts +3 -0
- package/lib/ruler/index.umd.js +2 -2
- package/lib/ruler/index.umd.min.d.ts +3 -0
- package/lib/ruler/index.umd.min.js +2 -2
- package/lib/scale/index.umd.d.ts +3 -0
- package/lib/scale/index.umd.js +2 -2
- package/lib/scale/index.umd.min.d.ts +3 -0
- package/lib/scale/index.umd.min.js +2 -2
- package/lib/throttle/index.umd.d.ts +3 -0
- package/lib/throttle/index.umd.js +2 -2
- package/lib/throttle/index.umd.min.d.ts +3 -0
- package/lib/throttle/index.umd.min.js +2 -2
- package/lib/viewHandler/index.umd.d.ts +3 -0
- package/lib/viewHandler/index.umd.js +2 -2
- package/lib/viewHandler/index.umd.min.d.ts +3 -0
- package/lib/viewHandler/index.umd.min.js +2 -2
- package/package/getWebGLContext/index.ts +40 -39
- package/package.json +1 -1
- package/src/Canvas.ts +2 -2
- package/src/Geometry.ts +65 -1
- package/src/WebGL.ts +66 -66
- package/src/common/canvas/painter.ts +26 -0
- package/src/common/geometry/prism-horizontal.ts +50 -35
- package/src/common/geometry/prism-vertical.ts +55 -40
- package/src/common/geometry/tool/circle.ts +17 -11
- package/src/common/geometry/tool/rotateLine.ts +48 -35
- package/src/common/webgl/getWebGLContext.ts +45 -28
- package/src/common/webgl/index.ts +227 -226
- package/src/common/webgl/shader.ts +75 -75
- package/types/Canvas.d.ts +318 -308
- package/types/Geometry.d.ts +132 -65
- package/types/Object3D.d.ts +114 -114
- package/types/Shader.d.ts +23 -23
- package/types/WebGLOption.d.ts +14 -7
- package/types/getWebGLContext.d.ts +4 -2
- package/uni-app/drawImage.js +18 -0
- package/uni-app/ui-canvas.vue +10 -1
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
import getWebGLContext from "../../src/common/webgl/getWebGLContext"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
ViewCanvas.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
ViewCanvas.
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
import getWebGLContext from "../../src/common/webgl/getWebGLContext"
|
|
2
|
+
import type { WebGLmodeType } from "../../types/getWebGLContext"
|
|
3
|
+
|
|
4
|
+
export default (el: HTMLElement | null, scale: number = 1, mode?: WebGLmodeType) => {
|
|
5
|
+
if (!el) {
|
|
6
|
+
throw new Error("VISLite getWebGLContext:The mount point requires an HTMLElement type but encountered null.")
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let width = el.clientWidth, height = el.clientHeight
|
|
10
|
+
|
|
11
|
+
let ViewCanvas: HTMLCanvasElement
|
|
12
|
+
|
|
13
|
+
let _el = el as any
|
|
14
|
+
|
|
15
|
+
// 如果已经初始化过了
|
|
16
|
+
if (_el._vislite_canvas_) {
|
|
17
|
+
ViewCanvas = _el._vislite_canvas_
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 否则就初始化
|
|
21
|
+
else {
|
|
22
|
+
|
|
23
|
+
ViewCanvas = document.createElement('canvas')
|
|
24
|
+
el.appendChild(ViewCanvas)
|
|
25
|
+
|
|
26
|
+
_el._vislite_canvas_ = ViewCanvas
|
|
27
|
+
|
|
28
|
+
el.setAttribute('vislite', 'WebGL')
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 设置画布大小
|
|
33
|
+
|
|
34
|
+
ViewCanvas.style.width = width + "px"
|
|
35
|
+
ViewCanvas.setAttribute('width', width + "")
|
|
36
|
+
|
|
37
|
+
ViewCanvas.style.height = height + "px"
|
|
38
|
+
ViewCanvas.setAttribute('height', height + "")
|
|
39
|
+
|
|
40
|
+
return getWebGLContext(ViewCanvas, scale, {}, mode)
|
|
40
41
|
}
|
package/package.json
CHANGED
package/src/Canvas.ts
CHANGED
|
@@ -43,9 +43,9 @@ class Canvas extends OralCanvas implements CanvasType {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
// 设置画布大小
|
|
46
|
-
|
|
46
|
+
let canvasArray = [RegionCanvas, ViewCanvas]
|
|
47
47
|
for (let index = 0; index < canvasArray.length; index++) {
|
|
48
|
-
|
|
48
|
+
let canvas = canvasArray[index]
|
|
49
49
|
if (canvas) {
|
|
50
50
|
canvas.style.width = width + "px"
|
|
51
51
|
canvas.setAttribute('width', (index * width + width) + "")
|
package/src/Geometry.ts
CHANGED
|
@@ -30,6 +30,70 @@ class Geometry implements GeometryType {
|
|
|
30
30
|
return this
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* 【1】辅助方法
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
// 计算切割份数
|
|
38
|
+
splitNum(radius: number, deg?: number) {
|
|
39
|
+
return splitNum(this.__option.precision as number, radius, deg)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 物体方向转换
|
|
43
|
+
rotateLine(x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) {
|
|
44
|
+
let rotateLine = rotateLineFactory(x1, y1, z1, x2, y2, z2)
|
|
45
|
+
return (x: number, y: number, z: number) => rotateLine(x, y, z, this.__option.normal as boolean)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 【2】立方片段
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
// 棱柱水平部分
|
|
53
|
+
prismHorizontal(x: number, y: number, z: number, radius: number, num: number, d: number, beginDeg?: number, deg?: number) {
|
|
54
|
+
return prismHorizontal(this.__option.normal as boolean, x, y, z, radius, num, d, beginDeg, deg)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 棱柱垂直部分
|
|
58
|
+
prismVertical(x: number, y: number, z: number, radius: number, height: number, num: number, beginDeg?: number, deg?: number) {
|
|
59
|
+
return prismVertical(this.__option.normal as boolean, x, y, z, radius, height, num, beginDeg, deg)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 球体中的一瓣子
|
|
63
|
+
sphereFragment(cx: number, cy: number, cz: number, radius: number, num: number, index: number) {
|
|
64
|
+
return sphereFragment(this.__option.normal as boolean, cx, cy, cz, radius, num, index)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 【3】立方体
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
// 饼柱体
|
|
72
|
+
pie(x: number, y: number, z: number, radius: number, height: number, beginDeg: number, deg: number): Array<GeometryResultType> {
|
|
73
|
+
|
|
74
|
+
// 求解出需要切割多少份比较合理
|
|
75
|
+
const num = splitNum(this.__option.precision as number, radius, deg)
|
|
76
|
+
|
|
77
|
+
const result = [{
|
|
78
|
+
name: "bottom",
|
|
79
|
+
points: prismHorizontal(this.__option.normal as boolean, x, y, z, radius, num as number, height > 0 ? -1 : 1, beginDeg, deg),
|
|
80
|
+
length: 3 * num,
|
|
81
|
+
method: "TRIANGLES" as const
|
|
82
|
+
}, {
|
|
83
|
+
name: "top",
|
|
84
|
+
points: prismHorizontal(this.__option.normal as boolean, x, y + height, z, radius, num as number, height > 0 ? 1 : -1, beginDeg, deg),
|
|
85
|
+
length: 3 * num,
|
|
86
|
+
method: "TRIANGLES" as const
|
|
87
|
+
}, {
|
|
88
|
+
name: "side",
|
|
89
|
+
points: prismVertical(this.__option.normal as boolean, x, y, z, radius, height, num as number, beginDeg, deg),
|
|
90
|
+
length: 6 * num,
|
|
91
|
+
method: "TRIANGLES" as const
|
|
92
|
+
}]
|
|
93
|
+
|
|
94
|
+
return result
|
|
95
|
+
}
|
|
96
|
+
|
|
33
97
|
// 圆柱体
|
|
34
98
|
cylinder(x: number, y: number, z: number, radius: number, x2: number, y2?: number, z2?: number): Array<GeometryResultType> {
|
|
35
99
|
|
|
@@ -52,7 +116,7 @@ class Geometry implements GeometryType {
|
|
|
52
116
|
height = x2
|
|
53
117
|
num = y2
|
|
54
118
|
} else {
|
|
55
|
-
height = Math.sqrt((x2 - x) * (x2 - x) + (y2 - y) * (y2 - y) + (z2 as number - z) * (z2 as number - z))
|
|
119
|
+
height = (y > y2 ? -1 : 1) * Math.sqrt((x2 - x) * (x2 - x) + (y2 - y) * (y2 - y) + (z2 as number - z) * (z2 as number - z))
|
|
56
120
|
rotateLine = rotateLineFactory(x, y, z, x2, y2, z2 as number)
|
|
57
121
|
}
|
|
58
122
|
|
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 | null = null
|
|
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 | null = null
|
|
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, option.mode)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
67
|
export default WebGL
|
|
@@ -414,7 +414,33 @@ class Painter {
|
|
|
414
414
|
return this
|
|
415
415
|
}
|
|
416
416
|
|
|
417
|
+
// 渲染绘制(uniapp独有)
|
|
417
418
|
draw() { }
|
|
419
|
+
|
|
420
|
+
// 绘制图片
|
|
421
|
+
drawImage(img: CanvasImageSource | string, x: number, y: number, w: number, h: number, isUniapp: boolean = false) {
|
|
422
|
+
return new Promise((resolve) => {
|
|
423
|
+
if (this.__region) {
|
|
424
|
+
this.__region.fillRect(x, y, w, h)
|
|
425
|
+
resolve({})
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (this.__isPainter && this.__onlyRegion) return this
|
|
429
|
+
|
|
430
|
+
if (typeof img == 'string' && !isUniapp) {
|
|
431
|
+
let imgInstance = new Image()
|
|
432
|
+
imgInstance.onload = () => {
|
|
433
|
+
this.painter.drawImage(imgInstance, x, y, w, h)
|
|
434
|
+
resolve({})
|
|
435
|
+
}
|
|
436
|
+
imgInstance.src = img
|
|
437
|
+
} else {
|
|
438
|
+
this.painter.drawImage(img as CanvasImageSource, x, y, w, h)
|
|
439
|
+
resolve({})
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
})
|
|
443
|
+
}
|
|
418
444
|
}
|
|
419
445
|
|
|
420
446
|
export default Painter
|
|
@@ -1,35 +1,50 @@
|
|
|
1
|
-
import rotate from '../../rotate'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
let
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import rotate from '../../rotate'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 棱柱水平部分
|
|
5
|
+
* @param normal 是否需要法向量
|
|
6
|
+
* @param x 中心
|
|
7
|
+
* @param y
|
|
8
|
+
* @param z
|
|
9
|
+
* @param radius 半径
|
|
10
|
+
* @param num 份数
|
|
11
|
+
* @param d 方向(用于 表示是底还是顶,方便计算法向量)
|
|
12
|
+
* @param beginDeg 开始弧度,默认0
|
|
13
|
+
* @param deg 跨越弧度,默认2pi
|
|
14
|
+
* @returns 点数组
|
|
15
|
+
*/
|
|
16
|
+
export default function (normal: boolean, x: number, y: number, z: number, radius: number, num: number, d: number, beginDeg: number = 0, deg: number = Math.PI * 2) {
|
|
17
|
+
|
|
18
|
+
let beginX: number, beginZ: number
|
|
19
|
+
if (num == 4) {
|
|
20
|
+
const temp = radius / 1.414
|
|
21
|
+
beginX = x + temp
|
|
22
|
+
beginZ = z + temp
|
|
23
|
+
|
|
24
|
+
} else {
|
|
25
|
+
beginX = x + radius
|
|
26
|
+
beginZ = z
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let point = [beginX, beginZ]
|
|
30
|
+
if (beginDeg != 0) {
|
|
31
|
+
point = rotate(x, z, beginDeg, beginX, beginZ)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const points = []
|
|
35
|
+
const perDeg = deg / num
|
|
36
|
+
for (let i = 0; i < num; i++) {
|
|
37
|
+
|
|
38
|
+
points.push(x, y, z)
|
|
39
|
+
if (normal) points.push(0, d, 0)
|
|
40
|
+
|
|
41
|
+
points.push(point[0], y, point[1])
|
|
42
|
+
if (normal) points.push(0, d, 0)
|
|
43
|
+
|
|
44
|
+
point = rotate(x, z, perDeg * (i + 1), beginX, beginZ)
|
|
45
|
+
points.push(point[0], y, point[1])
|
|
46
|
+
if (normal) points.push(0, d, 0)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return points
|
|
50
|
+
}
|
|
@@ -1,40 +1,55 @@
|
|
|
1
|
-
import rotate from '../../rotate'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
1
|
+
import rotate from '../../rotate'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 棱柱垂直部分
|
|
5
|
+
* @param normal 是否需要法向量
|
|
6
|
+
* @param x 中心
|
|
7
|
+
* @param y
|
|
8
|
+
* @param z
|
|
9
|
+
* @param radius 半径
|
|
10
|
+
* @param height 高
|
|
11
|
+
* @param num 份数
|
|
12
|
+
* @param beginDeg 开始弧度,默认0
|
|
13
|
+
* @param deg 跨越弧度,默认2pi
|
|
14
|
+
* @returns 点数组
|
|
15
|
+
*/
|
|
16
|
+
export default function (normal: boolean, x: number, y: number, z: number, radius: number, height: number, num: number, beginDeg: number = 0, deg: number = Math.PI * 2) {
|
|
17
|
+
const points = []
|
|
18
|
+
let beginPosition: [number, number]
|
|
19
|
+
|
|
20
|
+
if (num == 4) {
|
|
21
|
+
beginPosition = rotate(x, z, Math.PI * 0.25, x - radius, z)
|
|
22
|
+
} else {
|
|
23
|
+
beginPosition = [x + radius, z]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (beginDeg != 0) {
|
|
27
|
+
beginPosition = rotate(x, z, beginDeg, ...beginPosition)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const perDeg = deg / num, degHalf = deg / (num * 2)
|
|
31
|
+
|
|
32
|
+
let endPosition: [number, number], normalPosition: [number, number, number] | [] = []
|
|
33
|
+
for (let i = 0; i < num; i++) {
|
|
34
|
+
|
|
35
|
+
endPosition = rotate(x, z, perDeg, ...beginPosition)
|
|
36
|
+
|
|
37
|
+
if (normal) {
|
|
38
|
+
const halfPosition = rotate(x, z, degHalf, ...beginPosition)
|
|
39
|
+
normalPosition = [halfPosition[0], 0, halfPosition[1]]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
|
|
43
|
+
points.push(beginPosition[0], y + height, beginPosition[1], ...normalPosition)
|
|
44
|
+
points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
|
|
45
|
+
|
|
46
|
+
points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
|
|
47
|
+
points.push(endPosition[0], y, endPosition[1], ...normalPosition)
|
|
48
|
+
points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
beginPosition = endPosition
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return points
|
|
55
|
+
}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 计算切割份数
|
|
3
|
+
* @param precision 精度
|
|
4
|
+
* @param radius 半径
|
|
5
|
+
* @param deg 需要跨越的弧度,默认圆(2pi)
|
|
6
|
+
* @returns 切割份数
|
|
7
|
+
*/
|
|
8
|
+
export const splitNum = function (precision: number, radius: number, deg: number = Math.PI * 2) {
|
|
9
|
+
|
|
10
|
+
// 根据切割弧度得出切割块数目
|
|
11
|
+
const num = Math.ceil(deg /
|
|
12
|
+
|
|
13
|
+
// 为了满足最小精度而得出的切割弧度
|
|
14
|
+
Math.asin(precision / radius) * 2)
|
|
15
|
+
|
|
16
|
+
return (isNaN(num) || num < 12) ? 12 : num
|
|
17
|
+
|
|
12
18
|
}
|
|
@@ -1,36 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 物体方向转换
|
|
3
|
+
* 由(x,y,z)转换成(x2-x,y2-y,z2-z)
|
|
4
|
+
* @param x
|
|
5
|
+
* @param y
|
|
6
|
+
* @param z
|
|
7
|
+
* @param x2
|
|
8
|
+
* @param y2
|
|
9
|
+
* @param z2
|
|
10
|
+
* @returns 点转换函数
|
|
11
|
+
*/
|
|
12
|
+
export default function (x: number, y: number, z: number, x2: number, y2: number, z2: number) {
|
|
13
|
+
return (x0: number, y0: number, z0: number, isNormal: boolean) => {
|
|
14
|
+
if (x == x2 && z == z2) return [x0, y0, z0]
|
|
15
|
+
|
|
16
|
+
let sin: number, cos: number, temp: Array<number>
|
|
17
|
+
|
|
18
|
+
// 第一步:归零化
|
|
19
|
+
let _x0 = x0 - (isNormal ? 0 : x), _y0 = y0 - (isNormal ? 0 : y), _z0 = z0 - (isNormal ? 0 : z) // 法向量起点本来就是原点
|
|
20
|
+
const _x2 = x2 - x, _y2 = y2 - y, _z2 = z2 - z
|
|
21
|
+
|
|
22
|
+
// 第二步:围绕OZ轴旋转
|
|
23
|
+
|
|
24
|
+
const __d = Math.sqrt(_x2 * _x2 + _z2 * _z2)
|
|
25
|
+
cos = _x2 / __d
|
|
26
|
+
sin = _z2 / __d
|
|
27
|
+
|
|
28
|
+
const _x2N = _z2 * sin + _x2 * cos
|
|
29
|
+
|
|
30
|
+
const d = Math.sqrt(_y2 * _y2 + _x2N * _x2N)
|
|
31
|
+
cos = _y2 / d
|
|
32
|
+
sin = _x2N / d
|
|
33
|
+
|
|
34
|
+
temp = [_y0, _x0]
|
|
35
|
+
_y0 = temp[0] * cos - temp[1] * sin
|
|
36
|
+
_x0 = temp[0] * sin + temp[1] * cos
|
|
37
|
+
|
|
38
|
+
// 第三步:围绕0Y轴旋转
|
|
39
|
+
cos = _x2 / __d
|
|
40
|
+
sin = _z2 / __d
|
|
41
|
+
|
|
42
|
+
temp = [_x0, _z0]
|
|
43
|
+
_x0 = temp[0] * cos - temp[1] * sin
|
|
44
|
+
_z0 = temp[0] * sin + temp[1] * cos
|
|
45
|
+
|
|
46
|
+
// 第四步:去零化(直接返回)
|
|
47
|
+
return [_x0 + (isNormal ? 0 : x), _y0 + (isNormal ? 0 : y), _z0 + (isNormal ? 0 : z)]
|
|
48
|
+
}
|
|
36
49
|
}
|