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.
Files changed (129) hide show
  1. package/CHANGELOG +28 -2
  2. package/README.md +144 -135
  3. package/lib/Buffer/index.umd.d.ts +3 -0
  4. package/lib/Buffer/index.umd.js +2 -2
  5. package/lib/Buffer/index.umd.min.d.ts +3 -0
  6. package/lib/Buffer/index.umd.min.js +2 -2
  7. package/lib/Canvas/index.umd.d.ts +3 -0
  8. package/lib/Canvas/index.umd.js +26 -2
  9. package/lib/Canvas/index.umd.min.d.ts +3 -0
  10. package/lib/Canvas/index.umd.min.js +3 -3
  11. package/lib/Cardinal/index.umd.d.ts +3 -0
  12. package/lib/Cardinal/index.umd.js +2 -2
  13. package/lib/Cardinal/index.umd.min.d.ts +3 -0
  14. package/lib/Cardinal/index.umd.min.js +2 -2
  15. package/lib/Eoap/index.umd.d.ts +3 -0
  16. package/lib/Eoap/index.umd.js +2 -2
  17. package/lib/Eoap/index.umd.min.d.ts +3 -0
  18. package/lib/Eoap/index.umd.min.js +2 -2
  19. package/lib/Geometry/index.umd.d.ts +3 -0
  20. package/lib/Geometry/index.umd.js +61 -11
  21. package/lib/Geometry/index.umd.min.d.ts +3 -0
  22. package/lib/Geometry/index.umd.min.js +3 -3
  23. package/lib/Hermite/index.umd.d.ts +3 -0
  24. package/lib/Hermite/index.umd.js +2 -2
  25. package/lib/Hermite/index.umd.min.d.ts +3 -0
  26. package/lib/Hermite/index.umd.min.js +2 -2
  27. package/lib/Matrix4/index.umd.d.ts +3 -0
  28. package/lib/Matrix4/index.umd.js +2 -2
  29. package/lib/Matrix4/index.umd.min.d.ts +3 -0
  30. package/lib/Matrix4/index.umd.min.js +2 -2
  31. package/lib/Mercator/index.umd.d.ts +3 -0
  32. package/lib/Mercator/index.umd.js +2 -2
  33. package/lib/Mercator/index.umd.min.d.ts +3 -0
  34. package/lib/Mercator/index.umd.min.js +2 -2
  35. package/lib/OralCanvas/index.es.d.ts +3 -0
  36. package/lib/OralCanvas/index.es.js +26 -2
  37. package/lib/OralCanvas/index.es.min.d.ts +3 -0
  38. package/lib/OralCanvas/index.es.min.js +3 -3
  39. package/lib/OralWebGL/index.es.d.ts +3 -0
  40. package/lib/OralWebGL/index.es.js +26 -8
  41. package/lib/OralWebGL/index.es.min.d.ts +3 -0
  42. package/lib/OralWebGL/index.es.min.js +3 -3
  43. package/lib/SVG/index.umd.d.ts +3 -0
  44. package/lib/SVG/index.umd.js +2 -2
  45. package/lib/SVG/index.umd.min.d.ts +3 -0
  46. package/lib/SVG/index.umd.min.js +2 -2
  47. package/lib/Shader/index.umd.d.ts +3 -0
  48. package/lib/Shader/index.umd.js +2 -2
  49. package/lib/Shader/index.umd.min.d.ts +3 -0
  50. package/lib/Shader/index.umd.min.js +2 -2
  51. package/lib/Texture/index.umd.d.ts +3 -0
  52. package/lib/Texture/index.umd.js +2 -2
  53. package/lib/Texture/index.umd.min.d.ts +3 -0
  54. package/lib/Texture/index.umd.min.js +2 -2
  55. package/lib/TreeLayout/index.umd.d.ts +3 -0
  56. package/lib/TreeLayout/index.umd.js +2 -2
  57. package/lib/TreeLayout/index.umd.min.d.ts +3 -0
  58. package/lib/TreeLayout/index.umd.min.js +2 -2
  59. package/lib/WebGL/index.umd.d.ts +3 -0
  60. package/lib/WebGL/index.umd.js +27 -9
  61. package/lib/WebGL/index.umd.min.d.ts +3 -0
  62. package/lib/WebGL/index.umd.min.js +3 -3
  63. package/lib/animation/index.umd.d.ts +3 -0
  64. package/lib/animation/index.umd.js +2 -2
  65. package/lib/animation/index.umd.min.d.ts +3 -0
  66. package/lib/animation/index.umd.min.js +2 -2
  67. package/lib/formatColor/index.umd.d.ts +3 -0
  68. package/lib/formatColor/index.umd.js +2 -2
  69. package/lib/formatColor/index.umd.min.d.ts +3 -0
  70. package/lib/formatColor/index.umd.min.js +2 -2
  71. package/lib/getLoopColors/index.umd.d.ts +3 -0
  72. package/lib/getLoopColors/index.umd.js +2 -2
  73. package/lib/getLoopColors/index.umd.min.d.ts +3 -0
  74. package/lib/getLoopColors/index.umd.min.js +2 -2
  75. package/lib/getWebGLContext/index.umd.d.ts +3 -0
  76. package/lib/getWebGLContext/index.umd.js +25 -7
  77. package/lib/getWebGLContext/index.umd.min.d.ts +3 -0
  78. package/lib/getWebGLContext/index.umd.min.js +3 -3
  79. package/lib/index.umd.js +112 -20
  80. package/lib/index.umd.min.js +3 -3
  81. package/lib/move/index.umd.d.ts +3 -0
  82. package/lib/move/index.umd.js +2 -2
  83. package/lib/move/index.umd.min.d.ts +3 -0
  84. package/lib/move/index.umd.min.js +2 -2
  85. package/lib/resizeObserver/index.umd.d.ts +3 -0
  86. package/lib/resizeObserver/index.umd.js +2 -2
  87. package/lib/resizeObserver/index.umd.min.d.ts +3 -0
  88. package/lib/resizeObserver/index.umd.min.js +2 -2
  89. package/lib/rotate/index.umd.d.ts +3 -0
  90. package/lib/rotate/index.umd.js +2 -2
  91. package/lib/rotate/index.umd.min.d.ts +3 -0
  92. package/lib/rotate/index.umd.min.js +2 -2
  93. package/lib/ruler/index.umd.d.ts +3 -0
  94. package/lib/ruler/index.umd.js +2 -2
  95. package/lib/ruler/index.umd.min.d.ts +3 -0
  96. package/lib/ruler/index.umd.min.js +2 -2
  97. package/lib/scale/index.umd.d.ts +3 -0
  98. package/lib/scale/index.umd.js +2 -2
  99. package/lib/scale/index.umd.min.d.ts +3 -0
  100. package/lib/scale/index.umd.min.js +2 -2
  101. package/lib/throttle/index.umd.d.ts +3 -0
  102. package/lib/throttle/index.umd.js +2 -2
  103. package/lib/throttle/index.umd.min.d.ts +3 -0
  104. package/lib/throttle/index.umd.min.js +2 -2
  105. package/lib/viewHandler/index.umd.d.ts +3 -0
  106. package/lib/viewHandler/index.umd.js +2 -2
  107. package/lib/viewHandler/index.umd.min.d.ts +3 -0
  108. package/lib/viewHandler/index.umd.min.js +2 -2
  109. package/package/getWebGLContext/index.ts +40 -39
  110. package/package.json +1 -1
  111. package/src/Canvas.ts +2 -2
  112. package/src/Geometry.ts +65 -1
  113. package/src/WebGL.ts +66 -66
  114. package/src/common/canvas/painter.ts +26 -0
  115. package/src/common/geometry/prism-horizontal.ts +50 -35
  116. package/src/common/geometry/prism-vertical.ts +55 -40
  117. package/src/common/geometry/tool/circle.ts +17 -11
  118. package/src/common/geometry/tool/rotateLine.ts +48 -35
  119. package/src/common/webgl/getWebGLContext.ts +45 -28
  120. package/src/common/webgl/index.ts +227 -226
  121. package/src/common/webgl/shader.ts +75 -75
  122. package/types/Canvas.d.ts +318 -308
  123. package/types/Geometry.d.ts +132 -65
  124. package/types/Object3D.d.ts +114 -114
  125. package/types/Shader.d.ts +23 -23
  126. package/types/WebGLOption.d.ts +14 -7
  127. package/types/getWebGLContext.d.ts +4 -2
  128. package/uni-app/drawImage.js +18 -0
  129. package/uni-app/ui-canvas.vue +10 -1
