@pirireis/webglobeplugins 1.0.2 → 1.0.4

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 (277) hide show
  1. package/package.json +2 -2
  2. package/plugins/alarms/alarmFadeInFadeOutPlugin/AlarmTimeLineFadeInFadeOutPlugin.js +399 -0
  3. package/{Math/angle-calculation.ts → webglobeplugins/Math/angle-calculation.js} +14 -18
  4. package/{Math/arc-cdf-points.ts → webglobeplugins/Math/arc-cdf-points.js} +272 -329
  5. package/{Math/arc-generate-points-exponantial.ts → webglobeplugins/Math/arc-generate-points-exponantial.js} +254 -299
  6. package/{Math/arc.ts → webglobeplugins/Math/arc.js} +292 -421
  7. package/{Math → webglobeplugins/Math}/bounds/line-bbox.js +186 -225
  8. package/{Math/circle-cdf-points.ts → webglobeplugins/Math/circle-cdf-points.js} +78 -143
  9. package/{Math/circle.ts → webglobeplugins/Math/circle.js} +33 -49
  10. package/{Math/constants.ts → webglobeplugins/Math/constants.js} +4 -12
  11. package/{Math/contour/quadtreecontours.ts → webglobeplugins/Math/contour/quadtreecontours.js} +300 -371
  12. package/{Math → webglobeplugins/Math}/contour/quadtreecontours1.js +298 -336
  13. package/{Math/finite-line-2d.ts → webglobeplugins/Math/finite-line-2d.js} +58 -68
  14. package/{Math/haversine.ts → webglobeplugins/Math/haversine.js} +22 -33
  15. package/webglobeplugins/Math/index.js +1 -0
  16. package/{Math/juction/arc-plane.ts → webglobeplugins/Math/juction/arc-plane.js} +143 -203
  17. package/{Math/juction/line-sphere.ts → webglobeplugins/Math/juction/line-sphere.js} +22 -32
  18. package/{Math/juction/plane-plane.ts → webglobeplugins/Math/juction/plane-plane.js} +53 -62
  19. package/{Math/line.ts → webglobeplugins/Math/line.js} +52 -84
  20. package/webglobeplugins/Math/matrix4.js +1 -0
  21. package/{Math/methods.ts → webglobeplugins/Math/methods.js} +126 -182
  22. package/{Math/plane.ts → webglobeplugins/Math/plane.js} +56 -92
  23. package/{Math/quaternion.ts → webglobeplugins/Math/quaternion.js} +106 -128
  24. package/{Math/templete-shapes/grid-visually-equal.ts → webglobeplugins/Math/templete-shapes/grid-visually-equal.js} +65 -118
  25. package/webglobeplugins/Math/tessellation/constants.js +1 -0
  26. package/{Math/tessellation/methods.ts → webglobeplugins/Math/tessellation/methods.js} +49 -79
  27. package/{Math/tessellation/nearest-value-padding.ts → webglobeplugins/Math/tessellation/nearest-value-padding.js} +112 -147
  28. package/{Math/tessellation/spherical-triangle-area.ts → webglobeplugins/Math/tessellation/spherical-triangle-area.js} +99 -127
  29. package/{Math/tessellation/tile-merger.ts → webglobeplugins/Math/tessellation/tile-merger.js} +429 -578
  30. package/{Math/tessellation/triangle-tessellation.ts → webglobeplugins/Math/tessellation/triangle-tessellation.js} +464 -533
  31. package/webglobeplugins/Math/tessellation/types.js +1 -0
  32. package/webglobeplugins/Math/types.js +1 -0
  33. package/{Math → webglobeplugins/Math}/utils.js +2 -3
  34. package/{Math/vec3.ts → webglobeplugins/Math/vec3.js} +155 -227
  35. package/{Math/xyz-tile.ts → webglobeplugins/Math/xyz-tile.js} +18 -26
  36. package/{algorithms → webglobeplugins/algorithms}/search-binary.js +16 -14
  37. package/webglobeplugins/altitude-locator/adaptors.js +1 -0
  38. package/webglobeplugins/altitude-locator/keymethod.js +1 -0
  39. package/{altitude-locator → webglobeplugins/altitude-locator}/plugin.js +344 -445
  40. package/{altitude-locator → webglobeplugins/altitude-locator}/types.js +21 -26
  41. package/{compass-rose → webglobeplugins/compass-rose}/compass-rose-padding-flat.js +230 -274
  42. package/{compass-rose/compass-text-writer.ts → webglobeplugins/compass-rose/compass-text-writer.js} +155 -210
  43. package/{compass-rose → webglobeplugins/compass-rose}/index.js +3 -3
  44. package/{constants.ts → webglobeplugins/constants.js} +6 -8
  45. package/{heatwave → webglobeplugins/heatwave}/datamanager.js +149 -168
  46. package/{heatwave → webglobeplugins/heatwave}/heatwave.js +206 -261
  47. package/{heatwave → webglobeplugins/heatwave}/index.js +5 -5
  48. package/{heatwave → webglobeplugins/heatwave}/isobar.js +306 -340
  49. package/{heatwave/texture-point-sampler.ts → webglobeplugins/heatwave/texture-point-sampler.js} +187 -220
  50. package/webglobeplugins/investigation-tools/draw/tiles/adapters.js +67 -0
  51. package/{investigation-tools/draw/tiles/tiles.ts → webglobeplugins/investigation-tools/draw/tiles/tiles.js} +128 -162
  52. package/{jest.config.js → webglobeplugins/jest.config.js} +7 -6
  53. package/{pin → webglobeplugins/pin}/pin-object-array1.js +300 -381
  54. package/{pin → webglobeplugins/pin}/pin-point-totem1.js +60 -77
  55. package/{programs → webglobeplugins/programs}/arrowfield/arrow-field.js +60 -89
  56. package/{programs → webglobeplugins/programs}/arrowfield/logic.js +141 -173
  57. package/{programs → webglobeplugins/programs}/data2legend/density-to-legend.js +68 -86
  58. package/{programs → webglobeplugins/programs}/data2legend/point-to-density-texture.js +67 -84
  59. package/{programs → webglobeplugins/programs}/float2legendwithratio/index.js +2 -3
  60. package/{programs → webglobeplugins/programs}/float2legendwithratio/logic.js +118 -144
  61. package/{programs → webglobeplugins/programs}/float2legendwithratio/object.js +104 -141
  62. package/{programs → webglobeplugins/programs}/helpers/blender.js +58 -73
  63. package/{programs/helpers/fadeaway.ts → webglobeplugins/programs/helpers/fadeaway.js} +60 -73
  64. package/{programs → webglobeplugins/programs}/index.js +20 -19
  65. package/{programs → webglobeplugins/programs}/line-on-globe/circle-accurate-3d.js +85 -112
  66. package/{programs → webglobeplugins/programs}/line-on-globe/circle-accurate-flat.js +148 -200
  67. package/{programs → webglobeplugins/programs}/line-on-globe/degree-padding-around-circle-3d.js +102 -134
  68. package/webglobeplugins/programs/line-on-globe/index.js +1 -0
  69. package/{programs → webglobeplugins/programs}/line-on-globe/lines-color-instanced-flat.js +80 -99
  70. package/webglobeplugins/programs/line-on-globe/linestrip/data.js +4 -0
  71. package/{programs/line-on-globe/linestrip/linestrip.ts → webglobeplugins/programs/line-on-globe/linestrip/linestrip.js} +93 -152
  72. package/{programs/line-on-globe/naive-accurate-flexible.ts → webglobeplugins/programs/line-on-globe/naive-accurate-flexible.js} +126 -175
  73. package/{programs → webglobeplugins/programs}/line-on-globe/util.js +5 -8
  74. package/{programs → webglobeplugins/programs}/picking/pickable-polygon-renderer.js +98 -129
  75. package/{programs → webglobeplugins/programs}/picking/pickable-renderer.js +98 -130
  76. package/{programs → webglobeplugins/programs}/point-on-globe/element-globe-surface-glow.js +93 -122
  77. package/{programs → webglobeplugins/programs}/point-on-globe/element-point-glow.js +80 -114
  78. package/{programs → webglobeplugins/programs}/point-on-globe/square-pixel-point.js +121 -139
  79. package/{programs/polygon-on-globe/texture-dem-triangles.ts → webglobeplugins/programs/polygon-on-globe/texture-dem-triangles.js} +178 -209
  80. package/{programs/programcache.ts → webglobeplugins/programs/programcache.js} +126 -134
  81. package/webglobeplugins/programs/rings/index.js +1 -0
  82. package/{programs/rings/partial-ring/piece-of-pie.ts → webglobeplugins/programs/rings/partial-ring/piece-of-pie.js} +152 -222
  83. package/webglobeplugins/programs/totems/attachments/adaptive-opacity.js +131 -0
  84. package/{programs/totems/dem-textures-manager.ts → webglobeplugins/programs/totems/attachments/dem-textures-manager.js} +263 -360
  85. package/webglobeplugins/programs/totems/camera-totem-attactment-interface.js +1 -0
  86. package/{programs/totems/camerauniformblock.ts → webglobeplugins/programs/totems/camerauniformblock.js} +225 -310
  87. package/{programs/totems/canvas-webglobe-info.ts → webglobeplugins/programs/totems/canvas-webglobe-info.js} +132 -147
  88. package/{programs/totems/globe-changes.ts → webglobeplugins/programs/totems/globe-changes.js} +59 -79
  89. package/{programs → webglobeplugins/programs}/totems/gpu-selection-uniform-block.js +99 -127
  90. package/{programs/totems/index.ts → webglobeplugins/programs/totems/index.js} +2 -2
  91. package/{programs → webglobeplugins/programs}/two-d/pixel-padding-for-compass.js +87 -101
  92. package/{programs → webglobeplugins/programs}/util.js +14 -19
  93. package/{programs/vectorfields/logics/constants.ts → webglobeplugins/programs/vectorfields/logics/constants.js} +4 -5
  94. package/{programs/vectorfields/logics/drawrectangleparticles.ts → webglobeplugins/programs/vectorfields/logics/drawrectangleparticles.js} +107 -136
  95. package/{programs → webglobeplugins/programs}/vectorfields/logics/index.js +2 -4
  96. package/webglobeplugins/programs/vectorfields/logics/particle-ubo.js +19 -0
  97. package/{programs/vectorfields/logics/pixelbased.ts → webglobeplugins/programs/vectorfields/logics/pixelbased.js} +89 -122
  98. package/{programs → webglobeplugins/programs}/vectorfields/logics/ubo.js +51 -57
  99. package/{programs/vectorfields/pingpongbuffermanager.ts → webglobeplugins/programs/vectorfields/pingpongbuffermanager.js} +99 -113
  100. package/{range-tools-on-terrain/bearing-line/adapters.ts → webglobeplugins/range-tools-on-terrain/bearing-line/adapters.js} +114 -154
  101. package/{range-tools-on-terrain/bearing-line/plugin.ts → webglobeplugins/range-tools-on-terrain/bearing-line/plugin.js} +457 -569
  102. package/webglobeplugins/range-tools-on-terrain/bearing-line/types.js +1 -0
  103. package/{range-tools-on-terrain/circle-line-chain/adapters.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/adapters.js} +85 -104
  104. package/{range-tools-on-terrain/circle-line-chain/chain-list-map.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/chain-list-map.js} +382 -446
  105. package/{range-tools-on-terrain/circle-line-chain/plugin.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/plugin.js} +464 -607
  106. package/webglobeplugins/range-tools-on-terrain/circle-line-chain/types.js +1 -0
  107. package/{range-tools-on-terrain/range-ring/adapters.ts → webglobeplugins/range-tools-on-terrain/range-ring/adapters.js} +93 -114
  108. package/{range-tools-on-terrain/range-ring/enum.ts → webglobeplugins/range-tools-on-terrain/range-ring/enum.js} +2 -2
  109. package/{range-tools-on-terrain/range-ring/plugin.ts → webglobeplugins/range-tools-on-terrain/range-ring/plugin.js} +377 -444
  110. package/webglobeplugins/range-tools-on-terrain/range-ring/rangeringangletext.js +331 -0
  111. package/webglobeplugins/range-tools-on-terrain/range-ring/types.js +9 -0
  112. package/webglobeplugins/semiplugins/interface.js +1 -0
  113. package/{semiplugins/lightweight/line-plugin.ts → webglobeplugins/semiplugins/lightweight/line-plugin.js} +221 -342
  114. package/{semiplugins/lightweight/piece-of-pie-plugin.ts → webglobeplugins/semiplugins/lightweight/piece-of-pie-plugin.js} +200 -275
  115. package/{semiplugins/shape-on-terrain/arc-plugin.ts → webglobeplugins/semiplugins/shape-on-terrain/arc-plugin.js} +481 -616
  116. package/{semiplugins/shape-on-terrain/circle-plugin.ts → webglobeplugins/semiplugins/shape-on-terrain/circle-plugin.js} +444 -588
  117. package/{semiplugins/shape-on-terrain/padding-1-degree.ts → webglobeplugins/semiplugins/shape-on-terrain/padding-1-degree.js} +539 -713
  118. package/{semiplugins/shape-on-terrain/terrain-polygon/adapters.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/adapters.js} +55 -69
  119. package/{semiplugins/shape-on-terrain/terrain-polygon/data/cache.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/cache.js} +104 -149
  120. package/{semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.js} +45 -58
  121. package/{semiplugins/shape-on-terrain/terrain-polygon/data/manager.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/manager.js} +4 -4
  122. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +241 -0
  123. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.js +76 -0
  124. package/{semiplugins/shape-on-terrain/terrain-polygon/data/random.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/random.js} +121 -165
  125. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/types.js +1 -0
  126. package/{semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.js} +64 -81
  127. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +162 -0
  128. package/{semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.js} +282 -265
  129. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/test-records.js +14 -0
  130. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/types.js +8 -0
  131. package/webglobeplugins/semiplugins/shell/bbox-renderer/index.js +2 -0
  132. package/{semiplugins/shell/bbox-renderer/logic.ts → webglobeplugins/semiplugins/shell/bbox-renderer/logic.js} +209 -273
  133. package/webglobeplugins/semiplugins/shell/bbox-renderer/object.js +78 -0
  134. package/webglobeplugins/semiplugins/type.js +1 -0
  135. package/{semiplugins/utility/container-plugin.ts → webglobeplugins/semiplugins/utility/container-plugin.js} +94 -126
  136. package/{semiplugins/utility/object-pass-container-plugin.ts → webglobeplugins/semiplugins/utility/object-pass-container-plugin.js} +80 -101
  137. package/{shaders → webglobeplugins/shaders}/fragment-toy/firework.js +1 -1
  138. package/{shaders → webglobeplugins/shaders}/fragment-toy/singularity.js +2 -5
  139. package/{tracks → webglobeplugins/tracks}/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
  140. package/webglobeplugins/tracks/point-heat-map/index.js +1 -0
  141. package/{tracks → webglobeplugins/tracks}/point-heat-map/plugin-webworker.js +121 -148
  142. package/{tracks → webglobeplugins/tracks}/point-heat-map/point-to-heat-map-flow.js +121 -150
  143. package/{tracks → webglobeplugins/tracks}/point-tracks/key-methods.js +2 -3
  144. package/{tracks → webglobeplugins/tracks}/point-tracks/plugin.js +401 -487
  145. package/{tracks → webglobeplugins/tracks}/timetracks/adaptors-line-strip.js +65 -79
  146. package/{tracks → webglobeplugins/tracks}/timetracks/plugin-line-strip.js +240 -295
  147. package/{tracks → webglobeplugins/tracks}/timetracks/program-line-strip.js +413 -495
  148. package/{tracks → webglobeplugins/tracks}/timetracks/programpoint-line-strip.js +109 -137
  149. package/webglobeplugins/types.js +19 -0
  150. package/{util → webglobeplugins/util}/account/bufferoffsetmanager.js +176 -209
  151. package/webglobeplugins/util/account/create-buffermap-orchastration.js +39 -0
  152. package/{util → webglobeplugins/util}/account/index.js +3 -6
  153. package/{util/account/single-attribute-buffer-management/buffer-manager.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-manager.js} +119 -151
  154. package/{util/account/single-attribute-buffer-management/buffer-orchestrator.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-orchestrator.js} +212 -238
  155. package/{util/account/single-attribute-buffer-management/buffer-orchestrator1.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-orchestrator1.js} +159 -184
  156. package/{util/account/single-attribute-buffer-management/index.ts → webglobeplugins/util/account/single-attribute-buffer-management/index.js} +4 -11
  157. package/{util/account/single-attribute-buffer-management/object-store.ts → webglobeplugins/util/account/single-attribute-buffer-management/object-store.js} +55 -76
  158. package/webglobeplugins/util/account/single-attribute-buffer-management/types.js +1 -0
  159. package/{util → webglobeplugins/util}/account/util.js +18 -22
  160. package/webglobeplugins/util/algorithms/index.js +1 -0
  161. package/{util → webglobeplugins/util}/algorithms/search-binary.js +25 -26
  162. package/{util/build-strategy/static-dynamic.ts → webglobeplugins/util/build-strategy/static-dynamic.js} +41 -50
  163. package/webglobeplugins/util/check/index.js +1 -0
  164. package/webglobeplugins/util/check/typecheck.js +66 -0
  165. package/{util/frame-counter-trigger.ts → webglobeplugins/util/frame-counter-trigger.js} +84 -99
  166. package/{util/geometry/index.ts → webglobeplugins/util/geometry/index.js} +121 -155
  167. package/webglobeplugins/util/gl-util/buffer/attribute-loader.js +74 -0
  168. package/{util/gl-util/buffer/index.ts → webglobeplugins/util/gl-util/buffer/index.js} +3 -6
  169. package/{util/gl-util/draw-options/methods.ts → webglobeplugins/util/gl-util/draw-options/methods.js} +32 -47
  170. package/{util/gl-util/uniform-block/manager.ts → webglobeplugins/util/gl-util/uniform-block/manager.js} +209 -232
  171. package/{util/globe-default-gl-states.ts → webglobeplugins/util/globe-default-gl-states.js} +4 -5
  172. package/{util/helper-methods.ts → webglobeplugins/util/helper-methods.js} +8 -9
  173. package/{util → webglobeplugins/util}/index.js +10 -9
  174. package/webglobeplugins/util/interpolation/index.js +1 -0
  175. package/webglobeplugins/util/interpolation/timetrack/index.js +2 -0
  176. package/{util → webglobeplugins/util}/interpolation/timetrack/timetrack-interpolator.js +79 -94
  177. package/{util → webglobeplugins/util}/interpolation/timetrack/web-worker.js +46 -51
  178. package/{util/picking/fence.ts → webglobeplugins/util/picking/fence.js} +43 -47
  179. package/{util/picking/picker-displayer.ts → webglobeplugins/util/picking/picker-displayer.js} +176 -226
  180. package/{util → webglobeplugins/util}/programs/draw-from-pixel-coords.js +164 -201
  181. package/{util/programs/draw-texture-on-canvas.ts → webglobeplugins/util/programs/draw-texture-on-canvas.js} +69 -91
  182. package/{util → webglobeplugins/util}/programs/supersampletotextures.js +97 -130
  183. package/{util/programs/texturetoglobe.js → webglobeplugins/util/programs/texturetoglobe_delete.js} +128 -153
  184. package/{util/shaderfunctions/geometrytransformations.ts → webglobeplugins/util/shaderfunctions/geometrytransformations.js} +44 -106
  185. package/{util → webglobeplugins/util}/shaderfunctions/index.js +2 -2
  186. package/{util → webglobeplugins/util}/shaderfunctions/nodata.js +2 -4
  187. package/{util → webglobeplugins/util}/shaderfunctions/noisefunctions.js +7 -10
  188. package/{util/webglobjectbuilders.ts → webglobeplugins/util/webglobjectbuilders.js} +358 -446
  189. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/adaptor.js +11 -11
  190. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/index.js +3 -3
  191. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/plugin.js +83 -128
  192. package/{vectorfield → webglobeplugins/vectorfield}/waveparticles/adaptor.js +15 -16
  193. package/{vectorfield → webglobeplugins/vectorfield}/waveparticles/index.js +3 -3
  194. package/{vectorfield/waveparticles/plugin.ts → webglobeplugins/vectorfield/waveparticles/plugin.js} +455 -506
  195. package/webglobeplugins/vectorfield/wind/adapters/image-to-fields.js +92 -0
  196. package/webglobeplugins/vectorfield/wind/adapters/types.js +1 -0
  197. package/{vectorfield/wind/imagetovectorfieldandmagnitude.ts → webglobeplugins/vectorfield/wind/imagetovectorfieldandmagnitude.js} +53 -78
  198. package/{vectorfield → webglobeplugins/vectorfield}/wind/index.js +5 -5
  199. package/{vectorfield/wind/plugin-persistant.ts → webglobeplugins/vectorfield/wind/plugin-persistant.js} +390 -483
  200. package/{vectorfield → webglobeplugins/vectorfield}/wind/plugin.js +685 -883
  201. package/{vectorfield → webglobeplugins/vectorfield}/wind/vectorfieldimage.js +23 -27
  202. package/{write-text/context-text-bulk.ts → webglobeplugins/write-text/context-text-bulk.js} +200 -285
  203. package/webglobeplugins/write-text/context-text3.js +167 -0
  204. package/{write-text/context-text4.ts → webglobeplugins/write-text/context-text4.js} +146 -231
  205. package/{write-text → webglobeplugins/write-text}/context-textDELETE.js +94 -125
  206. package/{write-text/objectarraylabels/index.ts → webglobeplugins/write-text/objectarraylabels/index.js} +2 -2
  207. package/{write-text → webglobeplugins/write-text}/objectarraylabels/objectarraylabels.js +200 -247
  208. package/Math/index.js +0 -0
  209. package/Math/matrix4.ts +0 -0
  210. package/Math/mesh/mapbox-delaunay.d.ts +0 -74
  211. package/Math/roadmap.md +0 -10
  212. package/Math/tessellation/constants.ts +0 -1
  213. package/Math/tessellation/roadmap.md +0 -48
  214. package/Math/tessellation/types.ts +0 -1
  215. package/Math/types.ts +0 -68
  216. package/altitude-locator/adaptors.js +0 -0
  217. package/altitude-locator/keymethod.js +0 -0
  218. package/investigation-tools/draw/tiles/adapters.ts +0 -133
  219. package/programs/line-on-globe/index.js +0 -0
  220. package/programs/line-on-globe/linestrip/data.ts +0 -29
  221. package/programs/polygon-on-globe/roadmap.md +0 -8
  222. package/programs/rings/index.js +0 -1
  223. package/programs/totems/camera-totem-attactment-interface.ts +0 -4
  224. package/programs/vectorfields/logics/particle-ubo.ts +0 -23
  225. package/publish.bat +0 -62
  226. package/range-tools-on-terrain/bearing-line/types.ts +0 -65
  227. package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
  228. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
  229. package/range-tools-on-terrain/range-ring/types.ts +0 -30
  230. package/semiplugins/interface.ts +0 -14
  231. package/semiplugins/shape-on-terrain/goal.md +0 -12
  232. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +0 -20
  233. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +0 -196
  234. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +0 -209
  235. package/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.ts +0 -144
  236. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +0 -5
  237. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +0 -37
  238. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +0 -146
  239. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +0 -90
  240. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +0 -69
  241. package/semiplugins/shell/bbox-renderer/index.ts +0 -2
  242. package/semiplugins/shell/bbox-renderer/object.ts +0 -129
  243. package/semiplugins/type.ts +0 -8
  244. package/terrain-plugin.mmd +0 -83
  245. package/tests/Math/arc-sampling-test.js +0 -367
  246. package/tests/Math/arc-sampling-test.ts +0 -429
  247. package/tests/Math/arc.test.ts +0 -77
  248. package/tests/Math/junction/arc-limit.test.ts +0 -7
  249. package/tests/Math/junction/arc-plane-points.test.ts +0 -196
  250. package/tests/Math/junction/arc-plane.test.ts +0 -172
  251. package/tests/Math/junction/line-sphere.test.ts +0 -127
  252. package/tests/Math/junction/plane-plane.test.ts +0 -91
  253. package/tests/Math/plane-test.ts +0 -17
  254. package/tests/Math/plane.test.ts +0 -43
  255. package/tests/Math/vec3.test.ts +0 -33
  256. package/tracks/point-heat-map/index.js +0 -0
  257. package/tracks/point-heat-map/readme.md +0 -15
  258. package/tracks/timetracks/readme.md +0 -1
  259. package/tsconfig.json +0 -22
  260. package/types/@pirireis/webglobe.d.ts +0 -102
  261. package/types/delaunator.d.ts +0 -40
  262. package/types/earcut.d.ts +0 -11
  263. package/types/rbush.d.ts +0 -57
  264. package/types.ts +0 -319
  265. package/util/account/create-buffermap-orchastration.ts +0 -85
  266. package/util/account/single-attribute-buffer-management/types.ts +0 -43
  267. package/util/algorithms/index.js +0 -0
  268. package/util/check/index.js +0 -0
  269. package/util/check/typecheck.ts +0 -74
  270. package/util/gl-util/buffer/attribute-loader.ts +0 -84
  271. package/util/interpolation/index.js +0 -0
  272. package/util/interpolation/timetrack/index.js +0 -9
  273. package/vectorfield/wind/adapters/image-to-fields.ts +0 -74
  274. package/vectorfield/wind/adapters/types.ts +0 -12
  275. package/vectorfield/wind/plugin-persistant copy.ts +0 -461
  276. package/write-text/context-text3.ts +0 -252
  277. package/write-text/objectarraylabels/objectarraylabels.d.ts +0 -72
