vislite 0.5.0 → 0.5.2-alpha.1

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 (76) hide show
  1. package/CHANGELOG +137 -132
  2. package/lib/Buffer/index.umd.js +36 -36
  3. package/lib/Buffer/index.umd.min.js +2 -2
  4. package/lib/Canvas/index.umd.js +650 -650
  5. package/lib/Canvas/index.umd.min.js +2 -2
  6. package/lib/Cardinal/index.umd.js +91 -91
  7. package/lib/Cardinal/index.umd.min.js +2 -2
  8. package/lib/Eoap/index.umd.js +34 -34
  9. package/lib/Eoap/index.umd.min.js +2 -2
  10. package/lib/Geometry/index.umd.js +142 -142
  11. package/lib/Geometry/index.umd.min.js +2 -2
  12. package/lib/Hermite/index.umd.js +36 -36
  13. package/lib/Hermite/index.umd.min.js +2 -2
  14. package/lib/Matrix4/index.umd.js +119 -119
  15. package/lib/Matrix4/index.umd.min.js +2 -2
  16. package/lib/Mercator/index.umd.js +20 -20
  17. package/lib/Mercator/index.umd.min.js +2 -2
  18. package/lib/OralCanvas/index.es.js +598 -598
  19. package/lib/OralCanvas/index.es.min.js +2 -2
  20. package/lib/OralWebGL/index.es.js +524 -524
  21. package/lib/OralWebGL/index.es.min.js +2 -2
  22. package/lib/SVG/index.umd.js +406 -406
  23. package/lib/SVG/index.umd.min.js +2 -2
  24. package/lib/Shader/index.umd.js +61 -61
  25. package/lib/Shader/index.umd.min.js +2 -2
  26. package/lib/Texture/index.umd.js +53 -53
  27. package/lib/Texture/index.umd.min.js +2 -2
  28. package/lib/TreeLayout/index.umd.js +363 -363
  29. package/lib/TreeLayout/index.umd.min.js +2 -2
  30. package/lib/WebGL/index.umd.js +571 -571
  31. package/lib/WebGL/index.umd.min.js +2 -2
  32. package/lib/animation/index.umd.js +72 -72
  33. package/lib/animation/index.umd.min.js +2 -2
  34. package/lib/formatColor/index.umd.js +40 -40
  35. package/lib/formatColor/index.umd.min.js +2 -2
  36. package/lib/getLoopColors/index.umd.js +36 -36
  37. package/lib/getLoopColors/index.umd.min.js +2 -2
  38. package/lib/getWebGLContext/index.umd.js +44 -44
  39. package/lib/getWebGLContext/index.umd.min.js +2 -2
  40. package/lib/index.umd.js +2647 -2647
  41. package/lib/index.umd.min.js +2 -2
  42. package/lib/resizeObserver/index.umd.js +29 -29
  43. package/lib/resizeObserver/index.umd.min.js +2 -2
  44. package/lib/rotate/index.umd.js +8 -8
  45. package/lib/rotate/index.umd.min.js +2 -2
  46. package/lib/ruler/index.umd.js +126 -126
  47. package/lib/ruler/index.umd.min.js +2 -2
  48. package/lib/throttle/index.umd.js +49 -49
  49. package/lib/throttle/index.umd.min.js +2 -2
  50. package/lib/viewHandler/index.umd.js +120 -120
  51. package/lib/viewHandler/index.umd.min.js +2 -2
  52. package/package/Geometry/index.ts +2 -2
  53. package/package/index.ts +72 -72
  54. package/package.json +66 -66
  55. package/src/Eoap.ts +66 -66
  56. package/src/Geometry.ts +82 -82
  57. package/src/Matrix4/index.ts +76 -76
  58. package/src/Mercator.ts +27 -27
  59. package/src/TreeLayout/index.ts +186 -186
  60. package/src/common/geometry/prism-horizontal.ts +33 -33
  61. package/src/common/geometry/prism-vertical.ts +40 -40
  62. package/src/common/geometry/sphere-fragment.ts +39 -39
  63. package/src/common/geometry/tool/circle.ts +11 -11
  64. package/src/common/svg/index.ts +344 -344
  65. package/src/rotate.ts +7 -7
  66. package/types/CanvasConfig.d.ts +106 -106
  67. package/types/Geometry.d.ts +40 -40
  68. package/types/GeometryOption.d.ts +11 -11
  69. package/types/GeometryResult.d.ts +18 -18
  70. package/types/Map.d.ts +9 -9
  71. package/types/Matrix4.d.ts +42 -42
  72. package/types/SVG.d.ts +215 -215
  73. package/types/TreeLayout.d.ts +54 -54
  74. package/types/index.d.ts +169 -169
  75. package/types/rotate.d.ts +2 -2
  76. package/uni-app/ui-canvas.vue +206 -202
