@pirireis/webglobeplugins 0.15.35 → 0.16.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 (481) hide show
  1. package/Math/angle-calculation.js +14 -13
  2. package/Math/arc-cdf-points.ts +329 -0
  3. package/Math/arc-generate-points-exponantial.ts +299 -0
  4. package/Math/arc.ts +299 -0
  5. package/Math/bounds/line-bbox.js +225 -186
  6. package/Math/circle-cdf-points.ts +143 -0
  7. package/Math/circle.ts +49 -0
  8. package/Math/constants.ts +12 -0
  9. package/Math/index.js +0 -1
  10. package/Math/juction/arc-plane.ts +129 -0
  11. package/Math/juction/line-sphere.ts +30 -0
  12. package/Math/juction/plane-plane.ts +64 -0
  13. package/Math/line.ts +84 -0
  14. package/Math/matrix4.ts +0 -0
  15. package/Math/mesh/mapbox-delaunay.js +607 -0
  16. package/Math/methods.ts +157 -0
  17. package/Math/plane.ts +92 -0
  18. package/Math/quaternion.ts +128 -0
  19. package/Math/roadmap.md +10 -0
  20. package/Math/templete-shapes/grid-visually-equal.ts +119 -0
  21. package/Math/types.ts +66 -0
  22. package/Math/utils.js +3 -2
  23. package/Math/vec3.ts +180 -0
  24. package/algorithms/search-binary.js +14 -16
  25. package/altitude-locator/adaptors.js +0 -1
  26. package/altitude-locator/keymethod.js +0 -1
  27. package/altitude-locator/plugin.js +446 -345
  28. package/altitude-locator/types.js +26 -21
  29. package/arrowfield/adaptor.js +11 -11
  30. package/arrowfield/index.js +3 -3
  31. package/arrowfield/plugin.js +128 -83
  32. package/bearing-line/index.js +2 -2
  33. package/bearing-line/plugin.js +520 -444
  34. package/circle-line-chain/chain-list-map.js +221 -201
  35. package/circle-line-chain/init.js +0 -1
  36. package/circle-line-chain/plugin.js +464 -411
  37. package/circle-line-chain/readme.md +57 -0
  38. package/circle-line-chain/util.js +1 -1
  39. package/compass-rose/compass-rose-padding-flat.js +274 -230
  40. package/compass-rose/compass-text-writer.js +173 -149
  41. package/compass-rose/index.js +3 -3
  42. package/compassrose/compassrose.js +341 -293
  43. package/compassrose/index.js +2 -2
  44. package/depth-locator/readme.md +26 -0
  45. package/dist/Math/angle-calculation.js +13 -0
  46. package/dist/Math/bounds/line-bbox.js +186 -0
  47. package/dist/Math/mesh/mapbox-delaunay.js +544 -0
  48. package/dist/Math/utils.js +2 -0
  49. package/dist/algorithms/search-binary.js +16 -0
  50. package/dist/altitude-locator/adaptors.js +1 -0
  51. package/dist/altitude-locator/keymethod.js +1 -0
  52. package/dist/altitude-locator/plugin.js +345 -0
  53. package/dist/altitude-locator/types.js +21 -0
  54. package/dist/arrowfield/adaptor.js +11 -0
  55. package/dist/arrowfield/index.js +3 -0
  56. package/dist/arrowfield/plugin.js +83 -0
  57. package/dist/bearing-line/index.js +2 -0
  58. package/dist/bearing-line/plugin.js +444 -0
  59. package/dist/circle-line-chain/chain-list-map.js +201 -0
  60. package/dist/circle-line-chain/init.js +1 -0
  61. package/dist/circle-line-chain/plugin.js +411 -0
  62. package/dist/circle-line-chain/util.js +1 -0
  63. package/dist/compass-rose/compass-rose-padding-flat.js +230 -0
  64. package/dist/compass-rose/compass-text-writer.js +149 -0
  65. package/dist/compass-rose/index.js +3 -0
  66. package/dist/compassrose/compassrose.js +293 -0
  67. package/dist/compassrose/index.js +2 -0
  68. package/dist/heatwave/index.js +3 -0
  69. package/dist/heatwave/isobar/objectarraylabels.js +200 -0
  70. package/dist/heatwave/isobar/plugin.js +302 -0
  71. package/dist/heatwave/isobar/quadtreecontours.js +298 -0
  72. package/dist/heatwave/plugins/heatwaveglobeshell.js +204 -0
  73. package/dist/index.js +12 -0
  74. package/dist/jest.config.js +7 -0
  75. package/dist/partialrings/buffer-manager.js +75 -0
  76. package/dist/partialrings/index.js +2 -0
  77. package/dist/partialrings/plugin.js +128 -0
  78. package/dist/partialrings/program.js +279 -0
  79. package/dist/pin/pin-object-array.js +300 -0
  80. package/dist/pin/pin-point-totem.js +60 -0
  81. package/dist/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -0
  82. package/dist/point-heat-map/index.js +1 -0
  83. package/dist/point-heat-map/plugin-webworker.js +121 -0
  84. package/dist/point-heat-map/point-to-heat-map-flow.js +124 -0
  85. package/dist/point-tracks/key-methods.js +2 -0
  86. package/dist/point-tracks/plugin.js +393 -0
  87. package/dist/programs/arrowfield/index.js +2 -0
  88. package/dist/programs/arrowfield/logic.js +254 -0
  89. package/dist/programs/arrowfield/object.js +60 -0
  90. package/dist/programs/data2legend/density-to-legend.js +98 -0
  91. package/dist/programs/data2legend/point-to-density-texture.js +97 -0
  92. package/dist/programs/float2legendwithratio/index.js +2 -0
  93. package/dist/programs/float2legendwithratio/logic.js +167 -0
  94. package/dist/programs/float2legendwithratio/object.js +104 -0
  95. package/dist/programs/globe-util/is-globe-moved.js +19 -0
  96. package/dist/programs/globeshell/index.js +2 -0
  97. package/dist/programs/globeshell/wiggle/index.js +2 -0
  98. package/dist/programs/globeshell/wiggle/logic.js +342 -0
  99. package/dist/programs/globeshell/wiggle/object.js +66 -0
  100. package/dist/programs/helpers/blender/index.js +1 -0
  101. package/dist/programs/helpers/blender/program.js +76 -0
  102. package/dist/programs/helpers/fadeaway/index.js +2 -0
  103. package/dist/programs/helpers/fadeaway/logic.js +69 -0
  104. package/dist/programs/helpers/fadeaway/object.js +14 -0
  105. package/dist/programs/helpers/index.js +2 -0
  106. package/dist/programs/index.js +9 -0
  107. package/dist/programs/line-on-globe/circle-accurate-3d.js +138 -0
  108. package/dist/programs/line-on-globe/circle-accurate-flat.js +210 -0
  109. package/dist/programs/line-on-globe/degree-padding-around-circle-3d.js +156 -0
  110. package/dist/programs/line-on-globe/index.js +1 -0
  111. package/dist/programs/line-on-globe/lines-color-instanced-flat.js +131 -0
  112. package/dist/programs/line-on-globe/util.js +5 -0
  113. package/dist/programs/picking/pickable-polygon-renderer.js +184 -0
  114. package/dist/programs/picking/pickable-renderer.js +184 -0
  115. package/dist/programs/point-on-globe/element-globe-surface-glow.js +138 -0
  116. package/dist/programs/point-on-globe/element-point-glow.js +150 -0
  117. package/dist/programs/point-on-globe/square-pixel-point.js +171 -0
  118. package/dist/programs/polygon-on-globe/texture-dem-triangle-test-plugin.js +97 -0
  119. package/dist/programs/polygon-on-globe/texture-dem-triangles.js +167 -0
  120. package/dist/programs/rings/distancering/circleflatprogram.js +116 -0
  121. package/dist/programs/rings/distancering/circlepaddingfreeangleprogram.js +326 -0
  122. package/dist/programs/rings/distancering/circlepaddysharedbuffer.js +368 -0
  123. package/dist/programs/rings/distancering/index.js +6 -0
  124. package/dist/programs/rings/distancering/paddyflatprogram.js +127 -0
  125. package/dist/programs/rings/distancering/paddyflatprogram2d.js +129 -0
  126. package/dist/programs/rings/distancering/paddyflatprogram3d.js +128 -0
  127. package/dist/programs/rings/index.js +1 -0
  128. package/dist/programs/totems/gpu-selection-uniform-block.js +104 -0
  129. package/dist/programs/two-d/pixel-circle.js +1 -0
  130. package/dist/programs/two-d/pixel-padding-for-compass.js +159 -0
  131. package/dist/programs/util.js +14 -0
  132. package/dist/programs/vectorfields/index.js +3 -0
  133. package/dist/programs/vectorfields/logics/drawrectangleparticles.js +113 -0
  134. package/dist/programs/vectorfields/logics/index.js +2 -0
  135. package/dist/programs/vectorfields/logics/pixelbased.js +140 -0
  136. package/dist/programs/vectorfields/logics/ubo.js +60 -0
  137. package/dist/programs/vectorfields/pingpongbuffermanager.js +73 -0
  138. package/dist/rangerings/index.js +5 -0
  139. package/dist/rangerings/plugin.js +543 -0
  140. package/dist/rangerings/rangeringangletext.js +326 -0
  141. package/dist/rangerings/ring-account.js +112 -0
  142. package/dist/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.js +1 -0
  143. package/dist/shaders/fragment-toy/firework.js +55 -0
  144. package/dist/shaders/fragment-toy/singularity.js +56 -0
  145. package/dist/timetracks/adaptors-line-strip.js +65 -0
  146. package/dist/timetracks/index.js +1 -0
  147. package/dist/timetracks/plugin-line-strip.js +240 -0
  148. package/dist/timetracks/program-line-strip.js +608 -0
  149. package/dist/timetracks/programpoint-line-strip.js +151 -0
  150. package/dist/util/account/bufferoffsetmanager.js +176 -0
  151. package/dist/util/account/index.js +3 -0
  152. package/dist/util/account/util.js +18 -0
  153. package/dist/util/algorithms/index.js +1 -0
  154. package/dist/util/algorithms/search-binary.js +25 -0
  155. package/dist/util/check/index.js +1 -0
  156. package/dist/util/gl-util/uniform-block/shader.js +1 -0
  157. package/dist/util/heatwavedatamanager/datamanager.js +149 -0
  158. package/dist/util/heatwavedatamanager/index.js +2 -0
  159. package/dist/util/index.js +13 -0
  160. package/dist/util/interpolation/index.js +1 -0
  161. package/dist/util/interpolation/timetrack/index.js +2 -0
  162. package/dist/util/interpolation/timetrack/timetrack-interpolator.js +79 -0
  163. package/dist/util/interpolation/timetrack/web-worker.js +46 -0
  164. package/dist/util/jshelpers/data-filler.js +17 -0
  165. package/dist/util/jshelpers/equality.js +18 -0
  166. package/dist/util/jshelpers/index.js +2 -0
  167. package/dist/util/jshelpers/timefilters.js +30 -0
  168. package/dist/util/picking/fence.js +43 -0
  169. package/dist/util/picking/picker-displayer.js +136 -0
  170. package/dist/util/programs/draw-texture-on-canvas.js +86 -0
  171. package/dist/util/programs/index.js +1 -0
  172. package/dist/util/programs/shapesonglobe.js +210 -0
  173. package/dist/util/programs/supersampletotextures.js +109 -0
  174. package/dist/util/programs/texturetoglobe.js +179 -0
  175. package/dist/util/shaderfunctions/index.js +2 -0
  176. package/dist/util/shaderfunctions/nodata.js +8 -0
  177. package/dist/util/shaderfunctions/noisefunctions.js +41 -0
  178. package/dist/util/surface-line-data/arcs-to-cuts.js +50 -0
  179. package/dist/util/surface-line-data/cut-arc.js +1 -0
  180. package/dist/util/surface-line-data/rbush-manager.js +1 -0
  181. package/dist/util/surface-line-data/types.js +1 -0
  182. package/dist/util/surface-line-data/web-worker.js +1 -0
  183. package/dist/util/webglobe/gldefaultstates.js +4 -0
  184. package/dist/util/webglobe/index.js +2 -0
  185. package/dist/util/webglobe/rasteroverlay.js +75 -0
  186. package/dist/waveparticles/adaptor.js +15 -0
  187. package/dist/waveparticles/index.js +3 -0
  188. package/dist/waveparticles/plugin.js +290 -0
  189. package/dist/wind/imagetovectorfieldandmagnitude.js +56 -0
  190. package/dist/wind/index.js +5 -0
  191. package/dist/wind/plugin.js +921 -0
  192. package/dist/wind/vectorfieldimage.js +23 -0
  193. package/dist/write-text/attached-text-writer.js +87 -0
  194. package/dist/write-text/context-text-bulk.js +185 -0
  195. package/dist/write-text/context-text.js +94 -0
  196. package/dist/write-text/context-text3old.js +152 -0
  197. package/dist/write-text/index.js +1 -0
  198. package/dist/write-text/writer-plugin.js +8 -0
  199. package/heatwave/index.js +4 -3
  200. package/heatwave/isobar/objectarraylabels.js +247 -200
  201. package/heatwave/isobar/plugin.js +339 -302
  202. package/heatwave/isobar/quadtreecontours.js +336 -298
  203. package/heatwave/plugins/heatwaveglobeshell.js +259 -204
  204. package/index.js +15 -12
  205. package/jest.config.js +6 -7
  206. package/package.json +6 -2
  207. package/partialrings/buffer-manager.js +89 -75
  208. package/partialrings/goals.md +17 -0
  209. package/partialrings/index.js +3 -2
  210. package/partialrings/plugin.js +160 -128
  211. package/partialrings/program.js +233 -188
  212. package/pin/pin-object-array.js +381 -300
  213. package/pin/pin-point-totem.js +77 -60
  214. package/point-heat-map/adaptors/timetracksplugin-format-to-this.js +78 -63
  215. package/point-heat-map/index.js +0 -1
  216. package/point-heat-map/plugin-webworker.js +148 -121
  217. package/point-heat-map/point-to-heat-map-flow.js +150 -124
  218. package/point-heat-map/readme.md +15 -0
  219. package/point-tracks/key-methods.js +3 -2
  220. package/point-tracks/plugin.js +480 -393
  221. package/programs/arrowfield/index.js +2 -2
  222. package/programs/arrowfield/logic.js +173 -141
  223. package/programs/arrowfield/object.js +89 -60
  224. package/programs/data2legend/density-to-legend.js +90 -73
  225. package/programs/data2legend/point-to-density-texture.js +87 -70
  226. package/programs/float2legendwithratio/index.js +3 -2
  227. package/programs/float2legendwithratio/logic.js +144 -118
  228. package/programs/float2legendwithratio/object.js +141 -104
  229. package/programs/globe-util/is-globe-moved.js +27 -19
  230. package/programs/globeshell/index.js +2 -2
  231. package/programs/globeshell/wiggle/index.js +3 -2
  232. package/programs/globeshell/wiggle/logic.js +272 -243
  233. package/programs/globeshell/wiggle/object.js +93 -66
  234. package/programs/helpers/blender/index.js +0 -1
  235. package/programs/helpers/blender/program.js +73 -58
  236. package/programs/helpers/fadeaway/index.js +3 -2
  237. package/programs/helpers/fadeaway/logic.js +53 -46
  238. package/programs/helpers/fadeaway/object.js +20 -14
  239. package/programs/helpers/index.js +2 -2
  240. package/programs/index.js +21 -9
  241. package/programs/line-on-globe/circle-accurate-3d.js +115 -87
  242. package/programs/line-on-globe/circle-accurate-flat.js +201 -149
  243. package/programs/line-on-globe/degree-padding-around-circle-3d.js +136 -104
  244. package/programs/line-on-globe/index.js +0 -1
  245. package/programs/line-on-globe/lines-color-instanced-flat.js +102 -83
  246. package/programs/line-on-globe/linestrip/data.ts +29 -0
  247. package/programs/line-on-globe/linestrip/linestrip.ts +201 -0
  248. package/programs/line-on-globe/naive-accurate-flexible.ts +258 -0
  249. package/programs/line-on-globe/util.js +8 -5
  250. package/programs/picking/pickable-polygon-renderer.js +215 -0
  251. package/programs/picking/pickable-renderer.js +129 -98
  252. package/programs/point-on-globe/element-globe-surface-glow.js +122 -93
  253. package/programs/point-on-globe/element-point-glow.js +114 -80
  254. package/programs/point-on-globe/square-pixel-point.js +138 -120
  255. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin.ts +120 -0
  256. package/programs/polygon-on-globe/texture-dem-triangles.ts +207 -0
  257. package/programs/programcache.ts +131 -0
  258. package/programs/rings/distancering/circleflatprogram.js +138 -116
  259. package/programs/rings/distancering/circlepaddingfreeangleprogram.js +323 -275
  260. package/programs/rings/distancering/circlepaddysharedbuffer.js +423 -368
  261. package/programs/rings/distancering/index.js +5 -6
  262. package/programs/rings/distancering/paddyflatprogram.js +148 -127
  263. package/programs/rings/distancering/paddyflatprogram2d.js +153 -129
  264. package/programs/rings/distancering/paddyflatprogram3d.js +149 -128
  265. package/programs/rings/index.js +1 -1
  266. package/programs/rings/partial-ring/piece-of-pie.ts +323 -0
  267. package/programs/totems/camerauniformblock.ts +310 -0
  268. package/programs/totems/canvas-webglobe-info.ts +156 -0
  269. package/programs/totems/globe-changes.ts +79 -0
  270. package/programs/totems/gpu-selection-uniform-block.js +127 -99
  271. package/programs/totems/index.ts +2 -0
  272. package/programs/two-d/pixel-circle.js +0 -1
  273. package/programs/two-d/pixel-padding-for-compass.js +112 -97
  274. package/programs/util.js +19 -14
  275. package/programs/vectorfields/index.js +3 -3
  276. package/programs/vectorfields/logics/constants.ts +5 -0
  277. package/programs/vectorfields/logics/drawrectangleparticles.js +78 -58
  278. package/programs/vectorfields/logics/index.js +4 -2
  279. package/programs/vectorfields/logics/pixelbased.js +92 -73
  280. package/programs/vectorfields/logics/ubo-new.ts +37 -0
  281. package/programs/vectorfields/logics/ubo.js +57 -51
  282. package/programs/vectorfields/pingpongbuffermanager.js +80 -73
  283. package/publish.bat +62 -0
  284. package/range-tools-on-terrain/bearing-line/adapters.ts +154 -0
  285. package/range-tools-on-terrain/bearing-line/plugin.ts +569 -0
  286. package/range-tools-on-terrain/bearing-line/types.ts +65 -0
  287. package/range-tools-on-terrain/circle-line-chain/adapters.ts +109 -0
  288. package/range-tools-on-terrain/circle-line-chain/chain-list-map.ts +446 -0
  289. package/range-tools-on-terrain/circle-line-chain/plugin.ts +607 -0
  290. package/range-tools-on-terrain/circle-line-chain/types.ts +43 -0
  291. package/range-tools-on-terrain/range-ring/adapters.ts +114 -0
  292. package/range-tools-on-terrain/range-ring/enum.ts +2 -0
  293. package/range-tools-on-terrain/range-ring/plugin.ts +447 -0
  294. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +396 -0
  295. package/range-tools-on-terrain/range-ring/types.ts +30 -0
  296. package/rangerings/enum.ts +2 -0
  297. package/rangerings/index.js +5 -5
  298. package/rangerings/plugin.js +644 -543
  299. package/rangerings/rangeringangletext.js +369 -326
  300. package/rangerings/ring-account.js +129 -112
  301. package/semiplugins/interface.ts +14 -0
  302. package/semiplugins/lightweight/line-plugin.ts +343 -0
  303. package/semiplugins/lightweight/piece-of-pie-plugin.ts +275 -0
  304. package/semiplugins/shape-on-terrain/arc-plugin.ts +602 -0
  305. package/semiplugins/shape-on-terrain/circle-plugin.ts +588 -0
  306. package/semiplugins/shape-on-terrain/goal.md +12 -0
  307. package/semiplugins/shape-on-terrain/padding-1-degree.ts +714 -0
  308. package/semiplugins/shape-on-terrain/terrain-cover/notes.md +90 -0
  309. package/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.ts +0 -0
  310. package/semiplugins/type.ts +8 -0
  311. package/shaders/fragment-toy/firework.js +1 -1
  312. package/shaders/fragment-toy/singularity.js +5 -2
  313. package/tests/Math/arc-sampling-test.js +367 -0
  314. package/tests/Math/arc-sampling-test.ts +429 -0
  315. package/tests/Math/arc.test.ts +102 -0
  316. package/tests/Math/junction/arc-plane.test.ts +163 -0
  317. package/tests/Math/junction/plane-plane.test.ts +91 -0
  318. package/tests/Math/plane-test.ts +17 -0
  319. package/tests/Math/plane.test.ts +43 -0
  320. package/tests/Math/vec3.test.ts +14 -0
  321. package/timetracks/adaptors-line-strip.js +80 -65
  322. package/timetracks/index.js +0 -1
  323. package/timetracks/plugin-line-strip.js +295 -240
  324. package/timetracks/program-line-strip.js +491 -411
  325. package/timetracks/programpoint-line-strip.js +122 -98
  326. package/timetracks/readme.md +1 -0
  327. package/tsconfig.json +22 -0
  328. package/types.ts +265 -0
  329. package/util/account/bufferoffsetmanager.js +209 -176
  330. package/util/account/create-buffermap-orchastration.ts +85 -0
  331. package/util/account/index.js +6 -3
  332. package/util/account/single-attribute-buffer-management/buffer-manager.ts +149 -0
  333. package/util/account/single-attribute-buffer-management/buffer-orchestrator.ts +332 -0
  334. package/util/account/single-attribute-buffer-management/buffer-orchestrator1.ts +184 -0
  335. package/util/account/single-attribute-buffer-management/index.ts +11 -0
  336. package/util/account/single-attribute-buffer-management/object-store.ts +76 -0
  337. package/util/account/single-attribute-buffer-management/types.ts +43 -0
  338. package/util/account/util.js +22 -18
  339. package/util/algorithms/index.js +0 -1
  340. package/util/algorithms/search-binary.js +26 -25
  341. package/util/build-strategy/general-strategy.ts +99 -0
  342. package/util/build-strategy/static-dynamic.ts +50 -0
  343. package/util/check/index.js +0 -1
  344. package/util/check/typecheck.ts +74 -0
  345. package/util/frame-counter-trigger.ts +99 -0
  346. package/util/geometry/index.ts +64 -0
  347. package/util/gl-util/buffer/attribute-loader.ts +84 -0
  348. package/util/gl-util/buffer/index.ts +6 -0
  349. package/util/gl-util/draw-options/methods.ts +47 -0
  350. package/util/gl-util/uniform-block/manager.ts +210 -0
  351. package/util/gl-util/uniform-block/roadmap.md +70 -0
  352. package/util/gl-util/uniform-block/shader.js +0 -1
  353. package/util/gl-util/uniform-block/types.ts +20 -0
  354. package/util/heatwavedatamanager/datamanager.js +168 -149
  355. package/util/heatwavedatamanager/index.js +2 -2
  356. package/util/heatwavedatamanager/pointcoordsmeta.ts +28 -0
  357. package/util/heatwavedatamanager/texture-point-sampler.ts +198 -0
  358. package/util/index.js +13 -13
  359. package/util/interpolation/index.js +0 -1
  360. package/util/interpolation/timetrack/index.js +9 -2
  361. package/util/interpolation/timetrack/timetrack-interpolator.js +94 -79
  362. package/util/interpolation/timetrack/web-worker.js +51 -46
  363. package/util/jshelpers/data-filler.js +19 -17
  364. package/util/jshelpers/equality.js +17 -18
  365. package/util/jshelpers/index.js +1 -2
  366. package/util/jshelpers/timefilters.js +32 -30
  367. package/util/picking/fence.js +46 -43
  368. package/util/picking/picker-displayer.js +177 -136
  369. package/util/programs/draw-texture-on-canvas.js +82 -66
  370. package/util/programs/index.js +1 -1
  371. package/util/programs/shapesonglobe.js +203 -167
  372. package/util/programs/supersampletotextures.js +132 -99
  373. package/util/programs/texturetoglobe.js +152 -128
  374. package/util/shaderfunctions/geometrytransformations.ts +388 -0
  375. package/util/shaderfunctions/index.js +2 -2
  376. package/util/shaderfunctions/nodata.js +4 -2
  377. package/util/shaderfunctions/noisefunctions.js +10 -7
  378. package/util/surface-line-data/arc-bboxes.ts +42 -0
  379. package/util/surface-line-data/arcs-to-cuts.js +74 -50
  380. package/util/surface-line-data/cut-arc.js +0 -1
  381. package/util/surface-line-data/flow.ts +52 -0
  382. package/util/surface-line-data/rbush-manager.js +0 -1
  383. package/util/surface-line-data/types.ts +27 -0
  384. package/util/surface-line-data/web-worker.js +0 -1
  385. package/util/webglobe/gldefaultstates.js +5 -4
  386. package/util/webglobe/index.js +2 -2
  387. package/util/webglobe/rasteroverlay.js +96 -75
  388. package/util/webglobjectbuilders.ts +446 -0
  389. package/waveparticles/adaptor.js +16 -15
  390. package/waveparticles/index.js +3 -3
  391. package/waveparticles/plugin.js +342 -290
  392. package/wind/imagetovectorfieldandmagnitude.js +71 -56
  393. package/wind/index.js +5 -5
  394. package/wind/plugin.js +845 -670
  395. package/wind/vectorfieldimage.js +27 -23
  396. package/write-text/attached-text-writer.js +105 -87
  397. package/write-text/context-text-bulk.ts +268 -0
  398. package/write-text/context-text.js +125 -94
  399. package/write-text/context-text3.ts +253 -0
  400. package/write-text/context-text3old.js +179 -152
  401. package/write-text/context-text4.ts +243 -0
  402. package/write-text/index.js +1 -1
  403. package/write-text/writer-plugin.js +7 -8
  404. package/Math/frustum/camera.js +0 -24
  405. package/Math/frustum/from-globeinfo.js +0 -48
  406. package/util/account/single-attribute-buffer-management/types.js +0 -1
  407. /package/{Math → dist/Math}/arc-cdf-points.js +0 -0
  408. /package/{Math → dist/Math}/arc-generate-points-exponantial.js +0 -0
  409. /package/{Math → dist/Math}/arc.js +0 -0
  410. /package/{Math → dist/Math}/circle-cdf-points.js +0 -0
  411. /package/{Math → dist/Math}/circle.js +0 -0
  412. /package/{Math → dist/Math}/constants.js +0 -0
  413. /package/{Math/matrix4.js → dist/Math/index.js} +0 -0
  414. /package/{Math → dist/Math}/juction/arc-plane.js +0 -0
  415. /package/{Math → dist/Math}/juction/line-sphere.js +0 -0
  416. /package/{Math → dist/Math}/juction/plane-plane.js +0 -0
  417. /package/{Math → dist/Math}/line.js +0 -0
  418. /package/{util/surface-line-data/types.js → dist/Math/matrix4.js} +0 -0
  419. /package/{Math → dist/Math}/methods.js +0 -0
  420. /package/{Math → dist/Math}/plane.js +0 -0
  421. /package/{Math → dist/Math}/quaternion.js +0 -0
  422. /package/{Math → dist/Math}/templete-shapes/grid-visually-equal.js +0 -0
  423. /package/{Math/frustum → dist/Math}/types.js +0 -0
  424. /package/{Math → dist/Math}/vec3.js +0 -0
  425. /package/{programs → dist/programs}/line-on-globe/linestrip/data.js +0 -0
  426. /package/{programs → dist/programs}/line-on-globe/linestrip/linestrip.js +0 -0
  427. /package/{programs → dist/programs}/line-on-globe/naive-accurate-flexible.js +0 -0
  428. /package/{programs → dist/programs}/programcache.js +0 -0
  429. /package/{programs → dist/programs}/rings/partial-ring/piece-of-pie.js +0 -0
  430. /package/{programs → dist/programs}/totems/camerauniformblock.js +0 -0
  431. /package/{programs → dist/programs}/totems/canvas-webglobe-info.js +0 -0
  432. /package/{programs → dist/programs}/totems/globe-changes.js +0 -0
  433. /package/{programs → dist/programs}/totems/index.js +0 -0
  434. /package/{programs → dist/programs}/vectorfields/logics/constants.js +0 -0
  435. /package/{programs → dist/programs}/vectorfields/logics/ubo-new.js +0 -0
  436. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/bearing-line/adapters.js +0 -0
  437. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/bearing-line/plugin.js +0 -0
  438. /package/{Math → dist/range-tools-on-terrain/bearing-line}/types.js +0 -0
  439. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/circle-line-chain/adapters.js +0 -0
  440. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/circle-line-chain/chain-list-map.js +0 -0
  441. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/circle-line-chain/plugin.js +0 -0
  442. /package/{range-tools-on-terrain/bearing-line → dist/range-tools-on-terrain/circle-line-chain}/types.js +0 -0
  443. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/range-ring/adapters.js +0 -0
  444. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/range-ring/enum.js +0 -0
  445. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/range-ring/plugin.js +0 -0
  446. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/range-ring/rangeringangletext.js +0 -0
  447. /package/{range-tools-on-terrain → dist/range-tools-on-terrain}/range-ring/types.js +0 -0
  448. /package/{rangerings → dist/rangerings}/enum.js +0 -0
  449. /package/{semiplugins → dist/semiplugins}/interface.js +0 -0
  450. /package/{semiplugins → dist/semiplugins}/lightweight/line-plugin.js +0 -0
  451. /package/{semiplugins → dist/semiplugins}/lightweight/piece-of-pie-plugin.js +0 -0
  452. /package/{semiplugins → dist/semiplugins}/shape-on-terrain/arc-plugin.js +0 -0
  453. /package/{semiplugins → dist/semiplugins}/shape-on-terrain/circle-plugin.js +0 -0
  454. /package/{semiplugins → dist/semiplugins}/shape-on-terrain/padding-1-degree.js +0 -0
  455. /package/{semiplugins → dist/semiplugins}/type.js +0 -0
  456. /package/{types.js → dist/types.js} +0 -0
  457. /package/{util → dist/util}/account/create-buffermap-orchastration.js +0 -0
  458. /package/{util → dist/util}/account/single-attribute-buffer-management/buffer-manager.js +0 -0
  459. /package/{util → dist/util}/account/single-attribute-buffer-management/buffer-orchestrator.js +0 -0
  460. /package/{util → dist/util}/account/single-attribute-buffer-management/buffer-orchestrator1.js +0 -0
  461. /package/{util → dist/util}/account/single-attribute-buffer-management/index.js +0 -0
  462. /package/{util → dist/util}/account/single-attribute-buffer-management/object-store.js +0 -0
  463. /package/{range-tools-on-terrain/circle-line-chain → dist/util/account/single-attribute-buffer-management}/types.js +0 -0
  464. /package/{util → dist/util}/build-strategy/general-strategy.js +0 -0
  465. /package/{util → dist/util}/build-strategy/static-dynamic.js +0 -0
  466. /package/{util → dist/util}/check/typecheck.js +0 -0
  467. /package/{util → dist/util}/frame-counter-trigger.js +0 -0
  468. /package/{util → dist/util}/geometry/index.js +0 -0
  469. /package/{util → dist/util}/gl-util/buffer/attribute-loader.js +0 -0
  470. /package/{util → dist/util}/gl-util/buffer/index.js +0 -0
  471. /package/{util → dist/util}/gl-util/draw-options/methods.js +0 -0
  472. /package/{util → dist/util}/gl-util/uniform-block/manager.js +0 -0
  473. /package/{util → dist/util}/gl-util/uniform-block/types.js +0 -0
  474. /package/{util → dist/util}/heatwavedatamanager/pointcoordsmeta.js +0 -0
  475. /package/{util → dist/util}/heatwavedatamanager/texture-point-sampler.js +0 -0
  476. /package/{util → dist/util}/shaderfunctions/geometrytransformations.js +0 -0
  477. /package/{util → dist/util}/surface-line-data/arc-bboxes.js +0 -0
  478. /package/{util → dist/util}/surface-line-data/flow.js +0 -0
  479. /package/{util → dist/util}/webglobjectbuilders.js +0 -0
  480. /package/{write-text → dist/write-text}/context-text3.js +0 -0
  481. /package/{write-text → dist/write-text}/context-text4.js +0 -0