@@ -1,40 +1,41 @@
1
- import getWebGLContext from "../../src/common/webgl/getWebGLContext"
2
-
3
- export default (el: HTMLElement | null, scale: number = 1) => {
4
- if (!el) {
5
- throw new Error("VISLite getWebGLContext:The mount point requires an HTMLElement type but encountered null.")
6
- }
7
-
8
- let width = el.clientWidth, height = el.clientHeight
9
-
10
- let ViewCanvas: HTMLCanvasElement
11
-
12
- let _el = el as any
13
-
14
- // 如果已经初始化过了
15
- if (_el._vislite_canvas_) {
16
- ViewCanvas = _el._vislite_canvas_
17
- }
18
-
19
- // 否则就初始化
20
- else {
21
-
22
- ViewCanvas = document.createElement('canvas')
23
- el.appendChild(ViewCanvas)
24
-
25
- _el._vislite_canvas_ = ViewCanvas
26
-
27
- el.setAttribute('vislite', 'WebGL')
28
-
29
- }
30
-
31
- // 设置画布大小
32
-
33
- ViewCanvas.style.width = width + "px"
34
- ViewCanvas.setAttribute('width', width + "")
35
-
36
- ViewCanvas.style.height = height + "px"
37
- ViewCanvas.setAttribute('height', height + "")
38
-
39
- return getWebGLContext(ViewCanvas, scale)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vislite",
3
- "version": "0.7.1",
3
+ "version": "0.8.0-alpha.0",
4
4
  "description": "灵活、快速、简单的数据可视化交互式跨端前端库",
5
5
  "main": "./lib/index.umd.min.js",
6
6
  "typings": "./types/index.d.ts",
package/src/Canvas.ts CHANGED
@@ -43,9 +43,9 @@ class Canvas extends OralCanvas implements CanvasType {
43
43
  }
44
44
 
45
45
  // 设置画布大小
46
- const canvasArray = [RegionCanvas, ViewCanvas]
46
+ let canvasArray = [RegionCanvas, ViewCanvas]
47
47
  for (let index = 0; index < canvasArray.length; index++) {
48
- const canvas = canvasArray[index]
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
- export default function (normal: boolean, x: number, y: number, z: number, radius: number, num: number, d: number) {
6
-
7
- let beginX: number, beginZ: number
8
- if (num == 4) {
9
- const temp = radius / 1.414
10
- beginX = x + temp
11
- beginZ = z + temp
12
-
13
- } else {
14
- beginX = x + radius
15
- beginZ = z
16
- }
17
-
18
- let point = [beginX, beginZ]
19
- const points = []
20
- const deg = Math.PI * 2 / num
21
- for (let i = 0; i < num; i++) {
22
-
23
- points.push(x, y, z)
24
- if (normal) points.push(0, d, 0)
25
-
26
- points.push(point[0], y, point[1])
27
- if (normal) points.push(0, d, 0)
28
-
29
- point = rotate(x, z, deg * (i + 1), beginX, beginZ)
30
- points.push(point[0], y, point[1])
31
- if (normal) points.push(0, d, 0)
32
- }
33
-
34
- return points
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
- export default function (normal: boolean, x: number, y: number, z: number, radius: number, height: number, num: number) {
6
- const points = []
7
- let beginPosition: [number, number]
8
-
9
- if (num == 4) {
10
- beginPosition = rotate(x, z, Math.PI * 0.25, x - radius, z)
11
- } else {
12
- beginPosition = [x + radius, z]
13
- }
14
-
15
- const deg = Math.PI * 2 / num, degHalf = Math.PI * 2 / (num * 2)
16
-
17
- let endPosition: [number, number], normalPosition: [number, number, number] | [] = []
18
- for (let i = 0; i < num; i++) {
19
-
20
- endPosition = rotate(x, z, deg, ...beginPosition)
21
-
22
- if (normal) {
23
- const halfPosition = rotate(x, z, degHalf, ...beginPosition)
24
- normalPosition = [halfPosition[0], 0, halfPosition[1]]
25
- }
26
-
27
- points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
28
- points.push(beginPosition[0], y + height, beginPosition[1], ...normalPosition)
29
- points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
30
-
31
- points.push(beginPosition[0], y, beginPosition[1], ...normalPosition)
32
- points.push(endPosition[0], y, endPosition[1], ...normalPosition)
33
- points.push(endPosition[0], y + height, endPosition[1], ...normalPosition)
34
-
35
-
36
- beginPosition = endPosition
37
- }
38
-
39
- return points
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
- export const splitNum = function (precision: number, radius: number) {
3
-
4
- // 根据切割弧度得出切割块数目
5
- const num = Math.ceil(Math.PI * 2 /
6
-
7
- // 为了满足最小精度而得出的切割弧度
8
- Math.asin(precision / radius) * 2)
9
-
10
- return (isNaN(num) || num < 12) ? 12 : num
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
- export default function (x: number, y: number, z: number, x2: number, y2: number, z2: number) {
2
- return (x0: number, y0: number, z0: number, isNormal: boolean) => {
3
- let sin: number, cos: number, temp: Array<number>
4
-
5
- // 第一步:归零化
6
- let _x0 = x0 - (isNormal ? 0 : x), _y0 = y0 - (isNormal ? 0 : y), _z0 = z0 - (isNormal ? 0 : z) // 法向量起点本来就是原点
7
- const _x2 = x2 - x, _y2 = y2 - y, _z2 = z2 - z
8
-
9
- // 第二步:围绕OZ轴旋转
10
-
11
- const __d = Math.sqrt(_x2 * _x2 + _z2 * _z2)
12
- cos = _x2 / __d
13
- sin = _z2 / __d
14
-
15
- const _x2N = _z2 * sin + _x2 * cos
16
-
17
- const d = Math.sqrt(_y2 * _y2 + _x2N * _x2N)
18
- cos = _y2 / d
19
- sin = _x2N / d
20
-
21
- temp = [_y0, _x0]
22
- _y0 = temp[0] * cos - temp[1] * sin
23
- _x0 = temp[0] * sin + temp[1] * cos
24
-
25
- // 第三步:围绕0Y轴旋转
26
- cos = _x2 / __d
27
- sin = _z2 / __d
28
-
29
- temp = [_x0, _z0]
30
- _x0 = temp[0] * cos - temp[1] * sin
31
- _z0 = temp[0] * sin + temp[1] * cos
32
-
33
- // 第四步:去零化(直接返回)
34
- return [_x0 + (isNormal ? 0 : x), _y0 + (isNormal ? 0 : y), _z0 + (isNormal ? 0 : z)]
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
  }