vislite 1.12.0-alpha.0 → 1.12.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 (183) hide show
  1. package/AUTHORS.txt +6 -6
  2. package/CHANGELOG +402 -394
  3. package/LICENSE +20 -20
  4. package/README-en.md +245 -245
  5. package/README.md +245 -245
  6. package/bin/formatArgv.js +30 -30
  7. package/bin/help.js +17 -17
  8. package/bin/run +21 -21
  9. package/bin/skills.js +26 -26
  10. package/lib/BarLayout/index.es.js +348 -348
  11. package/lib/Buffer/index.es.js +34 -34
  12. package/lib/Canvas/index.es.js +804 -800
  13. package/lib/Canvas/index.es.min.js +1 -1
  14. package/lib/Cardinal/index.es.js +89 -89
  15. package/lib/Eoap/index.es.js +32 -32
  16. package/lib/Hermite/index.es.js +34 -34
  17. package/lib/MapCoordinate/index.es.js +199 -199
  18. package/lib/Matrix4/index.es.js +123 -123
  19. package/lib/Mercator/index.es.js +18 -18
  20. package/lib/PieLayout/index.es.js +115 -115
  21. package/lib/RawCanvas/index.es.js +736 -732
  22. package/lib/RawCanvas/index.es.min.js +1 -1
  23. package/lib/SVG/index.es.js +626 -631
  24. package/lib/SVG/index.es.min.js +1 -1
  25. package/lib/Shader/index.es.js +34 -34
  26. package/lib/Texture/index.es.js +52 -52
  27. package/lib/TreeLayout/index.es.js +301 -315
  28. package/lib/animation/index.es.js +2 -2
  29. package/lib/assemble/index.es.js +19 -16
  30. package/lib/assemble/index.es.min.js +1 -1
  31. package/lib/getLoopColors/index.es.js +34 -34
  32. package/lib/getWebGLContext/index.es.js +61 -61
  33. package/lib/index.umd.js +2797 -2784
  34. package/lib/index.umd.min.js +2 -2
  35. package/lib/initOption/index.es.js +5 -5
  36. package/lib/mergeOption/index.es.js +34 -34
  37. package/lib/move/index.es.js +6 -6
  38. package/lib/rotate/index.es.js +6 -6
  39. package/lib/ruler/index.es.js +136 -136
  40. package/lib/scale/index.es.js +5 -5
  41. package/minialipay/ui-canvas/drawImage.js +35 -35
  42. package/minialipay/ui-canvas/index.acss +4 -4
  43. package/minialipay/ui-canvas/index.axml +3 -3
  44. package/minialipay/ui-canvas/index.d.ts +1 -1
  45. package/minialipay/ui-canvas/index.js +100 -100
  46. package/minialipay/ui-canvas/index.json +6 -6
  47. package/miniprogram/ui-canvas/drawImage.js +35 -35
  48. package/miniprogram/ui-canvas/index.js +125 -125
  49. package/miniprogram/ui-canvas/index.json +4 -4
  50. package/miniprogram/ui-canvas/index.wxml +4 -4
  51. package/miniprogram/ui-canvas/index.wxss +5 -5
  52. package/package/BarLayout/index.ts +2 -2
  53. package/package/Buffer/index.ts +2 -2
  54. package/package/Canvas/index.ts +2 -2
  55. package/package/Cardinal/index.ts +2 -2
  56. package/package/Eoap/index.ts +2 -2
  57. package/package/Hermite/index.ts +2 -2
  58. package/package/MapCoordinate/index.ts +2 -2
  59. package/package/Matrix4/index.ts +2 -2
  60. package/package/Mercator/index.ts +2 -2
  61. package/package/PieLayout/index.ts +2 -2
  62. package/package/RawCanvas/index.ts +2 -2
  63. package/package/SVG/index.ts +2 -2
  64. package/package/Shader/index.ts +2 -2
  65. package/package/Texture/index.ts +2 -2
  66. package/package/TreeLayout/index.ts +2 -2
  67. package/package/animation/index.ts +5 -5
  68. package/package/assemble/index.ts +2 -2
  69. package/package/getLoopColors/index.ts +2 -2
  70. package/package/getWebGLContext/index.ts +40 -40
  71. package/package/index.ts +84 -84
  72. package/package/initOption/index.ts +2 -2
  73. package/package/mergeOption/index.ts +2 -2
  74. package/package/move/index.ts +2 -2
  75. package/package/rotate/index.ts +2 -2
  76. package/package/ruler/index.ts +2 -2
  77. package/package/scale/index.ts +2 -2
  78. package/package/throttle/index.ts +2 -2
  79. package/package.json +79 -79
  80. package/skills/vislite-lib/BarLayout.md +117 -117
  81. package/skills/vislite-lib/Canvas.md +183 -183
  82. package/skills/vislite-lib/Interpolation.md +129 -129
  83. package/skills/vislite-lib/Matrix.md +174 -174
  84. package/skills/vislite-lib/PieLayout.md +131 -131
  85. package/skills/vislite-lib/Projections.md +158 -158
  86. package/skills/vislite-lib/SKILL.md +179 -179
  87. package/skills/vislite-lib/SVG.md +137 -137
  88. package/skills/vislite-lib/TreeLayout.md +176 -176
  89. package/skills/vislite-lib/Utilities.md +261 -261
  90. package/skills/vislite-lib/WebGL.md +106 -106
  91. package/skills/vislite-lib/minialipay/ui-canvas.md +95 -95
  92. package/skills/vislite-lib/miniprogram/ui-canvas.md +98 -98
  93. package/skills/vislite-lib/uniapp/ui-canvas.md +113 -113
  94. package/src/Canvas.ts +89 -89
  95. package/src/Eoap.ts +66 -66
  96. package/src/Matrix4/index.ts +84 -84
  97. package/src/Matrix4/move.ts +12 -12
  98. package/src/Matrix4/rotate.ts +15 -15
  99. package/src/Matrix4/scale.ts +11 -11
  100. package/src/Matrix4/transform.ts +64 -64
  101. package/src/Mercator.ts +27 -27
  102. package/src/SVG.ts +86 -69
  103. package/src/common/assemble.ts +30 -22
  104. package/src/common/canvas/arc.ts +51 -51
  105. package/src/common/canvas/config.ts +176 -176
  106. package/src/common/canvas/default.ts +64 -64
  107. package/src/common/canvas/gradient.ts +31 -31
  108. package/src/common/canvas/index.ts +189 -189
  109. package/src/common/canvas/painter.ts +475 -454
  110. package/src/common/canvas/texts.ts +18 -18
  111. package/src/common/map/getBoundary.ts +15 -15
  112. package/src/common/map/tool.ts +29 -29
  113. package/src/common/option.ts +31 -31
  114. package/src/common/setStyle.ts +5 -5
  115. package/src/common/svg/config.ts +213 -213
  116. package/src/common/svg/default.ts +29 -29
  117. package/src/common/svg/gradient.ts +53 -53
  118. package/src/common/svg/index.ts +420 -420
  119. package/src/common/svg/tool.ts +51 -51
  120. package/src/common/tree/index.ts +25 -25
  121. package/src/common/tree/toInnerTree.ts +61 -61
  122. package/src/common/tree/toPlainTree.ts +135 -135
  123. package/src/common/type.ts +26 -26
  124. package/src/common/webgl/buffer.ts +79 -79
  125. package/src/common/webgl/getWebGLContext.ts +45 -45
  126. package/src/common/webgl/shader.ts +75 -75
  127. package/src/common/webgl/texture.ts +98 -98
  128. package/src/coordinate/MapCoordinate.ts +80 -80
  129. package/src/getLoopColors.ts +42 -42
  130. package/src/interpolation/Cardinal.ts +110 -110
  131. package/src/interpolation/Hermite.ts +65 -65
  132. package/src/layout/BarLayout.ts +249 -249
  133. package/src/layout/PieLayout.ts +146 -146
  134. package/src/layout/TreeLayout.ts +200 -200
  135. package/src/move.ts +7 -7
  136. package/src/rotate.ts +7 -7
  137. package/src/ruler.ts +209 -209
  138. package/src/scale.ts +6 -6
  139. package/types/Bar.d.ts +91 -91
  140. package/types/BarConfig.d.ts +4 -4
  141. package/types/BarLayout.d.ts +48 -48
  142. package/types/BarOption.d.ts +31 -31
  143. package/types/Buffer.d.ts +30 -30
  144. package/types/Canvas.d.ts +379 -379
  145. package/types/CanvasConfig.d.ts +61 -61
  146. package/types/CanvasOption.d.ts +13 -13
  147. package/types/CanvasOpts.d.ts +9 -9
  148. package/types/Cardinal.d.ts +20 -20
  149. package/types/Gradient.d.ts +20 -20
  150. package/types/Hermite.d.ts +25 -25
  151. package/types/Map.d.ts +9 -9
  152. package/types/MapConfig.d.ts +27 -27
  153. package/types/MapCoordinate.d.ts +22 -22
  154. package/types/Matrix4.d.ts +79 -79
  155. package/types/Pie.d.ts +73 -73
  156. package/types/PieConfig.d.ts +26 -26
  157. package/types/PieLayout.d.ts +40 -40
  158. package/types/PieOption.d.ts +21 -21
  159. package/types/SVG.d.ts +282 -282
  160. package/types/SVGConfig.d.ts +54 -54
  161. package/types/Shader.d.ts +22 -22
  162. package/types/Texture.d.ts +22 -22
  163. package/types/Tree.d.ts +74 -74
  164. package/types/TreeConfig.d.ts +52 -52
  165. package/types/TreeLayout.d.ts +71 -71
  166. package/types/TreeOption.d.ts +48 -48
  167. package/types/animation.d.ts +26 -26
  168. package/types/assemble.d.ts +14 -14
  169. package/types/getLoopColors.d.ts +13 -13
  170. package/types/getWebGLContext.d.ts +7 -7
  171. package/types/index.d.ts +220 -221
  172. package/types/module.d.ts +110 -110
  173. package/types/move.d.ts +15 -15
  174. package/types/option.d.ts +12 -12
  175. package/types/painterConfig.d.ts +14 -14
  176. package/types/rotate.d.ts +15 -15
  177. package/types/ruler.d.ts +24 -24
  178. package/types/scale.d.ts +15 -15
  179. package/types/throttle.d.ts +6 -6
  180. package/types/ui-canvas.d.ts +4 -4
  181. package/types/uni-canvas.d.ts +3 -3
  182. package/uni-app/drawImage.js +19 -19
  183. package/uni-app/ui-canvas.vue +295 -295
