@pirireis/webglobeplugins 0.16.0 → 0.16.2

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 (480) hide show
  1. package/Math/angle-calculation.js +13 -14
  2. package/Math/bounds/line-bbox.js +186 -225
  3. package/Math/index.js +1 -0
  4. package/Math/mesh/mapbox-delaunay.js +544 -607
  5. package/Math/utils.js +2 -3
  6. package/algorithms/search-binary.js +16 -14
  7. package/altitude-locator/adaptors.js +1 -0
  8. package/altitude-locator/keymethod.js +1 -0
  9. package/altitude-locator/plugin.js +345 -446
  10. package/altitude-locator/types.js +21 -26
  11. package/arrowfield/adaptor.js +11 -11
  12. package/arrowfield/index.js +3 -3
  13. package/arrowfield/plugin.js +83 -128
  14. package/bearing-line/index.js +2 -2
  15. package/bearing-line/plugin.js +444 -520
  16. package/circle-line-chain/chain-list-map.js +201 -221
  17. package/circle-line-chain/init.js +1 -0
  18. package/circle-line-chain/plugin.js +411 -464
  19. package/circle-line-chain/util.js +1 -1
  20. package/compass-rose/compass-rose-padding-flat.js +230 -274
  21. package/compass-rose/compass-text-writer.js +149 -173
  22. package/compass-rose/index.js +3 -3
  23. package/compassrose/compassrose.js +293 -341
  24. package/compassrose/index.js +2 -2
  25. package/constants.js +3 -0
  26. package/heatwave/index.js +3 -4
  27. package/heatwave/isobar/objectarraylabels.js +200 -247
  28. package/heatwave/isobar/plugin.js +302 -339
  29. package/heatwave/isobar/quadtreecontours.js +298 -336
  30. package/heatwave/plugins/heatwaveglobeshell.js +204 -259
  31. package/index.js +12 -15
  32. package/jest.config.js +7 -6
  33. package/package.json +1 -4
  34. package/partialrings/buffer-manager.js +75 -89
  35. package/partialrings/index.js +2 -3
  36. package/partialrings/plugin.js +128 -160
  37. package/partialrings/program.js +188 -233
  38. package/pin/pin-object-array.js +300 -381
  39. package/pin/pin-point-totem.js +60 -77
  40. package/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
  41. package/point-heat-map/index.js +1 -0
  42. package/point-heat-map/plugin-webworker.js +121 -148
  43. package/point-heat-map/point-to-heat-map-flow.js +124 -150
  44. package/point-tracks/key-methods.js +2 -3
  45. package/point-tracks/plugin.js +393 -480
  46. package/programs/arrowfield/index.js +2 -2
  47. package/programs/arrowfield/logic.js +141 -173
  48. package/programs/arrowfield/object.js +60 -89
  49. package/programs/data2legend/density-to-legend.js +73 -90
  50. package/programs/data2legend/point-to-density-texture.js +70 -87
  51. package/programs/float2legendwithratio/index.js +2 -3
  52. package/programs/float2legendwithratio/logic.js +118 -144
  53. package/programs/float2legendwithratio/object.js +104 -141
  54. package/programs/globe-util/is-globe-moved.js +19 -27
  55. package/programs/globeshell/index.js +2 -2
  56. package/programs/globeshell/wiggle/index.js +2 -3
  57. package/programs/globeshell/wiggle/logic.js +243 -272
  58. package/programs/globeshell/wiggle/object.js +66 -93
  59. package/programs/helpers/blender/index.js +1 -0
  60. package/programs/helpers/blender/program.js +58 -73
  61. package/programs/helpers/fadeaway/index.js +2 -3
  62. package/programs/helpers/fadeaway/logic.js +46 -53
  63. package/programs/helpers/fadeaway/object.js +14 -20
  64. package/programs/helpers/index.js +2 -2
  65. package/programs/index.js +9 -21
  66. package/programs/line-on-globe/circle-accurate-3d.js +87 -115
  67. package/programs/line-on-globe/circle-accurate-flat.js +149 -201
  68. package/programs/line-on-globe/degree-padding-around-circle-3d.js +104 -136
  69. package/programs/line-on-globe/index.js +1 -0
  70. package/programs/line-on-globe/lines-color-instanced-flat.js +83 -102
  71. package/programs/line-on-globe/util.js +5 -8
  72. package/programs/picking/pickable-polygon-renderer.js +98 -129
  73. package/programs/picking/pickable-renderer.js +98 -129
  74. package/programs/point-on-globe/element-globe-surface-glow.js +93 -122
  75. package/programs/point-on-globe/element-point-glow.js +80 -114
  76. package/programs/point-on-globe/square-pixel-point.js +120 -138
  77. package/programs/rings/distancering/circleflatprogram.js +116 -138
  78. package/programs/rings/distancering/circlepaddingfreeangleprogram.js +275 -323
  79. package/programs/rings/distancering/circlepaddysharedbuffer.js +368 -423
  80. package/programs/rings/distancering/index.js +6 -5
  81. package/programs/rings/distancering/paddyflatprogram.js +127 -148
  82. package/programs/rings/distancering/paddyflatprogram2d.js +129 -153
  83. package/programs/rings/distancering/paddyflatprogram3d.js +128 -149
  84. package/programs/rings/index.js +1 -1
  85. package/{dist/programs → programs}/totems/camerauniformblock.js +10 -3
  86. package/programs/totems/gpu-selection-uniform-block.js +99 -127
  87. package/programs/two-d/pixel-circle.js +1 -0
  88. package/programs/two-d/pixel-padding-for-compass.js +97 -112
  89. package/programs/util.js +14 -19
  90. package/programs/vectorfields/index.js +3 -3
  91. package/programs/vectorfields/logics/drawrectangleparticles.js +58 -78
  92. package/programs/vectorfields/logics/index.js +2 -4
  93. package/programs/vectorfields/logics/pixelbased.js +73 -92
  94. package/programs/vectorfields/logics/ubo.js +51 -57
  95. package/programs/vectorfields/pingpongbuffermanager.js +73 -80
  96. package/rangerings/index.js +5 -5
  97. package/rangerings/plugin.js +543 -644
  98. package/rangerings/rangeringangletext.js +326 -369
  99. package/rangerings/ring-account.js +112 -129
  100. package/shaders/fragment-toy/firework.js +1 -1
  101. package/shaders/fragment-toy/singularity.js +2 -5
  102. package/timetracks/adaptors-line-strip.js +65 -80
  103. package/timetracks/index.js +1 -0
  104. package/timetracks/plugin-line-strip.js +240 -295
  105. package/timetracks/program-line-strip.js +411 -491
  106. package/timetracks/programpoint-line-strip.js +98 -122
  107. package/util/account/bufferoffsetmanager.js +176 -209
  108. package/util/account/index.js +3 -6
  109. package/util/account/util.js +18 -22
  110. package/util/algorithms/index.js +1 -0
  111. package/util/algorithms/search-binary.js +25 -26
  112. package/util/check/index.js +1 -0
  113. package/util/geometry/index.js +121 -0
  114. package/util/gl-util/uniform-block/shader.js +1 -0
  115. package/util/heatwavedatamanager/datamanager.js +149 -168
  116. package/util/heatwavedatamanager/index.js +2 -2
  117. package/util/index.js +13 -13
  118. package/util/interpolation/index.js +1 -0
  119. package/util/interpolation/timetrack/index.js +2 -9
  120. package/util/interpolation/timetrack/timetrack-interpolator.js +79 -94
  121. package/util/interpolation/timetrack/web-worker.js +46 -51
  122. package/util/jshelpers/data-filler.js +17 -19
  123. package/util/jshelpers/equality.js +18 -17
  124. package/util/jshelpers/index.js +2 -1
  125. package/util/jshelpers/timefilters.js +30 -32
  126. package/util/picking/fence.js +43 -46
  127. package/util/picking/picker-displayer.js +136 -177
  128. package/util/programs/draw-texture-on-canvas.js +66 -82
  129. package/util/programs/index.js +1 -1
  130. package/util/programs/shapesonglobe.js +167 -203
  131. package/util/programs/supersampletotextures.js +99 -132
  132. package/util/programs/texturetoglobe.js +128 -152
  133. package/util/shaderfunctions/index.js +2 -2
  134. package/util/shaderfunctions/nodata.js +2 -4
  135. package/util/shaderfunctions/noisefunctions.js +7 -10
  136. package/util/surface-line-data/arcs-to-cuts.js +50 -74
  137. package/util/surface-line-data/cut-arc.js +1 -0
  138. package/util/surface-line-data/rbush-manager.js +1 -0
  139. package/util/surface-line-data/web-worker.js +1 -0
  140. package/util/webglobe/gldefaultstates.js +4 -5
  141. package/util/webglobe/index.js +2 -2
  142. package/util/webglobe/rasteroverlay.js +75 -96
  143. package/waveparticles/adaptor.js +15 -16
  144. package/waveparticles/index.js +3 -3
  145. package/waveparticles/plugin.js +290 -342
  146. package/wind/imagetovectorfieldandmagnitude.js +56 -71
  147. package/wind/index.js +5 -5
  148. package/wind/plugin.js +670 -845
  149. package/wind/vectorfieldimage.js +23 -27
  150. package/write-text/attached-text-writer.js +87 -105
  151. package/{dist/write-text → write-text}/context-text-bulk.js +35 -20
  152. package/write-text/context-text.js +94 -125
  153. package/write-text/context-text3old.js +152 -179
  154. package/{dist/write-text → write-text}/context-text4.js +5 -3
  155. package/write-text/index.js +1 -1
  156. package/write-text/writer-plugin.js +8 -7
  157. package/Math/arc-cdf-points.ts +0 -329
  158. package/Math/arc-generate-points-exponantial.ts +0 -299
  159. package/Math/arc.ts +0 -299
  160. package/Math/circle-cdf-points.ts +0 -143
  161. package/Math/circle.ts +0 -49
  162. package/Math/constants.ts +0 -12
  163. package/Math/juction/arc-plane.ts +0 -129
  164. package/Math/juction/line-sphere.ts +0 -30
  165. package/Math/juction/plane-plane.ts +0 -64
  166. package/Math/line.ts +0 -84
  167. package/Math/matrix4.ts +0 -0
  168. package/Math/methods.ts +0 -157
  169. package/Math/plane.ts +0 -92
  170. package/Math/quaternion.ts +0 -128
  171. package/Math/roadmap.md +0 -10
  172. package/Math/templete-shapes/grid-visually-equal.ts +0 -119
  173. package/Math/types.ts +0 -66
  174. package/Math/vec3.ts +0 -180
  175. package/circle-line-chain/readme.md +0 -57
  176. package/depth-locator/readme.md +0 -26
  177. package/dist/Math/angle-calculation.js +0 -13
  178. package/dist/Math/bounds/line-bbox.js +0 -186
  179. package/dist/Math/index.js +0 -1
  180. package/dist/Math/mesh/mapbox-delaunay.js +0 -544
  181. package/dist/Math/utils.js +0 -2
  182. package/dist/algorithms/search-binary.js +0 -16
  183. package/dist/altitude-locator/adaptors.js +0 -1
  184. package/dist/altitude-locator/keymethod.js +0 -1
  185. package/dist/altitude-locator/plugin.js +0 -345
  186. package/dist/altitude-locator/types.js +0 -21
  187. package/dist/arrowfield/adaptor.js +0 -11
  188. package/dist/arrowfield/index.js +0 -3
  189. package/dist/arrowfield/plugin.js +0 -83
  190. package/dist/bearing-line/index.js +0 -2
  191. package/dist/bearing-line/plugin.js +0 -444
  192. package/dist/circle-line-chain/chain-list-map.js +0 -201
  193. package/dist/circle-line-chain/init.js +0 -1
  194. package/dist/circle-line-chain/plugin.js +0 -411
  195. package/dist/circle-line-chain/util.js +0 -1
  196. package/dist/compass-rose/compass-rose-padding-flat.js +0 -230
  197. package/dist/compass-rose/compass-text-writer.js +0 -149
  198. package/dist/compass-rose/index.js +0 -3
  199. package/dist/compassrose/compassrose.js +0 -293
  200. package/dist/compassrose/index.js +0 -2
  201. package/dist/heatwave/index.js +0 -3
  202. package/dist/heatwave/isobar/objectarraylabels.js +0 -200
  203. package/dist/heatwave/isobar/plugin.js +0 -302
  204. package/dist/heatwave/isobar/quadtreecontours.js +0 -298
  205. package/dist/heatwave/plugins/heatwaveglobeshell.js +0 -204
  206. package/dist/index.js +0 -12
  207. package/dist/jest.config.js +0 -7
  208. package/dist/partialrings/buffer-manager.js +0 -75
  209. package/dist/partialrings/index.js +0 -2
  210. package/dist/partialrings/plugin.js +0 -128
  211. package/dist/partialrings/program.js +0 -279
  212. package/dist/pin/pin-object-array.js +0 -300
  213. package/dist/pin/pin-point-totem.js +0 -60
  214. package/dist/point-heat-map/adaptors/timetracksplugin-format-to-this.js +0 -63
  215. package/dist/point-heat-map/index.js +0 -1
  216. package/dist/point-heat-map/plugin-webworker.js +0 -121
  217. package/dist/point-heat-map/point-to-heat-map-flow.js +0 -124
  218. package/dist/point-tracks/key-methods.js +0 -2
  219. package/dist/point-tracks/plugin.js +0 -393
  220. package/dist/programs/arrowfield/index.js +0 -2
  221. package/dist/programs/arrowfield/logic.js +0 -254
  222. package/dist/programs/arrowfield/object.js +0 -60
  223. package/dist/programs/data2legend/density-to-legend.js +0 -98
  224. package/dist/programs/data2legend/point-to-density-texture.js +0 -97
  225. package/dist/programs/float2legendwithratio/index.js +0 -2
  226. package/dist/programs/float2legendwithratio/logic.js +0 -167
  227. package/dist/programs/float2legendwithratio/object.js +0 -104
  228. package/dist/programs/globe-util/is-globe-moved.js +0 -19
  229. package/dist/programs/globeshell/index.js +0 -2
  230. package/dist/programs/globeshell/wiggle/index.js +0 -2
  231. package/dist/programs/globeshell/wiggle/logic.js +0 -342
  232. package/dist/programs/globeshell/wiggle/object.js +0 -66
  233. package/dist/programs/helpers/blender/index.js +0 -1
  234. package/dist/programs/helpers/blender/program.js +0 -76
  235. package/dist/programs/helpers/fadeaway/index.js +0 -2
  236. package/dist/programs/helpers/fadeaway/logic.js +0 -69
  237. package/dist/programs/helpers/fadeaway/object.js +0 -14
  238. package/dist/programs/helpers/index.js +0 -2
  239. package/dist/programs/index.js +0 -9
  240. package/dist/programs/line-on-globe/circle-accurate-3d.js +0 -138
  241. package/dist/programs/line-on-globe/circle-accurate-flat.js +0 -210
  242. package/dist/programs/line-on-globe/degree-padding-around-circle-3d.js +0 -156
  243. package/dist/programs/line-on-globe/index.js +0 -1
  244. package/dist/programs/line-on-globe/lines-color-instanced-flat.js +0 -131
  245. package/dist/programs/line-on-globe/util.js +0 -5
  246. package/dist/programs/picking/pickable-polygon-renderer.js +0 -184
  247. package/dist/programs/picking/pickable-renderer.js +0 -184
  248. package/dist/programs/point-on-globe/element-globe-surface-glow.js +0 -138
  249. package/dist/programs/point-on-globe/element-point-glow.js +0 -150
  250. package/dist/programs/point-on-globe/square-pixel-point.js +0 -171
  251. package/dist/programs/rings/distancering/circleflatprogram.js +0 -116
  252. package/dist/programs/rings/distancering/circlepaddingfreeangleprogram.js +0 -326
  253. package/dist/programs/rings/distancering/circlepaddysharedbuffer.js +0 -368
  254. package/dist/programs/rings/distancering/index.js +0 -6
  255. package/dist/programs/rings/distancering/paddyflatprogram.js +0 -127
  256. package/dist/programs/rings/distancering/paddyflatprogram2d.js +0 -129
  257. package/dist/programs/rings/distancering/paddyflatprogram3d.js +0 -128
  258. package/dist/programs/rings/index.js +0 -1
  259. package/dist/programs/totems/gpu-selection-uniform-block.js +0 -104
  260. package/dist/programs/two-d/pixel-circle.js +0 -1
  261. package/dist/programs/two-d/pixel-padding-for-compass.js +0 -159
  262. package/dist/programs/util.js +0 -14
  263. package/dist/programs/vectorfields/index.js +0 -3
  264. package/dist/programs/vectorfields/logics/drawrectangleparticles.js +0 -113
  265. package/dist/programs/vectorfields/logics/index.js +0 -2
  266. package/dist/programs/vectorfields/logics/pixelbased.js +0 -140
  267. package/dist/programs/vectorfields/logics/ubo.js +0 -60
  268. package/dist/programs/vectorfields/pingpongbuffermanager.js +0 -73
  269. package/dist/rangerings/index.js +0 -5
  270. package/dist/rangerings/plugin.js +0 -543
  271. package/dist/rangerings/rangeringangletext.js +0 -326
  272. package/dist/rangerings/ring-account.js +0 -112
  273. package/dist/shaders/fragment-toy/firework.js +0 -55
  274. package/dist/shaders/fragment-toy/singularity.js +0 -56
  275. package/dist/timetracks/adaptors-line-strip.js +0 -65
  276. package/dist/timetracks/index.js +0 -1
  277. package/dist/timetracks/plugin-line-strip.js +0 -240
  278. package/dist/timetracks/program-line-strip.js +0 -608
  279. package/dist/timetracks/programpoint-line-strip.js +0 -151
  280. package/dist/util/account/bufferoffsetmanager.js +0 -176
  281. package/dist/util/account/index.js +0 -3
  282. package/dist/util/account/util.js +0 -18
  283. package/dist/util/algorithms/index.js +0 -1
  284. package/dist/util/algorithms/search-binary.js +0 -25
  285. package/dist/util/check/index.js +0 -1
  286. package/dist/util/geometry/index.js +0 -47
  287. package/dist/util/gl-util/uniform-block/shader.js +0 -1
  288. package/dist/util/heatwavedatamanager/datamanager.js +0 -149
  289. package/dist/util/heatwavedatamanager/index.js +0 -2
  290. package/dist/util/index.js +0 -13
  291. package/dist/util/interpolation/index.js +0 -1
  292. package/dist/util/interpolation/timetrack/index.js +0 -2
  293. package/dist/util/interpolation/timetrack/timetrack-interpolator.js +0 -79
  294. package/dist/util/interpolation/timetrack/web-worker.js +0 -46
  295. package/dist/util/jshelpers/data-filler.js +0 -17
  296. package/dist/util/jshelpers/equality.js +0 -18
  297. package/dist/util/jshelpers/index.js +0 -2
  298. package/dist/util/jshelpers/timefilters.js +0 -30
  299. package/dist/util/picking/fence.js +0 -43
  300. package/dist/util/picking/picker-displayer.js +0 -136
  301. package/dist/util/programs/draw-texture-on-canvas.js +0 -86
  302. package/dist/util/programs/index.js +0 -1
  303. package/dist/util/programs/shapesonglobe.js +0 -210
  304. package/dist/util/programs/supersampletotextures.js +0 -109
  305. package/dist/util/programs/texturetoglobe.js +0 -179
  306. package/dist/util/shaderfunctions/index.js +0 -2
  307. package/dist/util/shaderfunctions/nodata.js +0 -8
  308. package/dist/util/shaderfunctions/noisefunctions.js +0 -41
  309. package/dist/util/surface-line-data/arcs-to-cuts.js +0 -50
  310. package/dist/util/surface-line-data/cut-arc.js +0 -1
  311. package/dist/util/surface-line-data/rbush-manager.js +0 -1
  312. package/dist/util/surface-line-data/web-worker.js +0 -1
  313. package/dist/util/webglobe/gldefaultstates.js +0 -4
  314. package/dist/util/webglobe/index.js +0 -2
  315. package/dist/util/webglobe/rasteroverlay.js +0 -75
  316. package/dist/waveparticles/adaptor.js +0 -15
  317. package/dist/waveparticles/index.js +0 -3
  318. package/dist/waveparticles/plugin.js +0 -290
  319. package/dist/wind/imagetovectorfieldandmagnitude.js +0 -56
  320. package/dist/wind/index.js +0 -5
  321. package/dist/wind/plugin.js +0 -921
  322. package/dist/wind/vectorfieldimage.js +0 -23
  323. package/dist/write-text/attached-text-writer.js +0 -87
  324. package/dist/write-text/context-text.js +0 -94
  325. package/dist/write-text/context-text3old.js +0 -152
  326. package/dist/write-text/index.js +0 -1
  327. package/dist/write-text/writer-plugin.js +0 -8
  328. package/partialrings/goals.md +0 -17
  329. package/point-heat-map/readme.md +0 -15
  330. package/programs/line-on-globe/linestrip/data.ts +0 -29
  331. package/programs/line-on-globe/linestrip/linestrip.ts +0 -201
  332. package/programs/line-on-globe/naive-accurate-flexible.ts +0 -258
  333. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin.ts +0 -120
  334. package/programs/polygon-on-globe/texture-dem-triangles.ts +0 -207
  335. package/programs/programcache.ts +0 -131
  336. package/programs/rings/partial-ring/piece-of-pie.ts +0 -323
  337. package/programs/totems/camerauniformblock.ts +0 -310
  338. package/programs/totems/canvas-webglobe-info.ts +0 -156
  339. package/programs/totems/globe-changes.ts +0 -79
  340. package/programs/totems/index.ts +0 -2
  341. package/programs/vectorfields/logics/constants.ts +0 -5
  342. package/programs/vectorfields/logics/ubo-new.ts +0 -37
  343. package/publish.bat +0 -62
  344. package/range-tools-on-terrain/bearing-line/adapters.ts +0 -154
  345. package/range-tools-on-terrain/bearing-line/plugin.ts +0 -569
  346. package/range-tools-on-terrain/bearing-line/types.ts +0 -65
  347. package/range-tools-on-terrain/circle-line-chain/adapters.ts +0 -109
  348. package/range-tools-on-terrain/circle-line-chain/chain-list-map.ts +0 -446
  349. package/range-tools-on-terrain/circle-line-chain/plugin.ts +0 -607
  350. package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
  351. package/range-tools-on-terrain/range-ring/adapters.ts +0 -114
  352. package/range-tools-on-terrain/range-ring/enum.ts +0 -2
  353. package/range-tools-on-terrain/range-ring/plugin.ts +0 -447
  354. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
  355. package/range-tools-on-terrain/range-ring/types.ts +0 -30
  356. package/rangerings/enum.ts +0 -2
  357. package/semiplugins/interface.ts +0 -14
  358. package/semiplugins/lightweight/line-plugin.ts +0 -343
  359. package/semiplugins/lightweight/piece-of-pie-plugin.ts +0 -275
  360. package/semiplugins/shape-on-terrain/arc-plugin.ts +0 -602
  361. package/semiplugins/shape-on-terrain/circle-plugin.ts +0 -588
  362. package/semiplugins/shape-on-terrain/goal.md +0 -12
  363. package/semiplugins/shape-on-terrain/padding-1-degree.ts +0 -714
  364. package/semiplugins/shape-on-terrain/terrain-cover/notes.md +0 -90
  365. package/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.ts +0 -0
  366. package/semiplugins/type.ts +0 -8
  367. package/tests/Math/arc-sampling-test.js +0 -367
  368. package/tests/Math/arc-sampling-test.ts +0 -429
  369. package/tests/Math/arc.test.ts +0 -102
  370. package/tests/Math/junction/arc-plane.test.ts +0 -163
  371. package/tests/Math/junction/plane-plane.test.ts +0 -91
  372. package/tests/Math/plane-test.ts +0 -17
  373. package/tests/Math/plane.test.ts +0 -43
  374. package/tests/Math/vec3.test.ts +0 -14
  375. package/timetracks/readme.md +0 -1
  376. package/tsconfig.json +0 -22
  377. package/types.ts +0 -265
  378. package/util/account/create-buffermap-orchastration.ts +0 -85
  379. package/util/account/single-attribute-buffer-management/buffer-manager.ts +0 -149
  380. package/util/account/single-attribute-buffer-management/buffer-orchestrator.ts +0 -332
  381. package/util/account/single-attribute-buffer-management/buffer-orchestrator1.ts +0 -184
  382. package/util/account/single-attribute-buffer-management/index.ts +0 -11
  383. package/util/account/single-attribute-buffer-management/object-store.ts +0 -76
  384. package/util/account/single-attribute-buffer-management/types.ts +0 -43
  385. package/util/build-strategy/general-strategy.ts +0 -99
  386. package/util/build-strategy/static-dynamic.ts +0 -50
  387. package/util/check/typecheck.ts +0 -74
  388. package/util/frame-counter-trigger.ts +0 -99
  389. package/util/geometry/index.ts +0 -64
  390. package/util/gl-util/buffer/attribute-loader.ts +0 -84
  391. package/util/gl-util/buffer/index.ts +0 -6
  392. package/util/gl-util/draw-options/methods.ts +0 -47
  393. package/util/gl-util/uniform-block/manager.ts +0 -210
  394. package/util/gl-util/uniform-block/roadmap.md +0 -70
  395. package/util/gl-util/uniform-block/types.ts +0 -20
  396. package/util/heatwavedatamanager/pointcoordsmeta.ts +0 -28
  397. package/util/heatwavedatamanager/texture-point-sampler.ts +0 -198
  398. package/util/shaderfunctions/geometrytransformations.ts +0 -388
  399. package/util/surface-line-data/arc-bboxes.ts +0 -42
  400. package/util/surface-line-data/flow.ts +0 -52
  401. package/util/surface-line-data/types.ts +0 -27
  402. package/util/webglobjectbuilders.ts +0 -446
  403. package/write-text/context-text-bulk.ts +0 -268
  404. package/write-text/context-text3.ts +0 -253
  405. package/write-text/context-text4.ts +0 -243
  406. /package/{dist/Math → Math}/arc-cdf-points.js +0 -0
  407. /package/{dist/Math → Math}/arc-generate-points-exponantial.js +0 -0
  408. /package/{dist/Math → Math}/arc.js +0 -0
  409. /package/{dist/Math → Math}/circle-cdf-points.js +0 -0
  410. /package/{dist/Math → Math}/circle.js +0 -0
  411. /package/{dist/Math → Math}/constants.js +0 -0
  412. /package/{dist/Math → Math}/juction/arc-plane.js +0 -0
  413. /package/{dist/Math → Math}/juction/line-sphere.js +0 -0
  414. /package/{dist/Math → Math}/juction/plane-plane.js +0 -0
  415. /package/{dist/Math → Math}/line.js +0 -0
  416. /package/{dist/Math → Math}/matrix4.js +0 -0
  417. /package/{dist/Math → Math}/methods.js +0 -0
  418. /package/{dist/Math → Math}/plane.js +0 -0
  419. /package/{dist/Math → Math}/quaternion.js +0 -0
  420. /package/{dist/Math → Math}/templete-shapes/grid-visually-equal.js +0 -0
  421. /package/{dist/Math → Math}/types.js +0 -0
  422. /package/{dist/Math → Math}/vec3.js +0 -0
  423. /package/{dist/programs → programs}/line-on-globe/linestrip/data.js +0 -0
  424. /package/{dist/programs → programs}/line-on-globe/linestrip/linestrip.js +0 -0
  425. /package/{dist/programs → programs}/line-on-globe/naive-accurate-flexible.js +0 -0
  426. /package/{dist/programs → programs}/polygon-on-globe/texture-dem-triangle-test-plugin.js +0 -0
  427. /package/{dist/programs → programs}/polygon-on-globe/texture-dem-triangles.js +0 -0
  428. /package/{dist/programs → programs}/programcache.js +0 -0
  429. /package/{dist/programs → programs}/rings/partial-ring/piece-of-pie.js +0 -0
  430. /package/{dist/programs → programs}/totems/canvas-webglobe-info.js +0 -0
  431. /package/{dist/programs → programs}/totems/globe-changes.js +0 -0
  432. /package/{dist/programs → programs}/totems/index.js +0 -0
  433. /package/{dist/programs → programs}/vectorfields/logics/constants.js +0 -0
  434. /package/{dist/programs → programs}/vectorfields/logics/ubo-new.js +0 -0
  435. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/bearing-line/adapters.js +0 -0
  436. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/bearing-line/plugin.js +0 -0
  437. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/bearing-line/types.js +0 -0
  438. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/circle-line-chain/adapters.js +0 -0
  439. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/circle-line-chain/chain-list-map.js +0 -0
  440. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/circle-line-chain/plugin.js +0 -0
  441. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/circle-line-chain/types.js +0 -0
  442. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/range-ring/adapters.js +0 -0
  443. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/range-ring/enum.js +0 -0
  444. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/range-ring/plugin.js +0 -0
  445. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/range-ring/rangeringangletext.js +0 -0
  446. /package/{dist/range-tools-on-terrain → range-tools-on-terrain}/range-ring/types.js +0 -0
  447. /package/{dist/rangerings → rangerings}/enum.js +0 -0
  448. /package/{dist/semiplugins → semiplugins}/interface.js +0 -0
  449. /package/{dist/semiplugins → semiplugins}/lightweight/line-plugin.js +0 -0
  450. /package/{dist/semiplugins → semiplugins}/lightweight/piece-of-pie-plugin.js +0 -0
  451. /package/{dist/semiplugins → semiplugins}/shape-on-terrain/arc-plugin.js +0 -0
  452. /package/{dist/semiplugins → semiplugins}/shape-on-terrain/circle-plugin.js +0 -0
  453. /package/{dist/semiplugins → semiplugins}/shape-on-terrain/padding-1-degree.js +0 -0
  454. /package/{dist/semiplugins → semiplugins}/shape-on-terrain/terrain-cover/texture-dem-cover.js +0 -0
  455. /package/{dist/semiplugins → semiplugins}/type.js +0 -0
  456. /package/{dist/types.js → types.js} +0 -0
  457. /package/{dist/util → util}/account/create-buffermap-orchastration.js +0 -0
  458. /package/{dist/util → util}/account/single-attribute-buffer-management/buffer-manager.js +0 -0
  459. /package/{dist/util → util}/account/single-attribute-buffer-management/buffer-orchestrator.js +0 -0
  460. /package/{dist/util → util}/account/single-attribute-buffer-management/buffer-orchestrator1.js +0 -0
  461. /package/{dist/util → util}/account/single-attribute-buffer-management/index.js +0 -0
  462. /package/{dist/util → util}/account/single-attribute-buffer-management/object-store.js +0 -0
  463. /package/{dist/util → util}/account/single-attribute-buffer-management/types.js +0 -0
  464. /package/{dist/util → util}/build-strategy/general-strategy.js +0 -0
  465. /package/{dist/util → util}/build-strategy/static-dynamic.js +0 -0
  466. /package/{dist/util → util}/check/typecheck.js +0 -0
  467. /package/{dist/util → util}/frame-counter-trigger.js +0 -0
  468. /package/{dist/util → util}/gl-util/buffer/attribute-loader.js +0 -0
  469. /package/{dist/util → util}/gl-util/buffer/index.js +0 -0
  470. /package/{dist/util → util}/gl-util/draw-options/methods.js +0 -0
  471. /package/{dist/util → util}/gl-util/uniform-block/manager.js +0 -0
  472. /package/{dist/util → util}/gl-util/uniform-block/types.js +0 -0
  473. /package/{dist/util → util}/heatwavedatamanager/pointcoordsmeta.js +0 -0
  474. /package/{dist/util → util}/heatwavedatamanager/texture-point-sampler.js +0 -0
  475. /package/{dist/util → util}/shaderfunctions/geometrytransformations.js +0 -0
  476. /package/{dist/util → util}/surface-line-data/arc-bboxes.js +0 -0
  477. /package/{dist/util → util}/surface-line-data/flow.js +0 -0
  478. /package/{dist/util → util}/surface-line-data/types.js +0 -0
  479. /package/{dist/util → util}/webglobjectbuilders.js +0 -0
  480. /package/{dist/write-text → write-text}/context-text3.js +0 -0