package/package.json CHANGED
@@ -1,66 +1,66 @@
1
- {
2
- "name": "vislite",
3
- "version": "0.5.0",
4
- "description": "灵活、快速、简单的数据可视化交互式跨端前端库",
5
- "main": "./lib/index.umd.min.js",
6
- "typings": "./types/index.d.ts",
7
- "unpkg": "./lib/index.umd.min.js",
8
- "sideEffects": false,
9
- "scripts": {
10
- "dev": "webpack serve --config ./build/webpack.config.js",
11
- "build": "devby --delete ./lib && node ./build/pkg.js",
12
- "test": "karma start ./build/karma.config.js"
13
- },
14
- "miniprogram": ".",
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/oi-contrib/VISLite.git"
18
- },
19
- "keywords": [
20
- "svg",
21
- "webgl",
22
- "typescript",
23
- "canvas",
24
- "vue",
25
- "uniapp",
26
- "miniprogram",
27
- "image2d",
28
- "image3d",
29
- "oi-contrib",
30
- "vislite",
31
- "d3",
32
- "zxl20070701",
33
- "three",
34
- "echarts",
35
- "datav",
36
- "webgpu",
37
- "layout",
38
- "algorithm"
39
- ],
40
- "author": {
41
- "name": "zxl20070701",
42
- "url": "https://zxl20070701.github.io/notebook/home.html"
43
- },
44
- "license": "MIT",
45
- "bugs": {
46
- "url": "https://github.com/oi-contrib/VISLite/issues"
47
- },
48
- "homepage": "https://oi-contrib.github.io/VISLite",
49
- "devDependencies": {
50
- "@rollup/plugin-typescript": "^11.1.0",
51
- "@types/jasmine": "^4.3.1",
52
- "devby": "^0.4.6",
53
- "karma": "^6.3.10",
54
- "karma-chrome-launcher": "^3.1.0",
55
- "karma-jasmine": "^4.0.1",
56
- "karma-webpack": "^5.0.0",
57
- "rollup": "^3.20.6",
58
- "terser": "^5.17.1",
59
- "ts-loader": "^9.2.8",
60
- "tslib": "^2.5.0",
61
- "typescript": "^4.6.2",
62
- "webpack": "^5.70.0",
63
- "webpack-cli": "^4.9.2",
64
- "webpack-dev-server": "^4.7.4"
65
- }
66
- }
1
+ {
2
+ "name": "vislite",
3
+ "version": "0.5.2-alpha.1",
4
+ "description": "灵活、快速、简单的数据可视化交互式跨端前端库",
5
+ "main": "./lib/index.umd.min.js",
6
+ "typings": "./types/index.d.ts",
7
+ "unpkg": "./lib/index.umd.min.js",
8
+ "sideEffects": false,
9
+ "scripts": {
10
+ "dev": "webpack serve --config ./build/webpack.config.js",
11
+ "build": "devby --delete ./lib && node ./build/pkg.js",
12
+ "test": "karma start ./build/karma.config.js"
13
+ },
14
+ "miniprogram": ".",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/oi-contrib/VISLite.git"
18
+ },
19
+ "keywords": [
20
+ "svg",
21
+ "webgl",
22
+ "typescript",
23
+ "canvas",
24
+ "vue",
25
+ "uniapp",
26
+ "miniprogram",
27
+ "image2d",
28
+ "image3d",
29
+ "oi-contrib",
30
+ "vislite",
31
+ "d3",
32
+ "zxl20070701",
33
+ "three",
34
+ "echarts",
35
+ "datav",
36
+ "webgpu",
37
+ "layout",
38
+ "algorithm"
39
+ ],
40
+ "author": {
41
+ "name": "zxl20070701",
42
+ "url": "https://zxl20070701.github.io/notebook/home.html"
43
+ },
44
+ "license": "MIT",
45
+ "bugs": {
46
+ "url": "https://github.com/oi-contrib/VISLite/issues"
47
+ },
48
+ "homepage": "https://oi-contrib.github.io/VISLite",
49
+ "devDependencies": {
50
+ "@rollup/plugin-typescript": "^11.1.0",
51
+ "@types/jasmine": "^4.3.1",
52
+ "devby": "^0.4.6",
53
+ "karma": "^6.3.10",
54
+ "karma-chrome-launcher": "^3.1.0",
55
+ "karma-jasmine": "^4.0.1",
56
+ "karma-webpack": "^5.0.0",
57
+ "rollup": "^3.20.6",
58
+ "terser": "^5.17.1",
59
+ "ts-loader": "^9.2.8",
60
+ "tslib": "^2.5.0",
61
+ "typescript": "^4.6.2",
62
+ "webpack": "^5.70.0",
63
+ "webpack-cli": "^4.9.2",
64
+ "webpack-dev-server": "^4.7.4"
65
+ }
66
+ }
package/src/Eoap.ts CHANGED
@@ -1,66 +1,66 @@
1
- import type MapType from '../types/Map'
2
-
3
- // 围绕X轴旋转
4
- let rotateX = function (deg: number, x: number, y: number, z: number) {
5
- let cos = Math.cos(deg), sin = Math.sin(deg)
6
- return [x, y * cos - z * sin, y * sin + z * cos]
7
- }
8
-
9
- // 围绕Y轴旋转
10
- let rotateY = function (deg: number, x: number, y: number, z: number) {
11
- let cos = Math.cos(deg), sin = Math.sin(deg)
12
- return [z * sin + x * cos, y, z * cos - x * sin]
13
- }
14
-
15
- // 围绕Z轴旋转
16
- let rotateZ = function (deg: number, x: number, y: number, z: number) {
17
- let cos = Math.cos(deg), sin = Math.sin(deg)
18
- return [x * cos - y * sin, x * sin + y * cos, z]
19
- }
20
-
21
- /* 等角斜方位投影 */
22
- class Eoap implements MapType {
23
- readonly name: string = 'Eoap'
24
-
25
- private __scale: number // 缩放比例
26
- private __center: number[] // 投影中心经纬度
27
-
28
- constructor(scale: number = 7, center: number[] = [107, 36]) {
29
- this.__scale = scale
30
- this.__center = center
31
- }
32
-
33
- use(λ: number, φ: number): [number, number, number] {
34
- /**
35
- * 通过旋转的方法
36
- * 先旋转出点的位置
37
- * 然后根据把地心到旋转中心的这条射线变成OZ这条射线的变换应用到初始化点上
38
- * 这样求的的点的x,y就是最终结果
39
- *
40
- * 计算过程:
41
- * 1.初始化点的位置是p(x,0,0),其中x的值是地球半径除以缩放倍速
42
- * 2.根据点的纬度对p进行旋转,旋转后得到的p的坐标纬度就是目标纬度
43
- * 3.同样的对此刻的p进行经度的旋转,这样就获取了极点作为中心点的坐标
44
- * 4.接着想象一下为了让旋转中心移动到极点需要进行旋转的经纬度是多少,记为lo和la
45
- * 5.然后再对p进行经度度旋转lo获得新的p
46
- * 6.然后再对p进行纬度旋转la获得新的p
47
- * 7.旋转结束
48
- *
49
- * 特别注意:第5和第6步顺序一定不可以调换,原因来自经纬度定义上
50
- * 【除了经度为0的位置,不然纬度的旋转会改变原来的经度值,反过来不会】
51
- *
52
- */
53
- let p = rotateY((360 - φ) / 180 * Math.PI, 100 * this.__scale, 0, 0)
54
- p = rotateZ(λ / 180 * Math.PI, p[0], p[1], p[2])
55
- p = rotateZ((90 - this.__center[0]) / 180 * Math.PI, p[0], p[1], p[2])
56
- p = rotateX((90 - this.__center[1]) / 180 * Math.PI, p[0], p[1], p[2])
57
-
58
- return [
59
- -p[0], // 加-号是因为浏览器坐标和地图不一样
60
- p[1],
61
- p[2]
62
- ]
63
- }
64
- }
65
-
66
- export default Eoap
1
+ import type MapType from '../types/Map'
2
+
3
+ // 围绕X轴旋转
4
+ let rotateX = function (deg: number, x: number, y: number, z: number) {
5
+ let cos = Math.cos(deg), sin = Math.sin(deg)
6
+ return [x, y * cos - z * sin, y * sin + z * cos]
7
+ }
8
+
9
+ // 围绕Y轴旋转
10
+ let rotateY = function (deg: number, x: number, y: number, z: number) {
11
+ let cos = Math.cos(deg), sin = Math.sin(deg)
12
+ return [z * sin + x * cos, y, z * cos - x * sin]
13
+ }
14
+
15
+ // 围绕Z轴旋转
16
+ let rotateZ = function (deg: number, x: number, y: number, z: number) {
17
+ let cos = Math.cos(deg), sin = Math.sin(deg)
18
+ return [x * cos - y * sin, x * sin + y * cos, z]
19
+ }
20
+
21
+ /* 等角斜方位投影 */
22
+ class Eoap implements MapType {
23
+ readonly name: string = 'Eoap'
24
+
25
+ private __scale: number // 缩放比例
26
+ private __center: number[] // 投影中心经纬度
27
+
28
+ constructor(scale: number = 7, center: number[] = [107, 36]) {
29
+ this.__scale = scale
30
+ this.__center = center
31
+ }
32
+
33
+ use(λ: number, φ: number): [number, number, number] {
34
+ /**
35
+ * 通过旋转的方法
36
+ * 先旋转出点的位置
37
+ * 然后根据把地心到旋转中心的这条射线变成OZ这条射线的变换应用到初始化点上
38
+ * 这样求的的点的x,y就是最终结果
39
+ *
40
+ * 计算过程:
41
+ * 1.初始化点的位置是p(x,0,0),其中x的值是地球半径除以缩放倍速
42
+ * 2.根据点的纬度对p进行旋转,旋转后得到的p的坐标纬度就是目标纬度
43
+ * 3.同样的对此刻的p进行经度的旋转,这样就获取了极点作为中心点的坐标
44
+ * 4.接着想象一下为了让旋转中心移动到极点需要进行旋转的经纬度是多少,记为lo和la
45
+ * 5.然后再对p进行经度度旋转lo获得新的p
46
+ * 6.然后再对p进行纬度旋转la获得新的p
47
+ * 7.旋转结束
48
+ *
49
+ * 特别注意:第5和第6步顺序一定不可以调换,原因来自经纬度定义上
50
+ * 【除了经度为0的位置,不然纬度的旋转会改变原来的经度值,反过来不会】
51
+ *
52
+ */
53
+ let p = rotateY((360 - φ) / 180 * Math.PI, 100 * this.__scale, 0, 0)
54
+ p = rotateZ(λ / 180 * Math.PI, p[0], p[1], p[2])
55
+ p = rotateZ((90 - this.__center[0]) / 180 * Math.PI, p[0], p[1], p[2])
56
+ p = rotateX((90 - this.__center[1]) / 180 * Math.PI, p[0], p[1], p[2])
57
+
58
+ return [
59
+ -p[0], // 加-号是因为浏览器坐标和地图不一样
60
+ p[1],
61
+ p[2]
62
+ ]
63
+ }
64
+ }
65
+
66
+ export default Eoap
package/src/Geometry.ts CHANGED
@@ -1,83 +1,83 @@
1
- import type GeometryType from "../types/Geometry"
2
- import type GeometryOptionType from "../types/GeometryOption"
3
- import type GeometryResultType from "../types/GeometryResult"
4
-
5
- import { splitNum } from './common/geometry/tool/circle'
6
- import prismHorizontal from './common/geometry/prism-horizontal'
7
- import prismVertical from './common/geometry/prism-vertical'
8
- import sphereFragment from './common/geometry/sphere-fragment'
9
- import mergeOption from './common/mergeOption'
10
-
11
- class Geometry implements GeometryType {
12
- readonly name: string = 'Geometry'
13
-
14
- private __option: GeometryOptionType
15
-
16
- constructor(option: GeometryOptionType = {}) {
17
- this.__option = mergeOption(option, {
18
- precision: 0.1, // 精度
19
- normal: false, // 是否需要法向量
20
- })
21
- }
22
-
23
- config(option: GeometryOptionType) {
24
- for (let key in option) {
25
- this.__option[key] = option[key]
26
- }
27
- return this
28
- }
29
-
30
- // 圆柱体
31
- cylinder(x: number, y: number, z: number, radius: number, height: number): Array<GeometryResultType> {
32
-
33
- // 求解出需要切割多少份比较合理
34
- let num = splitNum(this.__option.precision, radius)
35
- return this.prism(x, y, z, radius, height, num)
36
- }
37
-
38
- // 棱柱体
39
- prism(x: number, y: number, z: number, radius: number, height: number, num: number): Array<GeometryResultType> {
40
-
41
- let result = [{
42
- points: [],
43
- length: 0,
44
- method: "TRIANGLES" as const
45
- }]
46
-
47
- // 绘制底部的盖子
48
- result[0].points.push(...prismHorizontal(this.__option.normal, x, y, z, radius, num, height > 0 ? -1 : 1))
49
-
50
- // 绘制顶部的盖子
51
- result[0].points.push(...prismHorizontal(this.__option.normal, x, y + height, z, radius, num, height > 0 ? 1 : -1))
52
-
53
- // 绘制侧边部分
54
- result[0].points.push(...prismVertical(this.__option.normal, x, y, z, radius, height, num))
55
-
56
- result[0].length = 12 * num
57
- return result
58
- }
59
-
60
- // 球体
61
- sphere(cx: number, cy: number, cz: number, radius: number): Array<GeometryResultType> {
62
-
63
- // 求解出需要切割多少份比较合理
64
- let num = splitNum(this.__option.precision, radius)
65
-
66
- // 然后一瓣瓣的绘制
67
- let result = [{
68
- points: [],
69
- length: 0,
70
- method: "TRIANGLES" as const
71
- }]
72
- for (let i = 0; i < num; i++) {
73
- result[0].points.push(...sphereFragment(this.__option.normal, cx, cy, cz, radius, num, i))
74
- }
75
-
76
- result[0].length = result[0].points.length / (this.__option.normal ? 6 : 3)
77
-
78
- return result
79
- }
80
-
81
- }
82
-
1
+ import type GeometryType from "../types/Geometry"
2
+ import type GeometryOptionType from "../types/GeometryOption"
3
+ import type GeometryResultType from "../types/GeometryResult"
4
+
5
+ import { splitNum } from './common/geometry/tool/circle'
6
+ import prismHorizontal from './common/geometry/prism-horizontal'
7
+ import prismVertical from './common/geometry/prism-vertical'
8
+ import sphereFragment from './common/geometry/sphere-fragment'
9
+ import mergeOption from './common/mergeOption'
10
+
11
+ class Geometry implements GeometryType {
12
+ readonly name: string = 'Geometry'
13
+
14
+ private __option: GeometryOptionType
15
+
16
+ constructor(option: GeometryOptionType = {}) {
17
+ this.__option = mergeOption(option, {
18
+ precision: 0.1, // 精度
19
+ normal: false, // 是否需要法向量
20
+ })
21
+ }
22
+
23
+ config(option: GeometryOptionType) {
24
+ for (let key in option) {
25
+ this.__option[key] = option[key]
26
+ }
27
+ return this
28
+ }
29
+
30
+ // 圆柱体
31
+ cylinder(x: number, y: number, z: number, radius: number, height: number): Array<GeometryResultType> {
32
+
33
+ // 求解出需要切割多少份比较合理
34
+ let num = splitNum(this.__option.precision, radius)
35
+ return this.prism(x, y, z, radius, height, num)
36
+ }
37
+
38
+ // 棱柱体
39
+ prism(x: number, y: number, z: number, radius: number, height: number, num: number): Array<GeometryResultType> {
40
+
41
+ let result = [{
42
+ points: [],
43
+ length: 0,
44
+ method: "TRIANGLES" as const
45
+ }]
46
+
47
+ // 绘制底部的盖子
48
+ result[0].points.push(...prismHorizontal(this.__option.normal, x, y, z, radius, num, height > 0 ? -1 : 1))
49
+
50
+ // 绘制顶部的盖子
51
+ result[0].points.push(...prismHorizontal(this.__option.normal, x, y + height, z, radius, num, height > 0 ? 1 : -1))
52
+
53
+ // 绘制侧边部分
54
+ result[0].points.push(...prismVertical(this.__option.normal, x, y, z, radius, height, num))
55
+
56
+ result[0].length = 12 * num
57
+ return result
58
+ }
59
+
60
+ // 球体
61
+ sphere(cx: number, cy: number, cz: number, radius: number): Array<GeometryResultType> {
62
+
63
+ // 求解出需要切割多少份比较合理
64
+ let num = splitNum(this.__option.precision, radius)
65
+
66
+ // 然后一瓣瓣的绘制
67
+ let result = [{
68
+ points: [],
69
+ length: 0,
70
+ method: "TRIANGLES" as const
71
+ }]
72
+ for (let i = 0; i < num; i++) {
73
+ result[0].points.push(...sphereFragment(this.__option.normal, cx, cy, cz, radius, num, i))
74
+ }
75
+
76
+ result[0].length = result[0].points.length / (this.__option.normal ? 6 : 3)
77
+
78
+ return result
79
+ }
80
+
81
+ }
82
+
83
83
  export default Geometry