@@ -1,186 +1,225 @@
1
- function isClose(a, b, rtol = 1e-5, atol = 1e-8) {
2
- // JavaScript equivalent of NumPy's isclose
3
- return Math.abs(a - b) <= (atol + rtol * Math.abs(b));
4
- }
5
- function mod(n, m) {
6
- // Proper modulo operation that handles negative numbers
7
- return ((n % m) + m) % m;
8
- }
9
- function calculateInitialBearing(phi1, lambda1, phi2, lambda2) {
10
- // Calculates the initial bearing (forward azimuth) from point 1 to point 2
11
- if (isClose(Math.cos(phi1), 0)) { // Starting from a pole
12
- if (phi1 > 0) { // North pole
13
- return Math.PI; // Bearing is South
14
- }
15
- else { // South pole
16
- return 0; // Bearing is North
17
- }
18
- }
19
- const deltaLambda = lambda2 - lambda1;
20
- const y = Math.sin(deltaLambda) * Math.cos(phi2);
21
- const x = Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(deltaLambda);
22
- const theta = Math.atan2(y, x);
23
- return theta;
24
- }
25
- function getGreatCircleArcBBox(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad) {
26
- // Calculates the bounding box around the great circle arc between two points
27
- // on a spherical surface, handling edge cases like poles and antimeridian crossing.
28
- // Args: Latitudes and longitudes in radians
29
- // Returns: [phiMin, phiMax, lambdaMin, lambdaMax] in radians
30
- // === Edge Case: Same Points ===
31
- if (isClose(phi1Rad, phi2Rad) && isClose(lambda1Rad, lambda2Rad)) {
32
- return [phi1Rad, phi1Rad, lambda1Rad, lambda1Rad];
33
- }
34
- // === Edge Case: Antipodal Points ===
35
- const deltaLambdaNorm = mod(lambda1Rad - lambda2Rad + Math.PI, 2 * Math.PI) - Math.PI;
36
- if (isClose(phi1Rad, -phi2Rad) && isClose(Math.abs(deltaLambdaNorm), Math.PI)) {
37
- // Path covers all longitudes and passes through poles
38
- return [-Math.PI / 2, Math.PI / 2, -Math.PI, Math.PI];
39
- }
40
- // === Longitude Bounds ===
41
- let lambda1Adj = lambda1Rad;
42
- let lambda2Adj = lambda2Rad;
43
- // Handle antimeridian crossing
44
- let deltaLambda = lambda2Rad - lambda1Rad;
45
- if (deltaLambda > Math.PI) {
46
- deltaLambda -= 2 * Math.PI;
47
- }
48
- else if (deltaLambda <= -Math.PI) {
49
- deltaLambda += 2 * Math.PI;
50
- }
51
- const crossesAntimeridian = Math.abs(lambda2Rad - lambda1Rad) > Math.PI;
52
- if (crossesAntimeridian) {
53
- // Add 2*pi to the smaller longitude
54
- if (lambda1Rad < lambda2Rad) {
55
- lambda1Adj += 2 * Math.PI;
56
- }
57
- else {
58
- lambda2Adj += 2 * Math.PI;
59
- }
60
- }
61
- const lambdaMin = Math.min(lambda1Adj, lambda2Adj);
62
- const lambdaMax = Math.max(lambda1Adj, lambda2Adj);
63
- // === Latitude Bounds ===
64
- let phiMin = Math.min(phi1Rad, phi2Rad);
65
- let phiMax = Math.max(phi1Rad, phi2Rad);
66
- // === Vertex Check ===
67
- // Check the maximum/minimum latitude reached by the great circle
68
- const theta12 = calculateInitialBearing(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad);
69
- const theta21 = calculateInitialBearing(phi2Rad, lambda2Rad, phi1Rad, lambda1Rad);
70
- const cosPhi1 = Math.cos(phi1Rad);
71
- if (!isClose(cosPhi1, 0)) { // Starting point is not a pole
72
- // Compute the absolute latitude of the vertex
73
- const argAcos = Math.abs(Math.sin(theta12) * cosPhi1);
74
- const phiVtxAbs = Math.acos(Math.min(Math.max(argAcos, -1.0), 1.0));
75
- // Check if the path crosses the northern vertex
76
- if (isClose(theta12, 0) && phiVtxAbs > phiMax) { // Starting due north
77
- phiMax = phiVtxAbs;
78
- }
79
- else if (isClose(Math.abs(theta12), Math.PI) && -phiVtxAbs < phiMin) { // Starting due south
80
- phiMin = -phiVtxAbs;
81
- }
82
- else {
83
- // General case: Check if the path crosses the vertex
84
- const finalBearingAtP2 = mod(theta21 + Math.PI + Math.PI, 2 * Math.PI) - Math.PI;
85
- // Northern vertex check
86
- if ((-Math.PI / 2 < theta12 && theta12 < Math.PI / 2) &&
87
- !(finalBearingAtP2 >= -Math.PI / 2 && finalBearingAtP2 <= Math.PI / 2)) {
88
- if (phiVtxAbs > phiMax) {
89
- phiMax = phiVtxAbs;
90
- }
91
- }
92
- // Southern vertex check
93
- if (!(theta12 >= -Math.PI / 2 && theta12 <= Math.PI / 2) &&
94
- (-Math.PI / 2 < finalBearingAtP2 && finalBearingAtP2 < Math.PI / 2)) {
95
- if (-phiVtxAbs < phiMin) {
96
- phiMin = -phiVtxAbs;
97
- }
98
- }
99
- }
100
- }
101
- return [phiMin, phiMax, lambdaMin, lambdaMax];
102
- }
103
- // --- Example Usage ---
104
- function degreesToRadians(deg) {
105
- return deg * Math.PI / 180;
106
- }
107
- function radiansToDegrees(rad) {
108
- return rad * 180 / Math.PI;
109
- }
110
- export { getGreatCircleArcBBox };
111
- // Test Case 1: London to Tokyo
112
- const lat1Deg = 51.5, lon1Deg = -0.1;
113
- const lat2Deg = 35.7, lon2Deg = 139.7;
114
- const phi1 = degreesToRadians(lat1Deg);
115
- const lambda1 = degreesToRadians(lon1Deg);
116
- const phi2 = degreesToRadians(lat2Deg);
117
- const lambda2 = degreesToRadians(lon2Deg);
118
- const [phiMinRad, phiMaxRad, lambdaMinRad, lambdaMaxRad] = getGreatCircleArcBBox(phi1, lambda1, phi2, lambda2);
119
- const phiMinDeg = radiansToDegrees(phiMinRad);
120
- const phiMaxDeg = radiansToDegrees(phiMaxRad);
121
- const lambdaMinDeg = radiansToDegrees(lambdaMinRad);
122
- const lambdaMaxDeg = radiansToDegrees(lambdaMaxRad);
123
- console.log("Input Points (Radians):");
124
- console.log(` P1: Latitude=${lat1Deg}, Longitude=${lon1Deg}`);
125
- console.log(` P2: Latitude=${lat2Deg}, Longitude=${lon2Deg}`);
126
- console.log(` P1: Latitude=${phi1.toFixed(4)}, Longitude=${lambda1.toFixed(4)}`);
127
- console.log(` P2: Latitude=${phi2.toFixed(4)}, Longitude=${lambda2.toFixed(4)}`);
128
- console.log("-".repeat(20));
129
- console.log("Bounding Box (Radians):");
130
- // console phys://console.log(` Minimum Latitude (phi_min): ${phiMinRad.toFixed(4)}`);
131
- console.log(` Maximum Latitude (phi_max): ${phiMaxRad.toFixed(4)}`);
132
- console.log(` Minimum Longitude (lambda_min): ${lambdaMinRad.toFixed(4)}`);
133
- console.log(` Maximum Longitude (lambda_max): ${lambdaMaxRad.toFixed(4)}`);
134
- console.log("-".repeat(20));
135
- console.log("Bounding Box (Degrees):");
136
- console.log(` Minimum Latitude: ${phiMinDeg.toFixed(2)}°`);
137
- console.log(` Maximum Latitude: ${phiMaxDeg.toFixed(2)}°`);
138
- console.log(` Minimum Longitude: ${lambdaMinDeg.toFixed(2)}°`);
139
- console.log(` Maximum Longitude: ${lambdaMaxDeg.toFixed(2)}°`);
140
- // --- Antimeridian Crossing Test ---
141
- console.log("\n" + "=".repeat(30));
142
- console.log("Antimeridian Crossing Test");
143
- const lat1DegAm = -18, lon1DegAm = 178;
144
- const lat2DegAm = -14, lon2DegAm = -172;
145
- const phi1Am = degreesToRadians(lat1DegAm);
146
- const lambda1Am = degreesToRadians(lon1DegAm);
147
- const phi2Am = degreesToRadians(lat2DegAm);
148
- const lambda2Am = degreesToRadians(lon2DegAm);
149
- const [phiMinRadAm, phiMaxRadAm, lambdaMinRadAm, lambdaMaxRadAm] = getGreatCircleArcBBox(phi1Am, lambda1Am, phi2Am, lambda2Am);
150
- const phiMinDegAm = radiansToDegrees(phiMinRadAm);
151
- const phiMaxDegAm = radiansToDegrees(phiMaxRadAm);
152
- const lambdaMinDegAm = radiansToDegrees(lambdaMinRadAm);
153
- const lambdaMaxDegAm = radiansToDegrees(lambdaMaxRadAm);
154
- console.log(`Input Points (Degrees): P1=(${lat1DegAm}, ${lon1DegAm}), P2=(${lat2DegAm}, ${lon2DegAm})`);
155
- console.log("Bounding Box (Radians):");
156
- console.log(` phi_min=${phiMinRadAm.toFixed(4)}, phi_max=${phiMaxRadAm.toFixed(4)}`);
157
- console.log(` lambda_min=${lambdaMinRadAm.toFixed(4)}, lambda_max=${lambdaMaxRadAm.toFixed(4)}`);
158
- console.log("Bounding Box (Degrees):");
159
- console.log(` Min Latitude: ${phiMinDegAm.toFixed(2)}°`);
160
- console.log(` Max Latitude: ${phiMaxDegAm.toFixed(2)}°`);
161
- console.log(` Min Longitude: ${lambdaMinDegAm.toFixed(2)}° (178° expected)`);
162
- console.log(` Max Longitude: ${lambdaMaxDegAm.toFixed(2)}° (188° expected, which is -172° + 360°)`);
163
- // --- Polar Crossing Test ---
164
- console.log("\n" + "=".repeat(30));
165
- console.log("Polar Crossing Test");
166
- const lat1DegP = 80, lon1DegP = 20;
167
- const lat2DegP = 80, lon2DegP = -100;
168
- const phi1P = degreesToRadians(lat1DegP);
169
- const lambda1P = degreesToRadians(lon1DegP);
170
- const phi2P = degreesToRadians(lat2DegP);
171
- const lambda2P = degreesToRadians(lon2DegP);
172
- const [phiMinRadP, phiMaxRadP, lambdaMinRadP, lambdaMaxRadP] = getGreatCircleArcBBox(phi1P, lambda1P, phi2P, lambda2P);
173
- const phiMinDegP = radiansToDegrees(phiMinRadP);
174
- const phiMaxDegP = radiansToDegrees(phiMaxRadP);
175
- const lambdaMinDegP = radiansToDegrees(lambdaMinRadP);
176
- const lambdaMaxDegP = radiansToDegrees(lambdaMaxRadP);
177
- console.log(`Input Points (Degrees): P1=(${lat1DegP}, ${lon1DegP}), P2=(${lat2DegP}, ${lon2DegP})`);
178
- console.log("Bounding Box (Radians):");
179
- console.log(` phi_min=${phiMinRadP.toFixed(4)}, phi_max=${phiMaxRadP.toFixed(4)}`);
180
- console.log(` lambda_min=${lambdaMinRadP.toFixed(4)}, lambda_max=${lambdaMaxRadP.toFixed(4)}`);
181
- console.log("Bounding Box (Degrees):");
182
- console.log(` Min Latitude: ${phiMinDegP.toFixed(2)}°`);
183
- console.log(` Max Latitude: ${phiMaxDegP.toFixed(2)}° (Should be close to North Pole > 80°)`);
184
- console.log(` Min Longitude: ${lambdaMinDegP.toFixed(2)}°`);
185
- console.log(` Max Longitude: ${lambdaMaxDegP.toFixed(2)}°`);
186
- // --- line points intersection with bbox ---
1
+ function isClose(a, b, rtol = 1e-5, atol = 1e-8) {
2
+ // JavaScript equivalent of NumPy's isclose
3
+ return Math.abs(a - b) <= (atol + rtol * Math.abs(b));
4
+ }
5
+
6
+ function mod(n, m) {
7
+ // Proper modulo operation that handles negative numbers
8
+ return ((n % m) + m) % m;
9
+ }
10
+
11
+ function calculateInitialBearing(phi1, lambda1, phi2, lambda2) {
12
+ // Calculates the initial bearing (forward azimuth) from point 1 to point 2
13
+ if (isClose(Math.cos(phi1), 0)) { // Starting from a pole
14
+ if (phi1 > 0) { // North pole
15
+ return Math.PI; // Bearing is South
16
+ } else { // South pole
17
+ return 0; // Bearing is North
18
+ }
19
+ }
20
+
21
+ const deltaLambda = lambda2 - lambda1;
22
+ const y = Math.sin(deltaLambda) * Math.cos(phi2);
23
+ const x = Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(deltaLambda);
24
+ const theta = Math.atan2(y, x);
25
+ return theta;
26
+ }
27
+
28
+ function getGreatCircleArcBBox(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad) {
29
+ // Calculates the bounding box around the great circle arc between two points
30
+ // on a spherical surface, handling edge cases like poles and antimeridian crossing.
31
+ // Args: Latitudes and longitudes in radians
32
+ // Returns: [phiMin, phiMax, lambdaMin, lambdaMax] in radians
33
+
34
+ // === Edge Case: Same Points ===
35
+ if (isClose(phi1Rad, phi2Rad) && isClose(lambda1Rad, lambda2Rad)) {
36
+ return [phi1Rad, phi1Rad, lambda1Rad, lambda1Rad];
37
+ }
38
+
39
+ // === Edge Case: Antipodal Points ===
40
+ const deltaLambdaNorm = mod(lambda1Rad - lambda2Rad + Math.PI, 2 * Math.PI) - Math.PI;
41
+ if (isClose(phi1Rad, -phi2Rad) && isClose(Math.abs(deltaLambdaNorm), Math.PI)) {
42
+ // Path covers all longitudes and passes through poles
43
+ return [-Math.PI / 2, Math.PI / 2, -Math.PI, Math.PI];
44
+ }
45
+
46
+ // === Longitude Bounds ===
47
+ let lambda1Adj = lambda1Rad;
48
+ let lambda2Adj = lambda2Rad;
49
+
50
+ // Handle antimeridian crossing
51
+ let deltaLambda = lambda2Rad - lambda1Rad;
52
+ if (deltaLambda > Math.PI) {
53
+ deltaLambda -= 2 * Math.PI;
54
+ } else if (deltaLambda <= -Math.PI) {
55
+ deltaLambda += 2 * Math.PI;
56
+ }
57
+
58
+ const crossesAntimeridian = Math.abs(lambda2Rad - lambda1Rad) > Math.PI;
59
+
60
+ if (crossesAntimeridian) {
61
+ // Add 2*pi to the smaller longitude
62
+ if (lambda1Rad < lambda2Rad) {
63
+ lambda1Adj += 2 * Math.PI;
64
+ } else {
65
+ lambda2Adj += 2 * Math.PI;
66
+ }
67
+ }
68
+
69
+ const lambdaMin = Math.min(lambda1Adj, lambda2Adj);
70
+ const lambdaMax = Math.max(lambda1Adj, lambda2Adj);
71
+
72
+ // === Latitude Bounds ===
73
+ let phiMin = Math.min(phi1Rad, phi2Rad);
74
+ let phiMax = Math.max(phi1Rad, phi2Rad);
75
+
76
+ // === Vertex Check ===
77
+ // Check the maximum/minimum latitude reached by the great circle
78
+ const theta12 = calculateInitialBearing(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad);
79
+ const theta21 = calculateInitialBearing(phi2Rad, lambda2Rad, phi1Rad, lambda1Rad);
80
+
81
+ const cosPhi1 = Math.cos(phi1Rad);
82
+ if (!isClose(cosPhi1, 0)) { // Starting point is not a pole
83
+ // Compute the absolute latitude of the vertex
84
+ const argAcos = Math.abs(Math.sin(theta12) * cosPhi1);
85
+ const phiVtxAbs = Math.acos(Math.min(Math.max(argAcos, -1.0), 1.0));
86
+
87
+ // Check if the path crosses the northern vertex
88
+ if (isClose(theta12, 0) && phiVtxAbs > phiMax) { // Starting due north
89
+ phiMax = phiVtxAbs;
90
+ } else if (isClose(Math.abs(theta12), Math.PI) && -phiVtxAbs < phiMin) { // Starting due south
91
+ phiMin = -phiVtxAbs;
92
+ } else {
93
+ // General case: Check if the path crosses the vertex
94
+ const finalBearingAtP2 = mod(theta21 + Math.PI + Math.PI, 2 * Math.PI) - Math.PI;
95
+
96
+ // Northern vertex check
97
+ if ((-Math.PI / 2 < theta12 && theta12 < Math.PI / 2) &&
98
+ !(finalBearingAtP2 >= -Math.PI / 2 && finalBearingAtP2 <= Math.PI / 2)) {
99
+ if (phiVtxAbs > phiMax) {
100
+ phiMax = phiVtxAbs;
101
+ }
102
+ }
103
+
104
+ // Southern vertex check
105
+ if (!(theta12 >= -Math.PI / 2 && theta12 <= Math.PI / 2) &&
106
+ (-Math.PI / 2 < finalBearingAtP2 && finalBearingAtP2 < Math.PI / 2)) {
107
+ if (-phiVtxAbs < phiMin) {
108
+ phiMin = -phiVtxAbs;
109
+ }
110
+ }
111
+ }
112
+ }
113
+
114
+ return [phiMin, phiMax, lambdaMin, lambdaMax];
115
+ }
116
+
117
+
118
+
119
+
120
+ // --- Example Usage ---
121
+ function degreesToRadians(deg) {
122
+ return deg * Math.PI / 180;
123
+ }
124
+
125
+ function radiansToDegrees(rad) {
126
+ return rad * 180 / Math.PI;
127
+ }
128
+
129
+
130
+ export { getGreatCircleArcBBox };
131
+
132
+ // Test Case 1: London to Tokyo
133
+ const lat1Deg = 51.5, lon1Deg = -0.1;
134
+ const lat2Deg = 35.7, lon2Deg = 139.7;
135
+
136
+ const phi1 = degreesToRadians(lat1Deg);
137
+ const lambda1 = degreesToRadians(lon1Deg);
138
+ const phi2 = degreesToRadians(lat2Deg);
139
+ const lambda2 = degreesToRadians(lon2Deg);
140
+
141
+ const [phiMinRad, phiMaxRad, lambdaMinRad, lambdaMaxRad] = getGreatCircleArcBBox(phi1, lambda1, phi2, lambda2);
142
+
143
+ const phiMinDeg = radiansToDegrees(phiMinRad);
144
+ const phiMaxDeg = radiansToDegrees(phiMaxRad);
145
+ const lambdaMinDeg = radiansToDegrees(lambdaMinRad);
146
+ const lambdaMaxDeg = radiansToDegrees(lambdaMaxRad);
147
+
148
+ console.log("Input Points (Radians):");
149
+ console.log(` P1: Latitude=${lat1Deg}, Longitude=${lon1Deg}`);
150
+ console.log(` P2: Latitude=${lat2Deg}, Longitude=${lon2Deg}`);
151
+ console.log(` P1: Latitude=${phi1.toFixed(4)}, Longitude=${lambda1.toFixed(4)}`);
152
+ console.log(` P2: Latitude=${phi2.toFixed(4)}, Longitude=${lambda2.toFixed(4)}`);
153
+ console.log("-".repeat(20));
154
+ console.log("Bounding Box (Radians):");
155
+ // console phys://console.log(` Minimum Latitude (phi_min): ${phiMinRad.toFixed(4)}`);
156
+ console.log(` Maximum Latitude (phi_max): ${phiMaxRad.toFixed(4)}`);
157
+ console.log(` Minimum Longitude (lambda_min): ${lambdaMinRad.toFixed(4)}`);
158
+ console.log(` Maximum Longitude (lambda_max): ${lambdaMaxRad.toFixed(4)}`);
159
+ console.log("-".repeat(20));
160
+ console.log("Bounding Box (Degrees):");
161
+ console.log(` Minimum Latitude: ${phiMinDeg.toFixed(2)}°`);
162
+ console.log(` Maximum Latitude: ${phiMaxDeg.toFixed(2)}°`);
163
+ console.log(` Minimum Longitude: ${lambdaMinDeg.toFixed(2)}°`);
164
+ console.log(` Maximum Longitude: ${lambdaMaxDeg.toFixed(2)}°`);
165
+
166
+ // --- Antimeridian Crossing Test ---
167
+ console.log("\n" + "=".repeat(30));
168
+ console.log("Antimeridian Crossing Test");
169
+ const lat1DegAm = -18, lon1DegAm = 178;
170
+ const lat2DegAm = -14, lon2DegAm = -172;
171
+
172
+ const phi1Am = degreesToRadians(lat1DegAm);
173
+ const lambda1Am = degreesToRadians(lon1DegAm);
174
+ const phi2Am = degreesToRadians(lat2DegAm);
175
+ const lambda2Am = degreesToRadians(lon2DegAm);
176
+
177
+ const [phiMinRadAm, phiMaxRadAm, lambdaMinRadAm, lambdaMaxRadAm] = getGreatCircleArcBBox(phi1Am, lambda1Am, phi2Am, lambda2Am);
178
+
179
+ const phiMinDegAm = radiansToDegrees(phiMinRadAm);
180
+ const phiMaxDegAm = radiansToDegrees(phiMaxRadAm);
181
+ const lambdaMinDegAm = radiansToDegrees(lambdaMinRadAm);
182
+ const lambdaMaxDegAm = radiansToDegrees(lambdaMaxRadAm);
183
+
184
+ console.log(`Input Points (Degrees): P1=(${lat1DegAm}, ${lon1DegAm}), P2=(${lat2DegAm}, ${lon2DegAm})`);
185
+ console.log("Bounding Box (Radians):");
186
+ console.log(` phi_min=${phiMinRadAm.toFixed(4)}, phi_max=${phiMaxRadAm.toFixed(4)}`);
187
+ console.log(` lambda_min=${lambdaMinRadAm.toFixed(4)}, lambda_max=${lambdaMaxRadAm.toFixed(4)}`);
188
+ console.log("Bounding Box (Degrees):");
189
+ console.log(` Min Latitude: ${phiMinDegAm.toFixed(2)}°`);
190
+ console.log(` Max Latitude: ${phiMaxDegAm.toFixed(2)}°`);
191
+ console.log(` Min Longitude: ${lambdaMinDegAm.toFixed(2)}° (178° expected)`);
192
+ console.log(` Max Longitude: ${lambdaMaxDegAm.toFixed(2)}° (188° expected, which is -172° + 360°)`);
193
+
194
+ // --- Polar Crossing Test ---
195
+ console.log("\n" + "=".repeat(30));
196
+ console.log("Polar Crossing Test");
197
+ const lat1DegP = 80, lon1DegP = 20;
198
+ const lat2DegP = 80, lon2DegP = -100;
199
+
200
+ const phi1P = degreesToRadians(lat1DegP);
201
+ const lambda1P = degreesToRadians(lon1DegP);
202
+ const phi2P = degreesToRadians(lat2DegP);
203
+ const lambda2P = degreesToRadians(lon2DegP);
204
+
205
+ const [phiMinRadP, phiMaxRadP, lambdaMinRadP, lambdaMaxRadP] = getGreatCircleArcBBox(phi1P, lambda1P, phi2P, lambda2P);
206
+
207
+ const phiMinDegP = radiansToDegrees(phiMinRadP);
208
+ const phiMaxDegP = radiansToDegrees(phiMaxRadP);
209
+ const lambdaMinDegP = radiansToDegrees(lambdaMinRadP);
210
+ const lambdaMaxDegP = radiansToDegrees(lambdaMaxRadP);
211
+
212
+ console.log(`Input Points (Degrees): P1=(${lat1DegP}, ${lon1DegP}), P2=(${lat2DegP}, ${lon2DegP})`);
213
+ console.log("Bounding Box (Radians):");
214
+ console.log(` phi_min=${phiMinRadP.toFixed(4)}, phi_max=${phiMaxRadP.toFixed(4)}`);
215
+ console.log(` lambda_min=${lambdaMinRadP.toFixed(4)}, lambda_max=${lambdaMaxRadP.toFixed(4)}`);
216
+ console.log("Bounding Box (Degrees):");
217
+ console.log(` Min Latitude: ${phiMinDegP.toFixed(2)}°`);
218
+ console.log(` Max Latitude: ${phiMaxDegP.toFixed(2)}° (Should be close to North Pole > 80°)`);
219
+ console.log(` Min Longitude: ${lambdaMinDegP.toFixed(2)}°`);
220
+ console.log(` Max Longitude: ${lambdaMaxDegP.toFixed(2)}°`);
221
+
222
+
223
+
224
+ // --- line points intersection with bbox ---
225
+
@@ -0,0 +1,143 @@
1
+ import { Globe, CentigradeDegree } from "../types";
2
+ import { RADIANS } from "./methods";
3
+ import { Meter } from "./types";
4
+
5
+
6
+
7
+ function createCummulativeTemplate(
8
+ numberOfPoints: number,
9
+ strength: number,
10
+ denseRatio: number = 0.5 // Ratio of points to be densely packed at the start.
11
+
12
+ ): Float64Array {
13
+ // Handle edge cases for the number of points.
14
+ if (numberOfPoints <= 0) {
15
+ // If zero or a negative number of points is requested, return an empty array.
16
+ return new Float64Array([]);
17
+ }
18
+
19
+ // Create the array to hold the results. Float64Array is used for high-precision floating-point numbers.
20
+ const distribution = new Float64Array(numberOfPoints);
21
+
22
+ if (numberOfPoints === 1) {
23
+ // If only one point is requested, it represents the entire range [0, 1].
24
+ // We place it at the start (0.0).
25
+ distribution[0] = 0.0;
26
+ return distribution;
27
+ }
28
+
29
+ // The exponent determines the curve of the distribution.
30
+ // We add 1 to the strength so that a strength of 0 results in an exponent of 1 (linear).
31
+ // We use Math.max(0, strength) to ensure the strength is not negative.
32
+
33
+
34
+ // The last index is used to normalize the position to a 0-1 range.
35
+ const lastIndex = numberOfPoints - 1;
36
+ distribution[0] = 0.0; // The first point is always at 0.0.
37
+ let totalWeight = 0;
38
+ let i = 1
39
+ const denseCount = numberOfPoints * denseRatio;
40
+ for (i; i < denseCount; i++) {
41
+ // Calculate the ratio of the current index to the last index.
42
+ // The ratio is adjusted to create a non-linear distribution.
43
+ totalWeight += 1;
44
+ distribution[i] = totalWeight; // Store the raw value in the distribution array.
45
+ }
46
+
47
+ for (i; i < numberOfPoints; i++) {
48
+ // Calculate the ratio of the current index to the last index.
49
+
50
+ const ratio = 1 + ((i - denseCount) / lastIndex) / (1 - denseRatio) * 2;
51
+ const step = Math.pow(ratio, strength);
52
+
53
+ totalWeight += step;
54
+ distribution[i] = totalWeight; // Store the raw value in the distribution array.
55
+
56
+ // Apply the power function to create a non-linear distribution.
57
+ // The result is normalized to the range [0, 1].
58
+ }
59
+ for (let i = 1; i < numberOfPoints; i++) {
60
+ // Normalize the values to ensure they sum up to 1.
61
+ distribution[i] = distribution[i] / totalWeight;
62
+ }
63
+ return distribution;
64
+ }
65
+
66
+
67
+
68
+ function createCummulativeTemplateStash(
69
+ levels: number,
70
+ numberOfPoints: number,
71
+ denseRatio: number = 0.5,
72
+ strengthMultiplier: number = 2.4,
73
+ ): Float64Array[] {
74
+ const stash: Float64Array[] = [];
75
+ for (let i = 0; i < levels; i++) {
76
+ const template = createCummulativeTemplate(numberOfPoints, i * strengthMultiplier, denseRatio);
77
+ stash.push(template);
78
+ }
79
+ return stash;
80
+ }
81
+
82
+ function globeFindPointByPolar(
83
+ out: number[] | Float64Array,
84
+ globe: Globe,
85
+ centerLong: CentigradeDegree,
86
+ centerLat: CentigradeDegree,
87
+ radius: Meter,
88
+ ratios: number[]) {
89
+ for (let i = 0; i < ratios.length; i++) {
90
+ const point = globe.Math.FindPointByPolar(
91
+ centerLong,
92
+ centerLat,
93
+ radius,
94
+ ratios[i]
95
+ );
96
+ out[i * 2] = point.long;
97
+ out[i * 2 + 1] = point.lat;
98
+ }
99
+ }
100
+
101
+ function globeFindPointByPolarHalfCircle(
102
+ out: Float64Array,
103
+ globe: Globe,
104
+ centerLong: CentigradeDegree,
105
+ centerLat: CentigradeDegree,
106
+ radius: Meter,
107
+ rotation: number,
108
+ ratios: Float64Array) {
109
+
110
+ const rotCentigrade = rotation / RADIANS + 720;
111
+ for (let i = 0; i < ratios.length; i++) {
112
+ const point = globe.Math.FindPointByPolar(
113
+ centerLong,
114
+ centerLat,
115
+ radius,
116
+ (ratios[i] * 180 + rotCentigrade) % 360
117
+ );
118
+ out[i * 2] = point.long;
119
+ out[i * 2 + 1] = point.lat;
120
+ }
121
+ // fill reflection
122
+ let offset = out.length;
123
+ for (let i = 0; i < ratios.length - 1; i++) {
124
+ const point = globe.Math.FindPointByPolar(
125
+ centerLong,
126
+ centerLat,
127
+ radius,
128
+ ((- ratios[i]) * 180 + rotCentigrade) % 360,
129
+ );
130
+
131
+ out[offset - 2] = point.long;
132
+ out[offset - 1] = point.lat;
133
+ offset -= 2;
134
+ }
135
+ }
136
+
137
+
138
+
139
+ export {
140
+ createCummulativeTemplateStash,
141
+ globeFindPointByPolar,
142
+ globeFindPointByPolarHalfCircle
143
+ }
package/Math/circle.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { Circle, CircleClosestAzimuthAngleProperties, LongLat, Plane, Vec3 } from '../Math/types.js';
2
+ import { RADIANS } from './methods';
3
+ import { subtract, normalize, dot, fromLongLatToUnitVector, copy, multiplyScalar, clone, add } from './vec3';
4
+
5
+ const _0vec3: Vec3 = [0, 0, 0];
6
+
7
+ function closestAzimuthAngle(
8
+ circleProperties: CircleClosestAzimuthAngleProperties,
9
+ point: Vec3
10
+ ): number {
11
+ const distance = dot(circleProperties.normal, point);
12
+ copy(_0vec3, circleProperties.normal)
13
+ multiplyScalar(_0vec3, _0vec3, distance);
14
+ subtract(_0vec3, point, _0vec3);
15
+ normalize(_0vec3, _0vec3);
16
+ const N = circleProperties.northPointProjectedToOriginPlaneNormalized
17
+ const _dot = dot(_0vec3, N);
18
+ let angle = Math.acos(_dot);
19
+ const z = (_0vec3[0] * N[1] - _0vec3[1] * N[0]) * circleProperties.normal[2];
20
+ return z < 0 ? -angle : angle;
21
+ }
22
+
23
+
24
+ function createCircleClosestAzimuthAngleProperties(
25
+ circle: Circle,
26
+
27
+ ): CircleClosestAzimuthAngleProperties {
28
+ const normal: Vec3 = Array(3) as Vec3;
29
+ fromLongLatToUnitVector(normal,
30
+ [circle.center[0] * RADIANS, circle.center[1] * RADIANS]);
31
+ const N: Vec3 = clone(normal);
32
+
33
+ const distance = dot([0, 0, 1], normal);
34
+ multiplyScalar(N, N, distance);
35
+ // if (N[2] >= 0) {
36
+ subtract(N, [0, 0, 1], N);
37
+ // } else {
38
+ // subtract(N, [0, 0, -1], N);
39
+ // }
40
+ normalize(N, N);
41
+ return {
42
+ normal: normal,
43
+ northPointProjectedToOriginPlaneNormalized: N,
44
+ };
45
+ }
46
+
47
+
48
+
49
+ export { closestAzimuthAngle, createCircleClosestAzimuthAngleProperties };
@@ -0,0 +1,12 @@
1
+ const WORLD_RADIUS_3D = 6378.137;
2
+ const WORLD_RADIUS_MERCATOR = 6378136.99911;
3
+
4
+ const EPSILON = 1e-10; // Used for floating point comparisons
5
+
6
+ export {
7
+ WORLD_RADIUS_3D,
8
+ WORLD_RADIUS_MERCATOR,
9
+ EPSILON
10
+ }
11
+
12
+
package/Math/index.js CHANGED
@@ -1 +0,0 @@
1
- "use strict";