@@ -1,329 +0,0 @@
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,299 +0,0 @@
1
- import { Vec3 } from './types';
2
-
3
- // --- Utility Functions for 3D Vector Operations --- (Assumed to be the same as provided)
4
-
5
- /**
6
- * Normalizes a 3D vector to unit length.
7
- * @param v The input vector.
8
- * @returns The normalized vector. Returns [0,0,0] if the input vector is a zero vector.
9
- */
10
- function vec3Normalize(v: Vec3): Vec3 {
11
- const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
12
- if (len < 1e-9) { // Use a small epsilon to handle near-zero vectors
13
- return [0, 0, 0];
14
- }
15
- return [v[0] / len, v[1] / len, v[2] / len];
16
- }
17
-
18
- /**
19
- * Calculates the dot product of two 3D vectors.
20
- * @param v1 The first vector.
21
- * @param v2 The second vector.
22
- * @returns The dot product.
23
- */
24
- function vec3Dot(v1: Vec3, v2: Vec3): number {
25
- return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
26
- }
27
-
28
- /**
29
- * Calculates the cross product of two 3D vectors.
30
- * @param v1 The first vector.
31
- * @param v2 The second vector.
32
- * @returns The cross product vector.
33
- */
34
- function vec3Cross(v1: Vec3, v2: Vec3): Vec3 {
35
- return [
36
- v1[1] * v2[2] - v1[2] * v2[1],
37
- v1[2] * v2[0] - v1[0] * v2[2],
38
- v1[0] * v2[1] - v1[1] * v2[0]
39
- ];
40
- }
41
-
42
- /**
43
- * Scales a 3D vector by a scalar.
44
- * @param v The input vector.
45
- * @param s The scalar value.
46
- * @returns The scaled vector.
47
- */
48
- function vec3Scale(v: Vec3, s: number): Vec3 {
49
- return [v[0] * s, v[1] * s, v[2] * s];
50
- }
51
-
52
- /**
53
- * Adds two 3D vectors.
54
- * @param v1 The first vector.
55
- * @param v2 The second vector.
56
- * @returns The resulting vector.
57
- */
58
- function vec3Add(v1: Vec3, v2: Vec3): Vec3 {
59
- return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]];
60
- }
61
-
62
- /**
63
- * Subtracts the second 3D vector from the first.
64
- * @param v1 The first vector.
65
- * @param v2 The second vector.
66
- * @returns The resulting vector.
67
- */
68
- function vec3Sub(v1: Vec3, v2: Vec3): Vec3 {
69
- return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]];
70
- }
71
-
72
- /**
73
- * Clamps a numerical value within a specified range.
74
- * @param value The value to clamp.
75
- * @param min The minimum allowed value.
76
- * @param max The maximum allowed value.
77
- * @returns The clamped value.
78
- */
79
- function clamp(value: number, min: number, max: number): number {
80
- return Math.max(min, Math.min(value, max));
81
- }
82
-
83
-
84
- function vec3Distance(v1: Vec3, v2: Vec3): number {
85
- const dx = v1[0] - v2[0];
86
- const dy = v1[1] - v2[1];
87
- const dz = v1[2] - v2[2];
88
- return Math.sqrt(dx * dx + dy * dy + dz * dz);
89
- }
90
-
91
- /**
92
- * Rotates a vector around a given axis by a specified angle using Rodrigues' rotation formula.
93
- * The axis must be a unit vector for correct results.
94
- * @param v The vector to rotate.
95
- * @param axis The unit axis of rotation.
96
- * @param angle The angle of rotation in radians.
97
- * @returns The rotated vector.
98
- */
99
- function rotateVector(v: Vec3, axis: Vec3, angle: number): Vec3 {
100
- const cosAngle = Math.cos(angle);
101
- const sinAngle = Math.sin(angle);
102
- const oneMinusCos = 1.0 - cosAngle;
103
-
104
- const dotAxisV = vec3Dot(axis, v);
105
- const crossAxisV = vec3Cross(axis, v);
106
-
107
- // Rodrigues' rotation formula:
108
- // v' = v * cos(angle) + (axis x v) * sin(angle) + axis * (axis . v) * (1 - cos(angle))
109
- const term1 = vec3Scale(v, cosAngle);
110
- const term2 = vec3Scale(crossAxisV, sinAngle);
111
- const term3 = vec3Scale(axis, dotAxisV * oneMinusCos);
112
-
113
- return vec3Add(vec3Add(term1, term2), term3);
114
- }
115
-
116
- // --- Main Function for Arc Point Generation (CORRECTED) ---
117
-
118
- /**
119
- * Generates points on the shortest arc between p0 and p1 on a unit sphere.
120
- * The arc is formed by rotating p0 around axisA. The density of points
121
- * is higher closer to the attractionPoint, controlled by an exponential falloff.
122
- *
123
- * @param p0 The starting point of the arc (will be normalized).
124
- * @param p1 The ending point of the arc (will be normalized).
125
- * @param axisA The axis of rotation (will be normalized).
126
- * @param attractionPoint The point on the unit sphere that attracts sampled points (will be normalized).
127
- * @param pointCount The total number of points to generate on the arc, including p0 and p1.
128
- * @param attractionStrength Controls the density bias via exponential decay.
129
- * A value of 0 results in uniform sampling.
130
- * Higher positive values (e.g., 10, 50, 200) result in exponentially stronger attraction.
131
- * @returns An array of `Vec3` representing the deterministically sampled points on the arc.
132
- */
133
- export function generateArcPoints(
134
- p0: Vec3,
135
- p1: Vec3,
136
- axisA: Vec3,
137
- attractionPoint: Vec3,
138
- pointCount: number,
139
- attractionStrength: number
140
- ): Vec3[] {
141
- const sampledPoints: Vec3[] = [];
142
- const epsilon = 1e-9;
143
-
144
- // 1. Normalize all input vectors
145
- let nP0 = vec3Normalize(p0);
146
- let nP1 = vec3Normalize(p1);
147
- let nAxisA = vec3Normalize(axisA);
148
- let nAttractionPoint = vec3Normalize(attractionPoint);
149
-
150
- // Handle edge cases for pointCount
151
- if (pointCount < 1) return [];
152
- if (pointCount === 1) return [nP0];
153
-
154
- // 2. Determine the total rotation angle
155
- const p0Projected = vec3Sub(nP0, vec3Scale(nAxisA, vec3Dot(nP0, nAxisA)));
156
- const p1Projected = vec3Sub(nP1, vec3Scale(nAxisA, vec3Dot(nP1, nAxisA)));
157
-
158
- if (vec3Dot(p0Projected, p0Projected) < epsilon * epsilon || vec3Dot(p1Projected, p1Projected) < epsilon * epsilon) {
159
- console.warn("generateArcPoints: p0 or p1 is colinear with axisA. Cannot form a valid arc. Falling back to linear interpolation.");
160
- for (let i = 0; i < pointCount; i++) {
161
- const t = i / (pointCount - 1);
162
- sampledPoints.push(vec3Normalize(vec3Add(vec3Scale(nP0, 1 - t), vec3Scale(nP1, t))));
163
- }
164
- return sampledPoints;
165
- }
166
-
167
- const nP0Projected = vec3Normalize(p0Projected);
168
- const nP1Projected = vec3Normalize(p1Projected);
169
- const crossProj = vec3Cross(nP0Projected, nP1Projected);
170
- const totalRotationAngle = Math.atan2(vec3Dot(crossProj, nAxisA), vec3Dot(nP0Projected, nP1Projected));
171
-
172
- if (Math.abs(totalRotationAngle) < epsilon) {
173
- for (let i = 0; i < pointCount; i++) sampledPoints.push(nP0);
174
- return sampledPoints;
175
- }
176
-
177
- // 3. Find alpha_A: the angle parameter where the arc is closest to the attractionPoint
178
-
179
- const alpha_A = (() => {
180
- const dotProduct = vec3Dot(nP0, nAttractionPoint);
181
- return Math.acos(dotProduct);
182
- })()
183
-
184
- // let alpha_A = 0.0;
185
- // let minAngleToAttraction = Math.PI;
186
- // const testSteps = 1000;
187
- // for (let i = 0; i <= testSteps; i++) {
188
- // const t_test = i / testSteps;
189
- // const currentAlpha = totalRotationAngle * t_test;
190
- // const pArcTest = rotateVector(nP0, nAxisA, currentAlpha);
191
- // const dotProduct = clamp(vec3Dot(pArcTest, nAttractionPoint), -1.0, 1.0);
192
- // const currentAngle = Math.acos(dotProduct);
193
- // if (currentAngle < minAngleToAttraction) {
194
- // minAngleToAttraction = currentAngle;
195
- // alpha_A = currentAlpha;
196
- // }
197
- // }
198
-
199
- // 4. Define the PDF and CDF based on an exponential decay model
200
- const t_peak = totalRotationAngle !== 0 ? clamp(alpha_A / totalRotationAngle, 0, 1) : 0;
201
- const s = Math.max(0, attractionStrength);
202
-
203
- // 5. Generate deterministic points using inverse transform sampling
204
- for (let i = 0; i < pointCount; i++) {
205
- const u = (pointCount === 1) ? 0.5 : i / (pointCount - 1);
206
- let t_sampled: number;
207
-
208
- if (s < epsilon) {
209
- t_sampled = u;
210
- } else {
211
- // Correctly calculate the area under the two parts of the exponential PDF
212
- const area1 = (1 - Math.exp(-s * t_peak));
213
- const area2 = (1 - Math.exp(-s * (1 - t_peak)));
214
- const totalIntegratedArea = (area1 + area2) / s;
215
-
216
- if (totalIntegratedArea < epsilon) {
217
- t_sampled = u; // Fallback for extreme strength values
218
- } else {
219
- const cdfAtPeak = (area1 / s) / totalIntegratedArea;
220
-
221
- if (u <= cdfAtPeak) {
222
- // *** BUG FIX START ***
223
- // Correctly invert the CDF for the first part: [0, t_peak]
224
- const u_prime = u / cdfAtPeak;
225
- t_sampled = t_peak + Math.log(Math.exp(-s * t_peak) + u_prime * (1 - Math.exp(-s * t_peak))) / s;
226
- } else {
227
- // Correctly invert the CDF for the second part: [t_peak, 1]
228
- const u_double_prime = (u - cdfAtPeak) / (1 - cdfAtPeak);
229
- t_sampled = t_peak - Math.log(1 - u_double_prime * (1 - Math.exp(-s * (1 - t_peak)))) / s;
230
- }
231
- // *** BUG FIX END ***
232
- }
233
- }
234
-
235
- t_sampled = clamp(t_sampled, 0, 1);
236
- const actualRotationAngle = totalRotationAngle * t_sampled;
237
- const currentPoint = rotateVector(nP0, nAxisA, actualRotationAngle);
238
- sampledPoints.push(currentPoint);
239
- }
240
-
241
- return sampledPoints;
242
- }
243
-
244
-
245
-
246
-
247
- // // --- Example Usage (for demonstration and testing) ---
248
-
249
- // // Example 1: Basic arc, very strong attraction point in the middle
250
- // const p0_ex1: Vec3 = [1, 0, 0];
251
- // const p1_ex1: Vec3 = [0, 1, 0]; // 90 deg rotation around Z-axis
252
- // const axisA_ex1: Vec3 = [0, 0, 1];
253
- // const attractionPoint_ex1: Vec3 = [Math.sqrt(0.5), Math.sqrt(0.5), 0]; // On the arc, middle of P0-P1
254
- // const numPoints_ex1 = 21;
255
- // const strength_ex1 = 50.0; // Very strong attraction with the new exponential model
256
-
257
- // console.log("--- Example 1: Attraction point in the middle of the arc (Exponentially Strong) ---");
258
- // const points1 = generateArcPoints(p0_ex1, p1_ex1, axisA_ex1, attractionPoint_ex1, numPoints_ex1, strength_ex1);
259
- // console.log(`Generated ${points1.length} points.`);
260
- // // With high strength, points should be extremely clustered around the attraction point.
261
- // const sequentialDistances1 = points1.map((p, i) => {
262
- // if (i === 0) return 0;
263
- // return vec3Distance(points1[i - 1], p);
264
- // });
265
- // console.log("Distances near the start:", sequentialDistances1.slice(1, 5).map(d => d.toFixed(5)));
266
- // console.log("Distances near the middle (attraction point):", sequentialDistances1.slice(9, 13).map(d => d.toFixed(5)));
267
- // console.log("Distances near the end:", sequentialDistances1.slice(-4).map(d => d.toFixed(5)));
268
- // // Expected: Distances near the middle should be MUCH smaller than at the ends.
269
-
270
- // // Example 2: Attraction point near p0, very high strength
271
- // const p0_ex2: Vec3 = [1, 0, 0];
272
- // const p1_ex2: Vec3 = [0, 1, 0];
273
- // const axisA_ex2: Vec3 = [0, 0, 1];
274
- // const attractionPoint_ex2: Vec3 = [0.99, 0.01, 0]; // Very close to P0
275
- // const numPoints_ex2 = 10;
276
- // const strength_ex2 = 100.0; // Extremely strong attraction
277
-
278
- // console.log("\n--- Example 2: Attraction point near the start (p0) ---");
279
- // const points2 = generateArcPoints(p0_ex2, p1_ex2, axisA_ex2, attractionPoint_ex2, numPoints_ex2, strength_ex2);
280
- // console.log(`Generated ${points2.length} points.`);
281
- // 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))));
282
- // console.log("Last 5 points (should be very spread out):", points2.slice(-5).map(p => p.map(coord => coord.toFixed(5))));
283
-
284
-
285
- // // Example 4: No attraction (uniform distribution)
286
- // const p0_ex4: Vec3 = [1, 0, 0];
287
- // const p1_ex4: Vec3 = [0, 1, 0];
288
- // const axisA_ex4: Vec3 = [0, 0, 1];
289
- // const attractionPoint_ex4: Vec3 = [1, 0, 0]; // Irrelevant when strength is 0
290
- // const numPoints_ex4 = 11;
291
- // const strength_ex4 = 0.0; // No attraction (uniform)
292
-
293
- // console.log("\n--- Example 4: Uniform distribution (strength = 0) ---");
294
- // const points4 = generateArcPoints(p0_ex4, p1_ex4, axisA_ex4, attractionPoint_ex4, numPoints_ex4, strength_ex4);
295
- // const sequentialDistances4 = points4.map((p, i) => {
296
- // if (i === 0) return 0;
297
- // return vec3Distance(points4[i - 1], p);
298
- // });
299
- // console.log("Sequential distances (should be almost identical):", sequentialDistances4.slice(1).map(d => d.toFixed(5)));