@@ -1,114 +1,114 @@
1
- # uni-app Canvas
2
-
3
- uni-app 是一个跨平台框架,VISLite Canvas 可以直接用于 uni-app 项目。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install vislite
9
- ```
10
-
11
- ## Web 平台使用
12
-
13
- ```js
14
- import { Canvas } from 'vislite';
15
-
16
- export default {
17
- onReady() {
18
- this.painter = new Canvas(this.$refs.canvas);
19
- this.painter.config({
20
- fillStyle: 'red'
21
- }).fillCircle(150, 75, 50);
22
- }
23
- }
24
- ```
25
-
26
- ```html
27
- <template>
28
- <view ref="canvas" style="width: 300px; height: 150px;"></view>
29
- </template>
30
- ```
31
-
32
- ## 小程序平台使用
33
-
34
- ### 方式一:使用原生 Canvas
35
-
36
- uni-app 编译到微信/支付宝小程序时,可以获取原生 canvas 上下文:
37
-
38
- ```js
39
- import { RawCanvas } from 'vislite';
40
-
41
- onLoad() {
42
- uni.createSelectorQuery()
43
- .select('#canvas')
44
- .node()
45
- .exec((res) => {
46
- const canvas = res[0].node;
47
- const ctx = canvas.getContext('2d');
48
- const dpr = uni.getSystemInfoSync().pixelRatio;
49
-
50
- canvas.width = 300 * dpr;
51
- canvas.height = 150 * dpr;
52
- ctx.scale(dpr, dpr);
53
-
54
- this.painter = new RawCanvas({
55
- getContext() { return ctx; }
56
- });
57
- });
58
- }
59
- ```
60
-
61
- ### 方式二:使用各平台组件
62
-
63
- 各小程序平台也可以使用对应的 ui-canvas 组件:
64
-
65
- #### 微信小程序
66
-
67
- ```json
68
- {
69
- "usingComponents": {
70
- "ui-canvas": "vislite/miniprogram/ui-canvas/index"
71
- }
72
- }
73
- ```
74
-
75
- #### 支付宝小程序
76
-
77
- ```json
78
- {
79
- "usingComponents": {
80
- "ui-canvas": "vislite/minialipay/ui-canvas/index"
81
- }
82
- }
83
- ```
84
-
85
- ## 跨平台注意事项
86
-
87
- ### 平台差异
88
-
89
- | 功能 | H5 | 微信 | 支付宝 |
90
- |------|-----|------|--------|
91
- | new Canvas() | ✅ | ⚠️ 需用组件 | ⚠️ 需用组件 |
92
- | region检测 | ✅ | ⚠️ 性能差 | ⚠️ 性能差 |
93
- | toDataURL() | ✅ | ⚠️ 需转换 | ⚠️ 需转换 |
94
-
95
- ### 建议
96
-
97
- 1. **H5 优先**:核心逻辑使用 H5 Canvas 实现
98
- 2. **平台检测**:使用 `uni.getSystemInfo()` 判断平台
99
- 3. **降级处理**:小程序平台可关闭 region 功能提升性能
100
-
101
- ```js
102
- import { Canvas } from 'vislite';
103
-
104
- onReady() {
105
- const systemInfo = uni.getSystemInfoSync();
106
-
107
- if (systemInfo.platform === 'h5') {
108
- this.painter = new Canvas(this.$refs.canvas);
109
- } else {
110
- // 小程序平台使用组件
111
- // ...
112
- }
113
- }
1
+ # uni-app Canvas
2
+
3
+ uni-app 是一个跨平台框架,VISLite Canvas 可以直接用于 uni-app 项目。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install vislite
9
+ ```
10
+
11
+ ## Web 平台使用
12
+
13
+ ```js
14
+ import { Canvas } from 'vislite';
15
+
16
+ export default {
17
+ onReady() {
18
+ this.painter = new Canvas(this.$refs.canvas);
19
+ this.painter.config({
20
+ fillStyle: 'red'
21
+ }).fillCircle(150, 75, 50);
22
+ }
23
+ }
24
+ ```
25
+
26
+ ```html
27
+ <template>
28
+ <view ref="canvas" style="width: 300px; height: 150px;"></view>
29
+ </template>
30
+ ```
31
+
32
+ ## 小程序平台使用
33
+
34
+ ### 方式一:使用原生 Canvas
35
+
36
+ uni-app 编译到微信/支付宝小程序时,可以获取原生 canvas 上下文:
37
+
38
+ ```js
39
+ import { RawCanvas } from 'vislite';
40
+
41
+ onLoad() {
42
+ uni.createSelectorQuery()
43
+ .select('#canvas')
44
+ .node()
45
+ .exec((res) => {
46
+ const canvas = res[0].node;
47
+ const ctx = canvas.getContext('2d');
48
+ const dpr = uni.getSystemInfoSync().pixelRatio;
49
+
50
+ canvas.width = 300 * dpr;
51
+ canvas.height = 150 * dpr;
52
+ ctx.scale(dpr, dpr);
53
+
54
+ this.painter = new RawCanvas({
55
+ getContext() { return ctx; }
56
+ });
57
+ });
58
+ }
59
+ ```
60
+
61
+ ### 方式二:使用各平台组件
62
+
63
+ 各小程序平台也可以使用对应的 ui-canvas 组件:
64
+
65
+ #### 微信小程序
66
+
67
+ ```json
68
+ {
69
+ "usingComponents": {
70
+ "ui-canvas": "vislite/miniprogram/ui-canvas/index"
71
+ }
72
+ }
73
+ ```
74
+
75
+ #### 支付宝小程序
76
+
77
+ ```json
78
+ {
79
+ "usingComponents": {
80
+ "ui-canvas": "vislite/minialipay/ui-canvas/index"
81
+ }
82
+ }
83
+ ```
84
+
85
+ ## 跨平台注意事项
86
+
87
+ ### 平台差异
88
+
89
+ | 功能 | H5 | 微信 | 支付宝 |
90
+ |------|-----|------|--------|
91
+ | new Canvas() | ✅ | ⚠️ 需用组件 | ⚠️ 需用组件 |
92
+ | region检测 | ✅ | ⚠️ 性能差 | ⚠️ 性能差 |
93
+ | toDataURL() | ✅ | ⚠️ 需转换 | ⚠️ 需转换 |
94
+
95
+ ### 建议
96
+
97
+ 1. **H5 优先**:核心逻辑使用 H5 Canvas 实现
98
+ 2. **平台检测**:使用 `uni.getSystemInfo()` 判断平台
99
+ 3. **降级处理**:小程序平台可关闭 region 功能提升性能
100
+
101
+ ```js
102
+ import { Canvas } from 'vislite';
103
+
104
+ onReady() {
105
+ const systemInfo = uni.getSystemInfoSync();
106
+
107
+ if (systemInfo.platform === 'h5') {
108
+ this.painter = new Canvas(this.$refs.canvas);
109
+ } else {
110
+ // 小程序平台使用组件
111
+ // ...
112
+ }
113
+ }
114
114
  ```
package/src/Canvas.ts CHANGED
@@ -1,90 +1,90 @@
1
- import type CanvasType from '../types/Canvas'
2
- import type CanvasOptionType from '../types/CanvasOption'
3
-
4
- import OralCanvas from './common/canvas/index'
5
- import { initOption } from './common/option'
6
-
7
- class Canvas extends OralCanvas implements CanvasType {
8
- private __canvas: HTMLCanvasElement
9
- private __el: HTMLElement
10
- constructor(el: HTMLElement | null, option: CanvasOptionType = {}, width: number = 0, height: number = 0) {
11
- if (!el) {
12
- throw new Error("VISLite Canvas:The mount point requires an HTMLElement type but encountered null.")
13
- }
14
-
15
- option = initOption(option, {
16
-
17
- // 对外暴露自定义缩放倍率(为满足特殊场景,以简化使用)
18
- // 2025年7月25日 于秦皇岛
19
- scale: 2,
20
-
21
- region: true,
22
- willReadFrequently: false
23
- })
24
-
25
- width = width || el.clientWidth
26
- height = height || el.clientHeight
27
-
28
- let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement | null = null
29
-
30
- const _el = el as any
31
-
32
- // 如果已经初始化过了
33
- if (_el._vislite_canvas_) {
34
- ViewCanvas = _el._vislite_canvas_[0]
35
- RegionCanvas = _el._vislite_canvas_[1]
36
- }
37
-
38
- // 否则就初始化
39
- else {
40
- ViewCanvas = document.createElement('canvas')
41
- el.appendChild(ViewCanvas)
42
-
43
- if (option.region) {
44
- RegionCanvas = document.createElement('canvas')
45
- }
46
-
47
- _el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
48
-
49
- el.setAttribute('vislite', 'Canvas')
50
- }
51
-
52
- // 设置画布大小
53
- const canvasArray = [RegionCanvas, ViewCanvas]
54
- for (let index = 0; index < canvasArray.length; index++) {
55
- const canvas = canvasArray[index]
56
- if (canvas) {
57
- canvas.style.width = width + "px"
58
- canvas.setAttribute('width', ((index === 1 ? option.scale as number : 1) * width) + "")
59
-
60
- canvas.style.height = height + "px"
61
- canvas.setAttribute('height', ((index === 1 ? option.scale as number : 1) * height) + "")
62
- }
63
- }
64
-
65
- super(ViewCanvas, RegionCanvas, {
66
- willReadFrequently: option.willReadFrequently,
67
- }, option.scale)
68
-
69
- this.__canvas = ViewCanvas
70
- this.__el = el
71
- this.painter.scale(option.scale as number, option.scale as number)
72
- }
73
-
74
- toDataURL(type: string = "image/png", encoderOptions: number = 0.92): Promise<string> {
75
- return new Promise(resolve => {
76
- resolve(this.__canvas.toDataURL(type, encoderOptions))
77
- })
78
- }
79
-
80
- bind(eventName: string, callback: (regionName: string, x: number, y: number) => void) {
81
- this.__el.addEventListener(eventName, (event: any) => {
82
- this.getRegion(event.offsetX, event.offsetY).then(regionName => {
83
- callback(regionName, event.offsetX, event.offsetY)
84
- })
85
- })
86
- return this
87
- }
88
- }
89
-
1
+ import type CanvasType from '../types/Canvas'
2
+ import type CanvasOptionType from '../types/CanvasOption'
3
+
4
+ import OralCanvas from './common/canvas/index'
5
+ import { initOption } from './common/option'
6
+
7
+ class Canvas extends OralCanvas implements CanvasType {
8
+ private __canvas: HTMLCanvasElement
9
+ private __el: HTMLElement
10
+ constructor(el: HTMLElement | null, option: CanvasOptionType = {}, width: number = 0, height: number = 0) {
11
+ if (!el) {
12
+ throw new Error("VISLite Canvas:The mount point requires an HTMLElement type but encountered null.")
13
+ }
14
+
15
+ option = initOption(option, {
16
+
17
+ // 对外暴露自定义缩放倍率(为满足特殊场景,以简化使用)
18
+ // 2025年7月25日 于秦皇岛
19
+ scale: 2,
20
+
21
+ region: true,
22
+ willReadFrequently: false
23
+ })
24
+
25
+ width = width || el.clientWidth
26
+ height = height || el.clientHeight
27
+
28
+ let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement | null = null
29
+
30
+ const _el = el as any
31
+
32
+ // 如果已经初始化过了
33
+ if (_el._vislite_canvas_) {
34
+ ViewCanvas = _el._vislite_canvas_[0]
35
+ RegionCanvas = _el._vislite_canvas_[1]
36
+ }
37
+
38
+ // 否则就初始化
39
+ else {
40
+ ViewCanvas = document.createElement('canvas')
41
+ el.appendChild(ViewCanvas)
42
+
43
+ if (option.region) {
44
+ RegionCanvas = document.createElement('canvas')
45
+ }
46
+
47
+ _el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
48
+
49
+ el.setAttribute('vislite', 'Canvas')
50
+ }
51
+
52
+ // 设置画布大小
53
+ const canvasArray = [RegionCanvas, ViewCanvas]
54
+ for (let index = 0; index < canvasArray.length; index++) {
55
+ const canvas = canvasArray[index]
56
+ if (canvas) {
57
+ canvas.style.width = width + "px"
58
+ canvas.setAttribute('width', ((index === 1 ? option.scale as number : 1) * width) + "")
59
+
60
+ canvas.style.height = height + "px"
61
+ canvas.setAttribute('height', ((index === 1 ? option.scale as number : 1) * height) + "")
62
+ }
63
+ }
64
+
65
+ super(ViewCanvas, RegionCanvas, {
66
+ willReadFrequently: option.willReadFrequently,
67
+ }, option.scale)
68
+
69
+ this.__canvas = ViewCanvas
70
+ this.__el = el
71
+ this.painter.scale(option.scale as number, option.scale as number)
72
+ }
73
+
74
+ toDataURL(type: string = "image/png", encoderOptions: number = 0.92): Promise<string> {
75
+ return new Promise(resolve => {
76
+ resolve(this.__canvas.toDataURL(type, encoderOptions))
77
+ })
78
+ }
79
+
80
+ bind(eventName: string, callback: (regionName: string, x: number, y: number) => void) {
81
+ this.__el.addEventListener(eventName, (event: any) => {
82
+ this.getRegion(event.offsetX, event.offsetY).then(regionName => {
83
+ callback(regionName, event.offsetX, event.offsetY)
84
+ })
85
+ })
86
+ return this
87
+ }
88
+ }
89
+
90
90
  export default Canvas
package/src/Eoap.ts CHANGED
@@ -1,66 +1,66 @@
1
- import type MapType from '../types/Map'
2
-
3
- // 围绕X轴旋转
4
- const rotateX = function (deg: number, x: number, y: number, z: number) {
5
- const cos = Math.cos(deg), sin = Math.sin(deg)
6
- return [x, y * cos - z * sin, y * sin + z * cos]
7
- }
8
-
9
- // 围绕Y轴旋转
10
- const rotateY = function (deg: number, x: number, y: number, z: number) {
11
- const cos = Math.cos(deg), sin = Math.sin(deg)
12
- return [z * sin + x * cos, y, z * cos - x * sin]
13
- }
14
-
15
- // 围绕Z轴旋转
16
- const rotateZ = function (deg: number, x: number, y: number, z: number) {
17
- const 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
+ const rotateX = function (deg: number, x: number, y: number, z: number) {
5
+ const cos = Math.cos(deg), sin = Math.sin(deg)
6
+ return [x, y * cos - z * sin, y * sin + z * cos]
7
+ }
8
+
9
+ // 围绕Y轴旋转
10
+ const rotateY = function (deg: number, x: number, y: number, z: number) {
11
+ const cos = Math.cos(deg), sin = Math.sin(deg)
12
+ return [z * sin + x * cos, y, z * cos - x * sin]
13
+ }
14
+
15
+ // 围绕Z轴旋转
16
+ const rotateZ = function (deg: number, x: number, y: number, z: number) {
17
+ const 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