@@ -1,329 +1,272 @@
1
- import { Radians, Vec3, Quaternion, } from './types';
2
- import { fromAxisAngle } from './quaternion';
3
- import { applyQuaternion, clone } from './vec3';
4
- // --- Utility Functions for 3D Vector Operations --- (Assumed to be the same as provided)
5
-
6
- /**
7
- * Normalizes a 3D vector to unit length.
8
- * @param v The input vector.
9
- * @returns The normalized vector. Returns [0,0,0] if the input vector is a zero vector.
10
- */
11
- function vec3Normalize(v: Vec3): Vec3 {
12
- const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
13
- if (len < 1e-9) { // Use a small epsilon to handle near-zero vectors
14
- return [0, 0, 0];
15
- }
16
- return [v[0] / len, v[1] / len, v[2] / len];
17
- }
18
-
19
- /**
20
- * Calculates the dot product of two 3D vectors.
21
- * @param v1 The first vector.
22
- * @param v2 The second vector.
23
- * @returns The dot product.
24
- */
25
- function vec3Dot(v1: Vec3, v2: Vec3): number {
26
- return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
27
- }
28
-
29
- /**
30
- * Calculates the cross product of two 3D vectors.
31
- * @param v1 The first vector.
32
- * @param v2 The second vector.
33
- * @returns The cross product vector.
34
- */
35
- function vec3Cross(v1: Vec3, v2: Vec3): Vec3 {
36
- return [
37
- v1[1] * v2[2] - v1[2] * v2[1],
38
- v1[2] * v2[0] - v1[0] * v2[2],
39
- v1[0] * v2[1] - v1[1] * v2[0]
40
- ];
41
- }
42
-
43
- /**
44
- * Scales a 3D vector by a scalar.
45
- * @param v The input vector.
46
- * @param s The scalar value.
47
- * @returns The scaled vector.
48
- */
49
- function vec3Scale(v: Vec3, s: number): Vec3 {
50
- return [v[0] * s, v[1] * s, v[2] * s];
51
- }
52
-
53
- /**
54
- * Adds two 3D vectors.
55
- * @param v1 The first vector.
56
- * @param v2 The second vector.
57
- * @returns The resulting vector.
58
- */
59
- function vec3Add(v1: Vec3, v2: Vec3): Vec3 {
60
- return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]];
61
- }
62
-
63
- /**
64
- * Subtracts the second 3D vector from the first.
65
- * @param v1 The first vector.
66
- * @param v2 The second vector.
67
- * @returns The resulting vector.
68
- */
69
- function vec3Sub(v1: Vec3, v2: Vec3): Vec3 {
70
- return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]];
71
- }
72
-
73
- /**
74
- * Clamps a numerical value within a specified range.
75
- * @param value The value to clamp.
76
- * @param min The minimum allowed value.
77
- * @param max The maximum allowed value.
78
- * @returns The clamped value.
79
- */
80
- function clamp(value: number, min: number, max: number): number {
81
- return Math.max(min, Math.min(value, max));
82
- }
83
-
84
-
85
-
86
-
87
- /**
88
- * Rotates a vector around a given axis by a specified angle using Rodrigues' rotation formula.
89
- * The axis must be a unit vector for correct results.
90
- * @param v The vector to rotate.
91
- * @param axis The unit axis of rotation.
92
- * @param angle The angle of rotation in radians.
93
- * @returns The rotated vector.
94
- */
95
- function rotateVector(v: Vec3, axis: Vec3, angle: number): Vec3 {
96
- const cosAngle = Math.cos(angle);
97
- const sinAngle = Math.sin(angle);
98
- const oneMinusCos = 1.0 - cosAngle;
99
-
100
- const dotAxisV = vec3Dot(axis, v);
101
- const crossAxisV = vec3Cross(axis, v);
102
-
103
- // Rodrigues' rotation formula:
104
- // v' = v * cos(angle) + (axis x v) * sin(angle) + axis * (axis . v) * (1 - cos(angle))
105
- const term1 = vec3Scale(v, cosAngle);
106
- const term2 = vec3Scale(crossAxisV, sinAngle);
107
- const term3 = vec3Scale(axis, dotAxisV * oneMinusCos);
108
-
109
- return vec3Add(vec3Add(term1, term2), term3);
110
- }
111
-
112
- // --- Main Function for Arc Point Generation (CORRECTED) ---
113
-
114
- /**
115
- * Generates points on the shortest arc between p0 and p1 on a unit sphere.
116
- * The arc is formed by rotating p0 around axisA. The density of points
117
- * is higher closer to the attractionPoint, controlled by an exponential falloff.
118
- *
119
- * @param p0 The starting point of the arc (will be normalized).
120
- * @param p1 The ending point of the arc (will be normalized).
121
- * @param axisA The axis of rotation (will be normalized).
122
- * @param attractionPoint The point on the unit sphere that attracts sampled points (will be normalized).
123
- * @param pointCount The total number of points to generate on the arc, including p0 and p1. > evenSpacedPointCount.
124
- * @param attractionStrength Controls the density bias via exponential decay.
125
- * A value of 0 results in uniform sampling.
126
- * Higher positive values (e.g., 10, 50, 200) result in exponentially stronger attraction.
127
- * @returns An array of `Vec3` representing the deterministically sampled points on the arc.
128
- */
129
- export function generateArcPoints(
130
- p0: Vec3,
131
- p1: Vec3,
132
- axisA: Vec3,
133
- attractionPoint: Vec3,
134
- pointCount: number,
135
- attractionStrength: number,
136
- adaptiveStrength: boolean = true,
137
- evenSpacedPointCount: number | null = null
138
- ): Vec3[] {
139
- // 0. Add evenly distanced points
140
- let t_even_index = 0;
141
- evenSpacedPointCount = evenSpacedPointCount ?? Math.floor(pointCount / 2.5);
142
- const t_event = Array.from({ length: evenSpacedPointCount }, (_, i) => i / (evenSpacedPointCount - 1));
143
-
144
- const sampledPoints: Vec3[] = [];
145
- const epsilon = 1e-9;
146
-
147
- // 1. Normalize all input vectors
148
- let nP0 = vec3Normalize(p0);
149
- let nP1 = vec3Normalize(p1);
150
- let nAxisA = vec3Normalize(axisA);
151
- let nAttractionPoint = vec3Normalize(attractionPoint);
152
-
153
- // Handle edge cases for pointCount
154
- if (pointCount < 1) return [];
155
- if (pointCount === 1) return [nP0];
156
-
157
- // 2. Determine the total rotation angle
158
- const p0Projected = vec3Sub(nP0, vec3Scale(nAxisA, vec3Dot(nP0, nAxisA)));
159
- const p1Projected = vec3Sub(nP1, vec3Scale(nAxisA, vec3Dot(nP1, nAxisA)));
160
-
161
- if (vec3Dot(p0Projected, p0Projected) < epsilon * epsilon || vec3Dot(p1Projected, p1Projected) < epsilon * epsilon) {
162
- console.warn("generateArcPoints: p0 or p1 is colinear with axisA. Cannot form a valid arc. Falling back to linear interpolation.");
163
- for (let i = 0; i < pointCount; i++) {
164
- const t = i / (pointCount - 1);
165
- sampledPoints.push(vec3Normalize(vec3Add(vec3Scale(nP0, 1 - t), vec3Scale(nP1, t))));
166
- }
167
- return sampledPoints;
168
- }
169
-
170
- const nP0Projected = vec3Normalize(p0Projected);
171
- const nP1Projected = vec3Normalize(p1Projected);
172
- const crossProj = vec3Cross(nP0Projected, nP1Projected);
173
- const totalRotationAngle = Math.atan2(vec3Dot(crossProj, nAxisA), vec3Dot(nP0Projected, nP1Projected));
174
- if (adaptiveStrength) attractionStrength *= Math.pow(Math.max(1, (totalRotationAngle + 0.1)), 3); // Scale attraction strength by the arc length
175
-
176
- if (Math.abs(totalRotationAngle) < epsilon) {
177
- for (let i = 0; i < pointCount; i++) sampledPoints.push(nP0);
178
- return sampledPoints;
179
- }
180
-
181
- // 3. Find alpha_A: the angle parameter where the arc is closest to the attractionPoint
182
-
183
- const alpha_A = (() => {
184
- const dotProduct = vec3Dot(nP0, nAttractionPoint);
185
- return Math.acos(dotProduct);
186
- })()
187
-
188
- // 4. Define the PDF and CDF based on an exponential decay model
189
- const t_peak = totalRotationAngle !== 0 ? clamp(alpha_A / totalRotationAngle, 0, 1) : 0;
190
- const s = Math.max(0, attractionStrength);
191
-
192
- const area1 = (1 - Math.exp(-s * t_peak));
193
- const area2 = (1 - Math.exp(-s * (1 - t_peak)));
194
- const totalIntegratedArea = (area1 + area2) / s;
195
- const cdfAtPeak = (area1 / s) / totalIntegratedArea;
196
-
197
- // 5. Generate deterministic points using inverse transform sampling
198
- for (let i = 0; i < pointCount - evenSpacedPointCount; i++) {
199
- const u = (pointCount === 1) ? 0.5 : (i + 1) / (pointCount - evenSpacedPointCount + 1);
200
- let t_sampled: number;
201
-
202
- if (s < epsilon) {
203
- t_sampled = u;
204
- } else {
205
- // Correctly calculate the area under the two parts of the exponential PDF
206
-
207
-
208
- if (totalIntegratedArea < epsilon) {
209
- t_sampled = u; // Fallback for extreme strength values
210
- } else {
211
- if (u <= cdfAtPeak) {
212
- // *** BUG FIX START ***
213
- // Correctly invert the CDF for the first part: [0, t_peak]
214
- const u_prime = u / cdfAtPeak;
215
- t_sampled = t_peak + Math.log(Math.exp(-s * t_peak) + u_prime * (1 - Math.exp(-s * t_peak))) / s;
216
- } else {
217
- // Correctly invert the CDF for the second part: [t_peak, 1]
218
- const u_double_prime = (u - cdfAtPeak) / (1 - cdfAtPeak);
219
- t_sampled = t_peak - Math.log(1 - u_double_prime * (1 - Math.exp(-s * (1 - t_peak)))) / s;
220
- }
221
- // *** BUG FIX END ***
222
- }
223
- }
224
-
225
- t_sampled = clamp(t_sampled, 0, 1);
226
-
227
-
228
- while (t_even_index < evenSpacedPointCount && t_sampled > t_event[t_even_index]) {
229
- const actualRotationAngle = totalRotationAngle * t_event[t_even_index];
230
- const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
231
- sampledPoints.push(currentPoint);
232
- t_even_index++;
233
- }
234
-
235
- const actualRotationAngle = totalRotationAngle * t_sampled;
236
- const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
237
- sampledPoints.push(currentPoint);
238
- }
239
-
240
- while (t_even_index < evenSpacedPointCount) {
241
- const actualRotationAngle = totalRotationAngle * t_event[t_even_index];
242
- const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
243
- sampledPoints.push(currentPoint);
244
- t_even_index++;
245
- }
246
- return sampledPoints;
247
- }
248
-
249
-
250
- const _rotationQuaternion = /*@__PURE__*/[0, 0, 0, 1] as Quaternion;
251
-
252
- export function evenlySpacedArcPoints(
253
- p0: Vec3,
254
- axisA: Vec3,
255
- coverAngle: Radians,
256
- pointCount: number
257
- ): Vec3[] {
258
- if (pointCount < 1) return [];
259
- if (pointCount === 1) return [vec3Normalize(p0)];
260
-
261
- const point = vec3Normalize(p0);
262
- const stepAngle = coverAngle / (pointCount - 1);
263
- fromAxisAngle(_rotationQuaternion, axisA, stepAngle);
264
-
265
- const sampledPoints: Vec3[] = new Array<Vec3>(pointCount);
266
- sampledPoints[0] = clone(point);
267
-
268
- // Start from index 1 since we already have the first point
269
- for (let i = 1; i < pointCount; i++) {
270
- applyQuaternion(point, point, _rotationQuaternion);
271
- sampledPoints[i] = clone(point);
272
- }
273
-
274
- return sampledPoints;
275
- }
276
-
277
- // // --- Example Usage (for demonstration and testing) ---
278
-
279
- // // Example 1: Basic arc, very strong attraction point in the middle
280
- // const p0_ex1: Vec3 = [1, 0, 0];
281
- // const p1_ex1: Vec3 = [0, 1, 0]; // 90 deg rotation around Z-axis
282
- // const axisA_ex1: Vec3 = [0, 0, 1];
283
- // const attractionPoint_ex1: Vec3 = [Math.sqrt(0.5), Math.sqrt(0.5), 0]; // On the arc, middle of P0-P1
284
- // const numPoints_ex1 = 21;
285
- // const strength_ex1 = 50.0; // Very strong attraction with the new exponential model
286
-
287
- // console.log("--- Example 1: Attraction point in the middle of the arc (Exponentially Strong) ---");
288
- // const points1 = generateArcPoints(p0_ex1, p1_ex1, axisA_ex1, attractionPoint_ex1, numPoints_ex1, strength_ex1);
289
- // console.log(`Generated ${points1.length} points.`);
290
- // // With high strength, points should be extremely clustered around the attraction point.
291
- // const sequentialDistances1 = points1.map((p, i) => {
292
- // if (i === 0) return 0;
293
- // return vec3Distance(points1[i - 1], p);
294
- // });
295
- // console.log("Distances near the start:", sequentialDistances1.slice(1, 5).map(d => d.toFixed(5)));
296
- // console.log("Distances near the middle (attraction point):", sequentialDistances1.slice(9, 13).map(d => d.toFixed(5)));
297
- // console.log("Distances near the end:", sequentialDistances1.slice(-4).map(d => d.toFixed(5)));
298
- // // Expected: Distances near the middle should be MUCH smaller than at the ends.
299
-
300
- // // Example 2: Attraction point near p0, very high strength
301
- // const p0_ex2: Vec3 = [1, 0, 0];
302
- // const p1_ex2: Vec3 = [0, 1, 0];
303
- // const axisA_ex2: Vec3 = [0, 0, 1];
304
- // const attractionPoint_ex2: Vec3 = [0.99, 0.01, 0]; // Very close to P0
305
- // const numPoints_ex2 = 10;
306
- // const strength_ex2 = 100.0; // Extremely strong attraction
307
-
308
- // console.log("\n--- Example 2: Attraction point near the start (p0) ---");
309
- // const points2 = generateArcPoints(p0_ex2, p1_ex2, axisA_ex2, attractionPoint_ex2, numPoints_ex2, strength_ex2);
310
- // console.log(`Generated ${points2.length} points.`);
311
- // console.log("First 5 points (should be very close to each other and p0):", points2.slice(0, 5).map(p => p.map(coord => coord.toFixed(5))));
312
- // console.log("Last 5 points (should be very spread out):", points2.slice(-5).map(p => p.map(coord => coord.toFixed(5))));
313
-
314
-
315
- // // Example 4: No attraction (uniform distribution)
316
- // const p0_ex4: Vec3 = [1, 0, 0];
317
- // const p1_ex4: Vec3 = [0, 1, 0];
318
- // const axisA_ex4: Vec3 = [0, 0, 1];
319
- // const attractionPoint_ex4: Vec3 = [1, 0, 0]; // Irrelevant when strength is 0
320
- // const numPoints_ex4 = 11;
321
- // const strength_ex4 = 0.0; // No attraction (uniform)
322
-
323
- // console.log("\n--- Example 4: Uniform distribution (strength = 0) ---");
324
- // const points4 = generateArcPoints(p0_ex4, p1_ex4, axisA_ex4, attractionPoint_ex4, numPoints_ex4, strength_ex4);
325
- // const sequentialDistances4 = points4.map((p, i) => {
326
- // if (i === 0) return 0;
327
- // return vec3Distance(points4[i - 1], p);
328
- // });
329
- // console.log("Sequential distances (should be almost identical):", sequentialDistances4.slice(1).map(d => d.toFixed(5)));
1
+ import { fromAxisAngle } from './quaternion';
2
+ import { applyQuaternion, clone } from './vec3';
3
+ // --- Utility Functions for 3D Vector Operations --- (Assumed to be the same as provided)
4
+ /**
5
+ * Normalizes a 3D vector to unit length.
6
+ * @param v The input vector.
7
+ * @returns The normalized vector. Returns [0,0,0] if the input vector is a zero vector.
8
+ */
9
+ function vec3Normalize(v) {
10
+ const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
11
+ if (len < 1e-9) { // Use a small epsilon to handle near-zero vectors
12
+ return [0, 0, 0];
13
+ }
14
+ return [v[0] / len, v[1] / len, v[2] / len];
15
+ }
16
+ /**
17
+ * Calculates the dot product of two 3D vectors.
18
+ * @param v1 The first vector.
19
+ * @param v2 The second vector.
20
+ * @returns The dot product.
21
+ */
22
+ function vec3Dot(v1, v2) {
23
+ return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
24
+ }
25
+ /**
26
+ * Calculates the cross product of two 3D vectors.
27
+ * @param v1 The first vector.
28
+ * @param v2 The second vector.
29
+ * @returns The cross product vector.
30
+ */
31
+ function vec3Cross(v1, v2) {
32
+ return [
33
+ v1[1] * v2[2] - v1[2] * v2[1],
34
+ v1[2] * v2[0] - v1[0] * v2[2],
35
+ v1[0] * v2[1] - v1[1] * v2[0]
36
+ ];
37
+ }
38
+ /**
39
+ * Scales a 3D vector by a scalar.
40
+ * @param v The input vector.
41
+ * @param s The scalar value.
42
+ * @returns The scaled vector.
43
+ */
44
+ function vec3Scale(v, s) {
45
+ return [v[0] * s, v[1] * s, v[2] * s];
46
+ }
47
+ /**
48
+ * Adds two 3D vectors.
49
+ * @param v1 The first vector.
50
+ * @param v2 The second vector.
51
+ * @returns The resulting vector.
52
+ */
53
+ function vec3Add(v1, v2) {
54
+ return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]];
55
+ }
56
+ /**
57
+ * Subtracts the second 3D vector from the first.
58
+ * @param v1 The first vector.
59
+ * @param v2 The second vector.
60
+ * @returns The resulting vector.
61
+ */
62
+ function vec3Sub(v1, v2) {
63
+ return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]];
64
+ }
65
+ /**
66
+ * Clamps a numerical value within a specified range.
67
+ * @param value The value to clamp.
68
+ * @param min The minimum allowed value.
69
+ * @param max The maximum allowed value.
70
+ * @returns The clamped value.
71
+ */
72
+ function clamp(value, min, max) {
73
+ return Math.max(min, Math.min(value, max));
74
+ }
75
+ /**
76
+ * Rotates a vector around a given axis by a specified angle using Rodrigues' rotation formula.
77
+ * The axis must be a unit vector for correct results.
78
+ * @param v The vector to rotate.
79
+ * @param axis The unit axis of rotation.
80
+ * @param angle The angle of rotation in radians.
81
+ * @returns The rotated vector.
82
+ */
83
+ function rotateVector(v, axis, angle) {
84
+ const cosAngle = Math.cos(angle);
85
+ const sinAngle = Math.sin(angle);
86
+ const oneMinusCos = 1.0 - cosAngle;
87
+ const dotAxisV = vec3Dot(axis, v);
88
+ const crossAxisV = vec3Cross(axis, v);
89
+ // Rodrigues' rotation formula:
90
+ // v' = v * cos(angle) + (axis x v) * sin(angle) + axis * (axis . v) * (1 - cos(angle))
91
+ const term1 = vec3Scale(v, cosAngle);
92
+ const term2 = vec3Scale(crossAxisV, sinAngle);
93
+ const term3 = vec3Scale(axis, dotAxisV * oneMinusCos);
94
+ return vec3Add(vec3Add(term1, term2), term3);
95
+ }
96
+ // --- Main Function for Arc Point Generation (CORRECTED) ---
97
+ /**
98
+ * Generates points on the shortest arc between p0 and p1 on a unit sphere.
99
+ * The arc is formed by rotating p0 around axisA. The density of points
100
+ * is higher closer to the attractionPoint, controlled by an exponential falloff.
101
+ *
102
+ * @param p0 The starting point of the arc (will be normalized).
103
+ * @param p1 The ending point of the arc (will be normalized).
104
+ * @param axisA The axis of rotation (will be normalized).
105
+ * @param attractionPoint The point on the unit sphere that attracts sampled points (will be normalized).
106
+ * @param pointCount The total number of points to generate on the arc, including p0 and p1. > evenSpacedPointCount.
107
+ * @param attractionStrength Controls the density bias via exponential decay.
108
+ * A value of 0 results in uniform sampling.
109
+ * Higher positive values (e.g., 10, 50, 200) result in exponentially stronger attraction.
110
+ * @returns An array of `Vec3` representing the deterministically sampled points on the arc.
111
+ */
112
+ export function generateArcPoints(p0, p1, axisA, attractionPoint, pointCount, attractionStrength, adaptiveStrength = true, evenSpacedPointCount = null) {
113
+ // 0. Add evenly distanced points
114
+ let t_even_index = 0;
115
+ evenSpacedPointCount = evenSpacedPointCount ?? Math.floor(pointCount / 2.5);
116
+ const t_event = Array.from({ length: evenSpacedPointCount }, (_, i) => i / (evenSpacedPointCount - 1));
117
+ const sampledPoints = [];
118
+ const epsilon = 1e-9;
119
+ // 1. Normalize all input vectors
120
+ let nP0 = vec3Normalize(p0);
121
+ let nP1 = vec3Normalize(p1);
122
+ let nAxisA = vec3Normalize(axisA);
123
+ let nAttractionPoint = vec3Normalize(attractionPoint);
124
+ // Handle edge cases for pointCount
125
+ if (pointCount < 1)
126
+ return [];
127
+ if (pointCount === 1)
128
+ return [nP0];
129
+ // 2. Determine the total rotation angle
130
+ const p0Projected = vec3Sub(nP0, vec3Scale(nAxisA, vec3Dot(nP0, nAxisA)));
131
+ const p1Projected = vec3Sub(nP1, vec3Scale(nAxisA, vec3Dot(nP1, nAxisA)));
132
+ if (vec3Dot(p0Projected, p0Projected) < epsilon * epsilon || vec3Dot(p1Projected, p1Projected) < epsilon * epsilon) {
133
+ console.warn("generateArcPoints: p0 or p1 is colinear with axisA. Cannot form a valid arc. Falling back to linear interpolation.");
134
+ for (let i = 0; i < pointCount; i++) {
135
+ const t = i / (pointCount - 1);
136
+ sampledPoints.push(vec3Normalize(vec3Add(vec3Scale(nP0, 1 - t), vec3Scale(nP1, t))));
137
+ }
138
+ return sampledPoints;
139
+ }
140
+ const nP0Projected = vec3Normalize(p0Projected);
141
+ const nP1Projected = vec3Normalize(p1Projected);
142
+ const crossProj = vec3Cross(nP0Projected, nP1Projected);
143
+ const totalRotationAngle = Math.atan2(vec3Dot(crossProj, nAxisA), vec3Dot(nP0Projected, nP1Projected));
144
+ if (adaptiveStrength)
145
+ attractionStrength *= Math.pow(Math.max(1, (totalRotationAngle + 0.1)), 3); // Scale attraction strength by the arc length
146
+ if (Math.abs(totalRotationAngle) < epsilon) {
147
+ for (let i = 0; i < pointCount; i++)
148
+ sampledPoints.push(nP0);
149
+ return sampledPoints;
150
+ }
151
+ // 3. Find alpha_A: the angle parameter where the arc is closest to the attractionPoint
152
+ const alpha_A = (() => {
153
+ const dotProduct = vec3Dot(nP0, nAttractionPoint);
154
+ return Math.acos(dotProduct);
155
+ })();
156
+ // 4. Define the PDF and CDF based on an exponential decay model
157
+ const t_peak = totalRotationAngle !== 0 ? clamp(alpha_A / totalRotationAngle, 0, 1) : 0;
158
+ const s = Math.max(0, attractionStrength);
159
+ const area1 = (1 - Math.exp(-s * t_peak));
160
+ const area2 = (1 - Math.exp(-s * (1 - t_peak)));
161
+ const totalIntegratedArea = (area1 + area2) / s;
162
+ const cdfAtPeak = (area1 / s) / totalIntegratedArea;
163
+ // 5. Generate deterministic points using inverse transform sampling
164
+ for (let i = 0; i < pointCount - evenSpacedPointCount; i++) {
165
+ const u = (pointCount === 1) ? 0.5 : (i + 1) / (pointCount - evenSpacedPointCount + 1);
166
+ let t_sampled;
167
+ if (s < epsilon) {
168
+ t_sampled = u;
169
+ }
170
+ else {
171
+ // Correctly calculate the area under the two parts of the exponential PDF
172
+ if (totalIntegratedArea < epsilon) {
173
+ t_sampled = u; // Fallback for extreme strength values
174
+ }
175
+ else {
176
+ if (u <= cdfAtPeak) {
177
+ // *** BUG FIX START ***
178
+ // Correctly invert the CDF for the first part: [0, t_peak]
179
+ const u_prime = u / cdfAtPeak;
180
+ t_sampled = t_peak + Math.log(Math.exp(-s * t_peak) + u_prime * (1 - Math.exp(-s * t_peak))) / s;
181
+ }
182
+ else {
183
+ // Correctly invert the CDF for the second part: [t_peak, 1]
184
+ const u_double_prime = (u - cdfAtPeak) / (1 - cdfAtPeak);
185
+ t_sampled = t_peak - Math.log(1 - u_double_prime * (1 - Math.exp(-s * (1 - t_peak)))) / s;
186
+ }
187
+ // *** BUG FIX END ***
188
+ }
189
+ }
190
+ t_sampled = clamp(t_sampled, 0, 1);
191
+ while (t_even_index < evenSpacedPointCount && t_sampled > t_event[t_even_index]) {
192
+ const actualRotationAngle = totalRotationAngle * t_event[t_even_index];
193
+ const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
194
+ sampledPoints.push(currentPoint);
195
+ t_even_index++;
196
+ }
197
+ const actualRotationAngle = totalRotationAngle * t_sampled;
198
+ const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
199
+ sampledPoints.push(currentPoint);
200
+ }
201
+ while (t_even_index < evenSpacedPointCount) {
202
+ const actualRotationAngle = totalRotationAngle * t_event[t_even_index];
203
+ const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
204
+ sampledPoints.push(currentPoint);
205
+ t_even_index++;
206
+ }
207
+ return sampledPoints;
208
+ }
209
+ const _rotationQuaternion = /*@__PURE__*/ [0, 0, 0, 1];
210
+ export function evenlySpacedArcPoints(p0, axisA, coverAngle, pointCount) {
211
+ if (pointCount < 1)
212
+ return [];
213
+ if (pointCount === 1)
214
+ return [vec3Normalize(p0)];
215
+ const point = vec3Normalize(p0);
216
+ const stepAngle = coverAngle / (pointCount - 1);
217
+ fromAxisAngle(_rotationQuaternion, axisA, stepAngle);
218
+ const sampledPoints = new Array(pointCount);
219
+ sampledPoints[0] = clone(point);
220
+ // Start from index 1 since we already have the first point
221
+ for (let i = 1; i < pointCount; i++) {
222
+ applyQuaternion(point, point, _rotationQuaternion);
223
+ sampledPoints[i] = clone(point);
224
+ }
225
+ return sampledPoints;
226
+ }
227
+ // // --- Example Usage (for demonstration and testing) ---
228
+ // // Example 1: Basic arc, very strong attraction point in the middle
229
+ // const p0_ex1: Vec3 = [1, 0, 0];
230
+ // const p1_ex1: Vec3 = [0, 1, 0]; // 90 deg rotation around Z-axis
231
+ // const axisA_ex1: Vec3 = [0, 0, 1];
232
+ // const attractionPoint_ex1: Vec3 = [Math.sqrt(0.5), Math.sqrt(0.5), 0]; // On the arc, middle of P0-P1
233
+ // const numPoints_ex1 = 21;
234
+ // const strength_ex1 = 50.0; // Very strong attraction with the new exponential model
235
+ // console.log("--- Example 1: Attraction point in the middle of the arc (Exponentially Strong) ---");
236
+ // const points1 = generateArcPoints(p0_ex1, p1_ex1, axisA_ex1, attractionPoint_ex1, numPoints_ex1, strength_ex1);
237
+ // console.log(`Generated ${points1.length} points.`);
238
+ // // With high strength, points should be extremely clustered around the attraction point.
239
+ // const sequentialDistances1 = points1.map((p, i) => {
240
+ // if (i === 0) return 0;
241
+ // return vec3Distance(points1[i - 1], p);
242
+ // });
243
+ // console.log("Distances near the start:", sequentialDistances1.slice(1, 5).map(d => d.toFixed(5)));
244
+ // console.log("Distances near the middle (attraction point):", sequentialDistances1.slice(9, 13).map(d => d.toFixed(5)));
245
+ // console.log("Distances near the end:", sequentialDistances1.slice(-4).map(d => d.toFixed(5)));
246
+ // // Expected: Distances near the middle should be MUCH smaller than at the ends.
247
+ // // Example 2: Attraction point near p0, very high strength
248
+ // const p0_ex2: Vec3 = [1, 0, 0];
249
+ // const p1_ex2: Vec3 = [0, 1, 0];
250
+ // const axisA_ex2: Vec3 = [0, 0, 1];
251
+ // const attractionPoint_ex2: Vec3 = [0.99, 0.01, 0]; // Very close to P0
252
+ // const numPoints_ex2 = 10;
253
+ // const strength_ex2 = 100.0; // Extremely strong attraction
254
+ // console.log("\n--- Example 2: Attraction point near the start (p0) ---");
255
+ // const points2 = generateArcPoints(p0_ex2, p1_ex2, axisA_ex2, attractionPoint_ex2, numPoints_ex2, strength_ex2);
256
+ // console.log(`Generated ${points2.length} points.`);
257
+ // console.log("First 5 points (should be very close to each other and p0):", points2.slice(0, 5).map(p => p.map(coord => coord.toFixed(5))));
258
+ // console.log("Last 5 points (should be very spread out):", points2.slice(-5).map(p => p.map(coord => coord.toFixed(5))));
259
+ // // Example 4: No attraction (uniform distribution)
260
+ // const p0_ex4: Vec3 = [1, 0, 0];
261
+ // const p1_ex4: Vec3 = [0, 1, 0];
262
+ // const axisA_ex4: Vec3 = [0, 0, 1];
263
+ // const attractionPoint_ex4: Vec3 = [1, 0, 0]; // Irrelevant when strength is 0
264
+ // const numPoints_ex4 = 11;
265
+ // const strength_ex4 = 0.0; // No attraction (uniform)
266
+ // console.log("\n--- Example 4: Uniform distribution (strength = 0) ---");
267
+ // const points4 = generateArcPoints(p0_ex4, p1_ex4, axisA_ex4, attractionPoint_ex4, numPoints_ex4, strength_ex4);
268
+ // const sequentialDistances4 = points4.map((p, i) => {
269
+ // if (i === 0) return 0;
270
+ // return vec3Distance(points4[i - 1], p);
271
+ // });
272
+ // console.log("Sequential distances (should be almost identical):", sequentialDistances4.slice(1).map(d => d.toFixed(5)));