@@ -1,77 +1,77 @@
1
- import type Matrix4Type from '../../types/Matrix4'
2
-
3
- // 两个4x4矩阵相乘
4
- // 或矩阵和齐次坐标相乘
5
- let _multiply = function (matrix4: number[], param: number[]) {
6
- let newParam: number[] = []
7
- for (let i = 0; i < 4; i++)
8
- for (let j = 0; j < param.length / 4; j++)
9
- newParam[j * 4 + i] =
10
- matrix4[i] * param[j * 4] +
11
- matrix4[i + 4] * param[j * 4 + 1] +
12
- matrix4[i + 8] * param[j * 4 + 2] +
13
- matrix4[i + 12] * param[j * 4 + 3]
14
- return newParam
15
- }
16
-
17
- import _move from './move'
18
- import _rotate from './rotate'
19
- import _scale from './scale'
20
- import _transform from './transform'
21
-
22
- // 列主序存储的4x4矩阵
23
-
24
- class Matrix4 implements Matrix4Type {
25
- readonly name: string = 'Matrix4'
26
-
27
- private __matrix4: number[]
28
-
29
- constructor(initMatrix4: number[] = [
30
- 1, 0, 0, 0,
31
- 0, 1, 0, 0,
32
- 0, 0, 1, 0,
33
- 0, 0, 0, 1
34
- ]) {
35
- this.__matrix4 = initMatrix4
36
- }
37
-
38
- // 移动
39
- move(dis: number, a: number, b: number, c: number = 0) {
40
- this.__matrix4 = _multiply(_move(dis, a, b, c), this.__matrix4)
41
- return this
42
- }
43
-
44
- // 旋转
45
- rotate(deg: number, a1: number, b1: number, c1?: number, a2?: number, b2?: number, c2?: number) {
46
- let matrix4s = _transform(a1, b1, c1, a2, b2, c2)
47
- this.__matrix4 = _multiply(_multiply(_multiply(matrix4s[1], _rotate(deg)), matrix4s[0]), this.__matrix4)
48
- return this
49
- }
50
-
51
- // 缩放
52
- scale(xTimes: number, yTimes: number, zTimes: number, cx: number = 0, cy: number = 0, cz: number = 0) {
53
- this.__matrix4 = _multiply(_scale(xTimes, yTimes, zTimes, cx, cy, cz), this.__matrix4)
54
- return this
55
- }
56
-
57
- // 乘法
58
- // 可以传入一个矩阵(matrix4,flag)
59
- multiply(newMatrix4: number[], flag: boolean = false) {
60
- this.__matrix4 = flag ? _multiply(this.__matrix4, newMatrix4) : _multiply(newMatrix4, this.__matrix4)
61
- return this
62
- }
63
-
64
- // 对一个坐标应用变换
65
- // 齐次坐标(x,y,z,w)
66
- use(x: number, y: number, z: number = 0, w: number = 1): [number, number, number, number] {
67
- // w为0表示点位于无穷远处,忽略
68
- return _multiply(this.__matrix4, [x, y, z, w]) as [number, number, number, number]
69
- }
70
-
71
- // 矩阵的值
72
- value() {
73
- return this.__matrix4
74
- }
75
- }
76
-
1
+ import type Matrix4Type from '../../types/Matrix4'
2
+
3
+ // 两个4x4矩阵相乘
4
+ // 或矩阵和齐次坐标相乘
5
+ let _multiply = function (matrix4: number[], param: number[]) {
6
+ let newParam: number[] = []
7
+ for (let i = 0; i < 4; i++)
8
+ for (let j = 0; j < param.length / 4; j++)
9
+ newParam[j * 4 + i] =
10
+ matrix4[i] * param[j * 4] +
11
+ matrix4[i + 4] * param[j * 4 + 1] +
12
+ matrix4[i + 8] * param[j * 4 + 2] +
13
+ matrix4[i + 12] * param[j * 4 + 3]
14
+ return newParam
15
+ }
16
+
17
+ import _move from './move'
18
+ import _rotate from './rotate'
19
+ import _scale from './scale'
20
+ import _transform from './transform'
21
+
22
+ // 列主序存储的4x4矩阵
23
+
24
+ class Matrix4 implements Matrix4Type {
25
+ readonly name: string = 'Matrix4'
26
+
27
+ private __matrix4: number[]
28
+
29
+ constructor(initMatrix4: number[] = [
30
+ 1, 0, 0, 0,
31
+ 0, 1, 0, 0,
32
+ 0, 0, 1, 0,
33
+ 0, 0, 0, 1
34
+ ]) {
35
+ this.__matrix4 = initMatrix4
36
+ }
37
+
38
+ // 移动
39
+ move(dis: number, a: number, b: number, c: number = 0) {
40
+ this.__matrix4 = _multiply(_move(dis, a, b, c), this.__matrix4)
41
+ return this
42
+ }
43
+
44
+ // 旋转
45
+ rotate(deg: number, a1: number, b1: number, c1?: number, a2?: number, b2?: number, c2?: number) {
46
+ let matrix4s = _transform(a1, b1, c1, a2, b2, c2)
47
+ this.__matrix4 = _multiply(_multiply(_multiply(matrix4s[1], _rotate(deg)), matrix4s[0]), this.__matrix4)
48
+ return this
49
+ }
50
+
51
+ // 缩放
52
+ scale(xTimes: number, yTimes: number, zTimes: number, cx: number = 0, cy: number = 0, cz: number = 0) {
53
+ this.__matrix4 = _multiply(_scale(xTimes, yTimes, zTimes, cx, cy, cz), this.__matrix4)
54
+ return this
55
+ }
56
+
57
+ // 乘法
58
+ // 可以传入一个矩阵(matrix4,flag)
59
+ multiply(newMatrix4: number[], flag: boolean = false) {
60
+ this.__matrix4 = flag ? _multiply(this.__matrix4, newMatrix4) : _multiply(newMatrix4, this.__matrix4)
61
+ return this
62
+ }
63
+
64
+ // 对一个坐标应用变换
65
+ // 齐次坐标(x,y,z,w)
66
+ use(x: number, y: number, z: number = 0, w: number = 1): [number, number, number, number] {
67
+ // w为0表示点位于无穷远处,忽略
68
+ return _multiply(this.__matrix4, [x, y, z, w]) as [number, number, number, number]
69
+ }
70
+
71
+ // 矩阵的值
72
+ value() {
73
+ return this.__matrix4
74
+ }
75
+ }
76
+
77
77
  export default Matrix4
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
- let perimeter = 100 * scale * Math.PI // 半周长
11
-
12
- let help = perimeter / 180
13
-
14
- let cx = help * center[0] // 中心横坐标
15
- let 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
+ let perimeter = 100 * scale * Math.PI // 半周长
11
+
12
+ let help = perimeter / 180
13
+
14
+ let cx = help * center[0] // 中心横坐标
15
+ let 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