@pirireis/webglobeplugins 0.17.1 → 1.0.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 (272) hide show
  1. package/Math/{angle-calculation.js → angle-calculation.ts} +18 -14
  2. package/Math/{arc-cdf-points.js → arc-cdf-points.ts} +329 -272
  3. package/Math/{arc-generate-points-exponantial.js → arc-generate-points-exponantial.ts} +299 -254
  4. package/Math/{arc.js → arc.ts} +421 -292
  5. package/Math/bounds/line-bbox.js +225 -186
  6. package/Math/{circle-cdf-points.js → circle-cdf-points.ts} +143 -78
  7. package/Math/{circle.js → circle.ts} +49 -33
  8. package/Math/{constants.js → constants.ts} +12 -4
  9. package/Math/contour/{quadtreecontours.js → quadtreecontours.ts} +371 -300
  10. package/Math/contour/quadtreecontours1.js +336 -298
  11. package/Math/{finite-line-2d.js → finite-line-2d.ts} +68 -58
  12. package/Math/haversine.ts +33 -0
  13. package/Math/index.js +0 -1
  14. package/Math/juction/{arc-plane.js → arc-plane.ts} +203 -143
  15. package/Math/juction/{line-sphere.js → line-sphere.ts} +32 -22
  16. package/Math/juction/{plane-plane.js → plane-plane.ts} +62 -53
  17. package/Math/{line.js → line.ts} +84 -52
  18. package/Math/matrix4.ts +0 -0
  19. package/Math/mesh/mapbox-delaunay.d.ts +74 -0
  20. package/Math/{methods.js → methods.ts} +182 -113
  21. package/Math/{plane.js → plane.ts} +92 -56
  22. package/Math/{quaternion.js → quaternion.ts} +128 -106
  23. package/Math/roadmap.md +10 -0
  24. package/Math/templete-shapes/{grid-visually-equal.js → grid-visually-equal.ts} +118 -65
  25. package/Math/tessellation/constants.ts +1 -0
  26. package/Math/tessellation/methods.ts +79 -0
  27. package/Math/tessellation/nearest-value-padding.ts +147 -0
  28. package/Math/tessellation/roadmap.md +48 -0
  29. package/Math/tessellation/spherical-triangle-area.ts +127 -0
  30. package/Math/tessellation/tile-merger.ts +578 -0
  31. package/Math/tessellation/triangle-tessellation.ts +533 -0
  32. package/Math/tessellation/types.ts +1 -0
  33. package/Math/types.ts +68 -0
  34. package/Math/utils.js +3 -2
  35. package/Math/{vec3.js → vec3.ts} +227 -151
  36. package/Math/xyz-tile.ts +26 -0
  37. package/algorithms/search-binary.js +14 -16
  38. package/altitude-locator/adaptors.js +0 -1
  39. package/altitude-locator/keymethod.js +0 -1
  40. package/altitude-locator/plugin.js +445 -345
  41. package/altitude-locator/types.js +26 -21
  42. package/compass-rose/compass-rose-padding-flat.js +274 -230
  43. package/compass-rose/{compass-text-writer.js → compass-text-writer.ts} +210 -155
  44. package/compass-rose/index.js +3 -3
  45. package/{constants.js → constants.ts} +8 -6
  46. package/heatwave/datamanager.js +168 -149
  47. package/heatwave/heatwave.js +261 -206
  48. package/heatwave/index.js +5 -5
  49. package/heatwave/isobar.js +340 -303
  50. package/heatwave/{texture-point-sampler.js → texture-point-sampler.ts} +220 -187
  51. package/investigation-tools/draw/tiles/adapters.ts +133 -0
  52. package/investigation-tools/draw/tiles/{tiles.js → tiles.ts} +162 -128
  53. package/jest.config.js +6 -7
  54. package/package.json +1 -1
  55. package/pin/pin-object-array1.js +381 -300
  56. package/pin/pin-point-totem1.js +77 -60
  57. package/programs/arrowfield/arrow-field.js +89 -60
  58. package/programs/arrowfield/logic.js +173 -141
  59. package/programs/data2legend/density-to-legend.js +86 -68
  60. package/programs/data2legend/point-to-density-texture.js +84 -67
  61. package/programs/float2legendwithratio/index.js +3 -2
  62. package/programs/float2legendwithratio/logic.js +144 -118
  63. package/programs/float2legendwithratio/object.js +141 -104
  64. package/programs/helpers/blender.js +73 -58
  65. package/programs/helpers/{fadeaway.js → fadeaway.ts} +73 -55
  66. package/programs/index.js +19 -20
  67. package/programs/line-on-globe/circle-accurate-3d.js +112 -85
  68. package/programs/line-on-globe/circle-accurate-flat.js +200 -148
  69. package/programs/line-on-globe/degree-padding-around-circle-3d.js +134 -102
  70. package/programs/line-on-globe/index.js +0 -1
  71. package/programs/line-on-globe/lines-color-instanced-flat.js +99 -80
  72. package/programs/line-on-globe/linestrip/data.ts +29 -0
  73. package/programs/line-on-globe/linestrip/{linestrip.js → linestrip.ts} +152 -93
  74. package/programs/line-on-globe/{naive-accurate-flexible.js → naive-accurate-flexible.ts} +175 -126
  75. package/programs/line-on-globe/util.js +8 -5
  76. package/programs/picking/pickable-polygon-renderer.js +129 -98
  77. package/programs/picking/pickable-renderer.js +130 -98
  78. package/programs/point-on-globe/element-globe-surface-glow.js +122 -93
  79. package/programs/point-on-globe/element-point-glow.js +114 -80
  80. package/programs/point-on-globe/square-pixel-point.js +139 -120
  81. package/programs/polygon-on-globe/roadmap.md +8 -0
  82. package/programs/polygon-on-globe/texture-dem-triangles.ts +290 -0
  83. package/programs/{programcache.js → programcache.ts} +134 -126
  84. package/programs/rings/index.js +1 -1
  85. package/programs/rings/partial-ring/{piece-of-pie.js → piece-of-pie.ts} +222 -152
  86. package/programs/totems/camera-totem-attactment-interface.ts +4 -0
  87. package/programs/totems/{camerauniformblock.js → camerauniformblock.ts} +326 -230
  88. package/programs/totems/{canvas-webglobe-info.js → canvas-webglobe-info.ts} +147 -132
  89. package/programs/totems/dem-textures-manager.ts +368 -0
  90. package/programs/totems/{globe-changes.js → globe-changes.ts} +79 -59
  91. package/programs/totems/gpu-selection-uniform-block.js +127 -99
  92. package/programs/totems/{index.js → index.ts} +2 -2
  93. package/programs/two-d/pixel-padding-for-compass.js +101 -87
  94. package/programs/util.js +19 -14
  95. package/programs/vectorfields/logics/{constants.js → constants.ts} +5 -4
  96. package/programs/vectorfields/logics/drawrectangleparticles.ts +182 -0
  97. package/programs/vectorfields/logics/index.js +4 -2
  98. package/programs/vectorfields/logics/particle-ubo.ts +23 -0
  99. package/programs/vectorfields/logics/{pixelbased.js → pixelbased.ts} +119 -84
  100. package/programs/vectorfields/logics/ubo.js +57 -51
  101. package/programs/vectorfields/{pingpongbuffermanager.js → pingpongbuffermanager.ts} +113 -73
  102. package/publish.bat +62 -0
  103. package/range-tools-on-terrain/bearing-line/{adapters.js → adapters.ts} +154 -114
  104. package/range-tools-on-terrain/bearing-line/{plugin.js → plugin.ts} +569 -457
  105. package/range-tools-on-terrain/bearing-line/types.ts +65 -0
  106. package/range-tools-on-terrain/circle-line-chain/{adapters.js → adapters.ts} +104 -85
  107. package/range-tools-on-terrain/circle-line-chain/{chain-list-map.js → chain-list-map.ts} +446 -382
  108. package/range-tools-on-terrain/circle-line-chain/{plugin.js → plugin.ts} +607 -464
  109. package/range-tools-on-terrain/circle-line-chain/types.ts +43 -0
  110. package/range-tools-on-terrain/range-ring/{adapters.js → adapters.ts} +114 -93
  111. package/range-tools-on-terrain/range-ring/{enum.js → enum.ts} +2 -2
  112. package/range-tools-on-terrain/range-ring/{plugin.js → plugin.ts} +444 -377
  113. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +396 -0
  114. package/range-tools-on-terrain/range-ring/types.ts +30 -0
  115. package/semiplugins/interface.ts +14 -0
  116. package/semiplugins/lightweight/{line-plugin.js → line-plugin.ts} +342 -221
  117. package/semiplugins/lightweight/{piece-of-pie-plugin.js → piece-of-pie-plugin.ts} +275 -200
  118. package/semiplugins/shape-on-terrain/{arc-plugin.js → arc-plugin.ts} +616 -481
  119. package/semiplugins/shape-on-terrain/{circle-plugin.js → circle-plugin.ts} +588 -444
  120. package/semiplugins/shape-on-terrain/goal.md +12 -0
  121. package/semiplugins/shape-on-terrain/{padding-1-degree.js → padding-1-degree.ts} +713 -539
  122. package/semiplugins/shape-on-terrain/terrain-polygon/adapters.ts +69 -0
  123. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +20 -0
  124. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache.ts +149 -0
  125. package/semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.ts +58 -0
  126. package/semiplugins/shape-on-terrain/terrain-polygon/data/manager.ts +4 -0
  127. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +196 -0
  128. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +209 -0
  129. package/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.ts +144 -0
  130. package/semiplugins/shape-on-terrain/terrain-polygon/data/random.ts +165 -0
  131. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +5 -0
  132. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +37 -0
  133. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.ts +81 -0
  134. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +146 -0
  135. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +90 -0
  136. package/semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.ts +265 -0
  137. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +69 -0
  138. package/semiplugins/shell/bbox-renderer/index.ts +2 -0
  139. package/semiplugins/shell/bbox-renderer/{logic.js → logic.ts} +273 -249
  140. package/semiplugins/shell/bbox-renderer/object.ts +129 -0
  141. package/semiplugins/type.ts +8 -0
  142. package/semiplugins/utility/{container-plugin.js → container-plugin.ts} +126 -94
  143. package/semiplugins/utility/{object-pass-container-plugin.js → object-pass-container-plugin.ts} +101 -80
  144. package/shaders/fragment-toy/firework.js +1 -1
  145. package/shaders/fragment-toy/singularity.js +5 -2
  146. package/terrain-plugin.mmd +83 -0
  147. package/tests/Math/arc-sampling-test.js +367 -0
  148. package/tests/Math/arc-sampling-test.ts +429 -0
  149. package/tests/Math/arc.test.ts +77 -0
  150. package/tests/Math/junction/arc-limit.test.ts +7 -0
  151. package/tests/Math/junction/arc-plane-points.test.ts +196 -0
  152. package/tests/Math/junction/arc-plane.test.ts +172 -0
  153. package/tests/Math/junction/line-sphere.test.ts +127 -0
  154. package/tests/Math/junction/plane-plane.test.ts +91 -0
  155. package/tests/Math/plane-test.ts +17 -0
  156. package/tests/Math/plane.test.ts +43 -0
  157. package/tests/Math/vec3.test.ts +33 -0
  158. package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +78 -63
  159. package/tracks/point-heat-map/index.js +0 -1
  160. package/tracks/point-heat-map/plugin-webworker.js +148 -121
  161. package/tracks/point-heat-map/point-to-heat-map-flow.js +150 -121
  162. package/tracks/point-heat-map/readme.md +15 -0
  163. package/tracks/point-tracks/key-methods.js +3 -2
  164. package/tracks/point-tracks/plugin.js +487 -394
  165. package/tracks/timetracks/adaptors-line-strip.js +79 -65
  166. package/tracks/timetracks/plugin-line-strip.js +295 -240
  167. package/tracks/timetracks/program-line-strip.js +495 -411
  168. package/tracks/timetracks/programpoint-line-strip.js +137 -109
  169. package/tracks/timetracks/readme.md +1 -0
  170. package/tsconfig.json +22 -0
  171. package/types/@pirireis/webglobe.d.ts +102 -0
  172. package/types/delaunator.d.ts +40 -0
  173. package/types/earcut.d.ts +11 -0
  174. package/types/rbush.d.ts +57 -0
  175. package/types.ts +319 -0
  176. package/util/account/bufferoffsetmanager.js +209 -176
  177. package/util/account/create-buffermap-orchastration.ts +85 -0
  178. package/util/account/index.js +6 -3
  179. package/util/account/single-attribute-buffer-management/{buffer-manager.js → buffer-manager.ts} +151 -117
  180. package/util/account/single-attribute-buffer-management/{buffer-orchestrator.js → buffer-orchestrator.ts} +238 -212
  181. package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.js → buffer-orchestrator1.ts} +184 -159
  182. package/util/account/single-attribute-buffer-management/{index.js → index.ts} +11 -4
  183. package/util/account/single-attribute-buffer-management/{object-store.js → object-store.ts} +76 -55
  184. package/util/account/single-attribute-buffer-management/types.ts +43 -0
  185. package/util/account/util.js +22 -18
  186. package/util/algorithms/index.js +0 -1
  187. package/util/algorithms/search-binary.js +26 -25
  188. package/util/build-strategy/{static-dynamic.js → static-dynamic.ts} +50 -41
  189. package/util/check/index.js +0 -1
  190. package/util/check/typecheck.ts +74 -0
  191. package/util/{frame-counter-trigger.js → frame-counter-trigger.ts} +99 -84
  192. package/util/geometry/{index.js → index.ts} +155 -121
  193. package/util/gl-util/buffer/{attribute-loader.js → attribute-loader.ts} +84 -62
  194. package/util/gl-util/buffer/{index.js → index.ts} +6 -3
  195. package/util/gl-util/draw-options/{methods.js → methods.ts} +47 -32
  196. package/util/gl-util/uniform-block/{manager.js → manager.ts} +232 -190
  197. package/util/{webglobe/gldefaultstates.js → globe-default-gl-states.ts} +5 -4
  198. package/util/helper-methods.ts +9 -0
  199. package/util/index.js +9 -10
  200. package/util/interpolation/index.js +0 -1
  201. package/util/interpolation/timetrack/index.js +9 -2
  202. package/util/interpolation/timetrack/timetrack-interpolator.js +94 -79
  203. package/util/interpolation/timetrack/web-worker.js +51 -46
  204. package/util/picking/{fence.js → fence.ts} +47 -41
  205. package/util/picking/picker-displayer.ts +226 -0
  206. package/util/programs/draw-from-pixel-coords.js +201 -164
  207. package/util/programs/{draw-texture-on-canvas.js → draw-texture-on-canvas.ts} +92 -67
  208. package/util/programs/supersampletotextures.js +130 -97
  209. package/util/programs/texturetoglobe.js +153 -128
  210. package/util/shaderfunctions/{geometrytransformations.js → geometrytransformations.ts} +169 -41
  211. package/util/shaderfunctions/index.js +2 -2
  212. package/util/shaderfunctions/nodata.js +4 -2
  213. package/util/shaderfunctions/noisefunctions.js +10 -7
  214. package/util/{webglobjectbuilders.js → webglobjectbuilders.ts} +446 -358
  215. package/vectorfield/arrowfield/adaptor.js +11 -11
  216. package/vectorfield/arrowfield/index.js +3 -3
  217. package/vectorfield/arrowfield/plugin.js +128 -83
  218. package/vectorfield/waveparticles/adaptor.js +16 -15
  219. package/vectorfield/waveparticles/index.js +3 -3
  220. package/vectorfield/waveparticles/plugin.ts +506 -0
  221. package/vectorfield/wind/adapters/image-to-fields.ts +74 -0
  222. package/vectorfield/wind/adapters/types.ts +12 -0
  223. package/vectorfield/wind/{imagetovectorfieldandmagnitude.js → imagetovectorfieldandmagnitude.ts} +78 -56
  224. package/vectorfield/wind/index.js +5 -5
  225. package/vectorfield/wind/plugin-persistant copy.ts +461 -0
  226. package/vectorfield/wind/plugin-persistant.ts +483 -0
  227. package/vectorfield/wind/plugin.js +883 -685
  228. package/vectorfield/wind/vectorfieldimage.js +27 -23
  229. package/write-text/{context-text-bulk.js → context-text-bulk.ts} +285 -200
  230. package/write-text/context-text3.ts +252 -0
  231. package/write-text/{context-text4.js → context-text4.ts} +231 -146
  232. package/write-text/context-textDELETE.js +125 -94
  233. package/write-text/objectarraylabels/{index.js → index.ts} +2 -2
  234. package/write-text/objectarraylabels/objectarraylabels.d.ts +72 -0
  235. package/write-text/objectarraylabels/objectarraylabels.js +247 -200
  236. package/Math/matrix4.js +0 -1
  237. package/Math/tessellation/earcut/adapters.js +0 -37
  238. package/Math/tessellation/hybrid-triangle-tessellation-meta.js +0 -123
  239. package/Math/tessellation/methods.js +0 -46
  240. package/Math/tessellation/shred-input.js +0 -18
  241. package/Math/tessellation/tile-merger.js +0 -298
  242. package/Math/tessellation/tiler.js +0 -50
  243. package/Math/tessellation/triangle-tessellation-meta.js +0 -523
  244. package/Math/tessellation/triangle-tessellation.js +0 -14
  245. package/Math/tessellation/types.js +0 -1
  246. package/Math/tessellation/zoom-catch.js +0 -1
  247. package/Math/types.js +0 -1
  248. package/investigation-tools/draw/tiles/adapters.js +0 -67
  249. package/programs/line-on-globe/linestrip/data.js +0 -4
  250. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin-triangle.js +0 -328
  251. package/programs/polygon-on-globe/texture-dem-triangles.js +0 -268
  252. package/programs/vectorfields/logics/drawrectangleparticles.js +0 -114
  253. package/programs/vectorfields/logics/drawrectangleparticles1.js +0 -112
  254. package/programs/vectorfields/logics/ubo-new.js +0 -25
  255. package/range-tools-on-terrain/bearing-line/types.js +0 -1
  256. package/range-tools-on-terrain/circle-line-chain/types.js +0 -1
  257. package/range-tools-on-terrain/range-ring/rangeringangletext.js +0 -331
  258. package/range-tools-on-terrain/range-ring/types.js +0 -9
  259. package/semiplugins/interface.js +0 -1
  260. package/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.js +0 -1
  261. package/semiplugins/shell/bbox-renderer/index.js +0 -2
  262. package/semiplugins/shell/bbox-renderer/object.js +0 -65
  263. package/semiplugins/type.js +0 -1
  264. package/types.js +0 -19
  265. package/util/account/create-buffermap-orchastration.js +0 -39
  266. package/util/account/single-attribute-buffer-management/types.js +0 -1
  267. package/util/check/typecheck.js +0 -66
  268. package/util/gl-util/uniform-block/types.js +0 -1
  269. package/util/picking/picker-displayer.js +0 -134
  270. package/util/webglobe/index.js +0 -2
  271. package/vectorfield/waveparticles/plugin.js +0 -290
  272. package/write-text/context-text3.js +0 -167
@@ -0,0 +1,196 @@
1
+ import { Plane, Arc, Vec3, Sphere, Quaternion } from '../../../Math/types';
2
+ import * as plane from '../../../Math/plane';
3
+ import * as arc from '../../../Math/arc';
4
+ import * as vec3 from '../../../Math/vec3';
5
+ import * as quateernion from '../../../Math/quaternion';
6
+ import { pointsOnArc } from '../../../Math/juction/arc-plane';
7
+ import { EPSILON } from '../../../Math/constants';
8
+
9
+ describe('pointsOnArc', () => {
10
+ const inArc = arc.create(vec3.create(1, 0, 0), vec3.create(0, 1, 0));
11
+ const junctionPlane = plane.create(vec3.create(0, 0, 1), 0);
12
+ const outPoints: [Vec3, Vec3] = [vec3.create(), vec3.create()];
13
+
14
+ beforeEach(() => {
15
+ // Reset arc and plane before each test
16
+ arc.set(inArc, vec3.create(1, 0, 0), vec3.create(0, 1, 0)); // 90-degree arc on XY plane
17
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 0); // XY plane
18
+ vec3.set(outPoints[0], 0, 0, 0);
19
+ vec3.set(outPoints[1], 0, 0, 0);
20
+ });
21
+
22
+ test('should return 0 if junction plane is too far', () => {
23
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 1.1);
24
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
25
+ expect(count).toBe(0);
26
+ });
27
+
28
+ test('should return 0 if junction plane is too far (negative distance)', () => {
29
+ plane.set(junctionPlane, vec3.create(0, 0, 1), -1.1);
30
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
31
+ expect(count).toBe(0);
32
+ });
33
+
34
+ test('should return 0 if planes are parallel and distinct', () => {
35
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 0.5); // Plane parallel to the arc's plane
36
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
37
+ expect(count).toBe(0);
38
+ });
39
+
40
+ test('should return 1 point for a tangent junction plane at an arc endpoint', () => {
41
+ plane.set(junctionPlane, vec3.create(1, 0, 0), 1); // Tangent at (1,0,0)
42
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
43
+ expect(count).toBe(1);
44
+ expect(vec3.equals(outPoints[0], vec3.create(1, 0, 0))).toBe(true);
45
+ });
46
+
47
+ test('should return 2 intersection points when arc endpoints are the intersection points', () => {
48
+ const r2 = Math.sqrt(2) / 2;
49
+ plane.set(junctionPlane, vec3.create(r2, r2, 0), r2); // Plane whose intersection with the unit sphere includes the arc endpoints
50
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
51
+ expect(count).toBe(2);
52
+ const p0Found = vec3.equals(outPoints[0], inArc.p0) || vec3.equals(outPoints[1], inArc.p0);
53
+ const p1Found = vec3.equals(outPoints[0], inArc.p1) || vec3.equals(outPoints[1], inArc.p1);
54
+ expect(p0Found).toBe(true);
55
+ expect(p1Found).toBe(true);
56
+ });
57
+
58
+ test('should return 2 intersection points for a 90-degree arc', () => {
59
+ arc.set(inArc, vec3.create(1, 0, 0), vec3.create(0, 1, 0)); // 90-degree arc on XY plane
60
+ const r2 = Math.sqrt(2) / 2;
61
+ plane.set(junctionPlane, vec3.create(r2, -r2, 0), 0); // Plane intersecting at (r2, r2, 0) and (-r2, -r2, 0)
62
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
63
+ expect(count).toBe(1);
64
+ expect(vec3.equals(outPoints[0], vec3.create(r2, r2, 0))).toBe(true);
65
+ });
66
+
67
+ test('should return 1 intersection point if only one is on the arc', () => {
68
+ const r2 = Math.sqrt(2) / 2;
69
+ arc.set(inArc, vec3.create(1, 0, 0), vec3.create(r2, r2, 0)); // 45-degree arc
70
+ plane.set(junctionPlane, vec3.create(0, 1, 0), 0); // XZ plane, intersects circle at (1,0,0) and (-1,0,0)
71
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
72
+ expect(count).toBe(1);
73
+ expect(vec3.equals(outPoints[0], vec3.create(1, 0, 0))).toBe(true);
74
+ });
75
+
76
+ test('should return 1 if intersection point is on the arc segment', () => {
77
+ const r2 = Math.sqrt(2) / 2;
78
+ arc.set(inArc, vec3.create(r2, r2, 0), vec3.create(-r2, r2, 0)); // Arc in the upper XY quadrant
79
+ plane.set(junctionPlane, vec3.create(1, 0, 0), 0); // YZ plane, intersects circle at (0,1,0) and (0,-1,0)
80
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
81
+ expect(count).toBe(1);
82
+ expect(vec3.equals(outPoints[0], vec3.create(0, 1, 0))).toBe(true);
83
+ });
84
+
85
+ test('should return 1 intersection point when plane cuts through middle of 90-degree arc', () => {
86
+ const r2 = Math.sqrt(2) / 2;
87
+ arc.set(inArc, vec3.create(1, 0, 0), vec3.create(0, 1, 0)); // 90-degree arc
88
+ plane.set(junctionPlane, vec3.create(1, -1, 0), 0); // Plane intersecting at (r2, r2, 0) and (-r2, -r2, 0)
89
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
90
+ expect(count).toBe(1);
91
+ const expectedPoint = vec3.create(r2, r2, 0);
92
+ expect(vec3.equals(outPoints[0], expectedPoint)).toBe(true);
93
+ });
94
+
95
+ test('long 10 lat 10, long -10 lat 10, cut from 0 long meridian', () => {
96
+ const r2 = Math.sqrt(2) / 2;
97
+
98
+ const long10lat10 = vec3.create()
99
+ const long_10lat10 = vec3.create()
100
+ vec3.fromLongLatToUnitVector(long10lat10,[10 * Math.PI / 180, 10 * Math.PI / 180]);
101
+ vec3.fromLongLatToUnitVector(long_10lat10,[-10 * Math.PI / 180, 10 * Math.PI / 180]);
102
+ arc.set(inArc, long10lat10, long_10lat10); // Arc in the upper XY quadrant
103
+
104
+ plane.set(junctionPlane, vec3.createUnitVectorFromLongLat([Math.PI/2,0]),0); // YZ plane, intersects circle at (1,0,0) and (-1,0,0)
105
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
106
+ expect(count).toBe(1);
107
+
108
+ // calculate expected point with quaternion rotation. rotate long10Lat10 by half the angle between the two arc endpoints
109
+ const angle = Math.acos(vec3.dot(long10lat10, long_10lat10));
110
+ const halfAngle = angle / 2;
111
+ const axis = vec3.clone(inArc.normal);
112
+
113
+ const q1 = quateernion.create();
114
+ quateernion.fromAxisAngle(q1, axis, halfAngle);
115
+ const expectedPoint = vec3.create();
116
+ vec3.applyQuaternion(expectedPoint, long10lat10, q1);
117
+ const isEqual = vec3.equals(outPoints[0], expectedPoint);
118
+ if ( !isEqual ) {
119
+ console.log('angle', long10lat10, long_10lat10, angle);
120
+ console.log('outPoints[0]', outPoints[0]);
121
+ console.log('expectedPoint', expectedPoint);
122
+ }
123
+ expect(isEqual).toBe(true);
124
+ });
125
+
126
+ test('should return 1 point for arc from (10,10) to (10,-10) long/lat, cut by lat 0 plane', () => {
127
+ const deg2rad = Math.PI / 180;
128
+ const p0 = vec3.create();
129
+ const p1 = vec3.create();
130
+ vec3.fromLongLatToUnitVector(p0, [10 * deg2rad, 10 * deg2rad]);
131
+ vec3.fromLongLatToUnitVector(p1, [10 * deg2rad, -10 * deg2rad]);
132
+ arc.set(inArc, p0, p1);
133
+
134
+ // Equatorial plane (lat 0)
135
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 0);
136
+
137
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
138
+ expect(count).toBe(1);
139
+
140
+ const expectedPoint = vec3.create();
141
+ vec3.fromLongLatToUnitVector(expectedPoint, [10 * deg2rad, 0 * deg2rad]);
142
+
143
+ const isEqual = vec3.equals(outPoints[0], expectedPoint);
144
+ if (!isEqual) {
145
+ console.log('outPoints[0]', outPoints[0]);
146
+ console.log('expectedPoint', expectedPoint);
147
+ }
148
+ expect(isEqual).toBe(true);
149
+ });
150
+
151
+
152
+ test('should return 1 point for arc from (10,10) to (0,-10) long/lat, cut by lat 0 plane', () => {
153
+ const deg2rad = Math.PI / 180;
154
+ const p0 = vec3.create();
155
+ const p1 = vec3.create();
156
+ vec3.fromLongLatToUnitVector(p0, [10 * deg2rad, 10 * deg2rad]);
157
+ vec3.fromLongLatToUnitVector(p1, [0 * deg2rad, -10 * deg2rad]);
158
+ arc.set(inArc, p0, p1);
159
+
160
+ // Equatorial plane (lat 0)
161
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 0);
162
+
163
+ const count = pointsOnArc(inArc, junctionPlane, outPoints);
164
+ expect(count).toBe(1);
165
+
166
+ // The intersection point must lie on the great circle defined by p0 and p1,
167
+ // and also on the equator (z=0).
168
+ // The line of intersection of the two great circle planes is given by the cross product of their normals.
169
+ const arcNormal = vec3.clone(inArc.normal);
170
+ const equatorNormal = vec3.create(0, 0, 1);
171
+ const intersectionDir = vec3.create();
172
+ vec3.cross(intersectionDir, arcNormal, equatorNormal);
173
+ vec3.normalize(intersectionDir, intersectionDir);
174
+
175
+ // The two intersection points are intersectionDir and -intersectionDir.
176
+ // We need to find which one is on the arc.
177
+ // The correct point should have a positive dot product with both p0 and p1.
178
+ const dot0 = vec3.dot(intersectionDir, p0);
179
+ const intersectionDirNeg = vec3.clone(intersectionDir);
180
+ vec3.negate(intersectionDirNeg);
181
+ const dot1 = vec3.dot(intersectionDirNeg, p0);
182
+
183
+ const expectedPoint = dot0 > dot1 ? intersectionDir : intersectionDirNeg;
184
+
185
+ const isEqual = vec3.equals(outPoints[0], expectedPoint);
186
+ if (!isEqual) {
187
+ console.log('outPoints[0]', outPoints[0]);
188
+ console.log('expectedPoint', expectedPoint);
189
+ }
190
+ expect(isEqual).toBe(true);
191
+ });
192
+
193
+ });
194
+
195
+
196
+
@@ -0,0 +1,172 @@
1
+ import { Plane, Line, Vec3, Quaternion, Arc, Sphere } from '../../../Math/types';
2
+ import * as plane from '../../../Math/plane';
3
+ import * as line from '../../../Math/line';
4
+ import * as arc from '../../../Math/arc';
5
+ import * as vec3 from '../../../Math/vec3';
6
+ import * as quaternion from '../../../Math/quaternion';
7
+ import { planePlaneJunction } from '../../../Math/juction/plane-plane';
8
+ import { lineSphereIntersection } from '../../../Math/juction/line-sphere';
9
+ import { arcSlice } from '../../../Math/juction/arc-plane';
10
+ import { EPSILON } from '../../../Math/constants';
11
+
12
+
13
+ const arcIn = arc.create(vec3.create(0, 0, 1), vec3.create(1, 0, 0));
14
+ const arcOut: [Arc, Arc] = [
15
+ arc.create(vec3.create(0, 0, 1), vec3.create(1, 0, 0)),
16
+ arc.create(vec3.create(0, 0, 1), vec3.create(1, 0, 0))
17
+ ];
18
+ const arcExpected = arc.create(vec3.create(0, 0, 1), vec3.create(1, 0, 0));
19
+ const junctionPlane = plane.create(vec3.create(0, 0, 1), 0);
20
+
21
+ const origin = { center: vec3.create(0, 0, 0), radius: 1 } as Sphere;
22
+
23
+ const r2 = Math.sqrt(2) / 2;
24
+ const r3 = Math.sqrt(3) / 3;
25
+
26
+ beforeAll(() => {
27
+ // Initialize any necessary data or state before running the tests
28
+ arc.set(arcIn, vec3.create(0, 0, 1), vec3.create(1, 0, 0));
29
+ arc.set(arcOut[0], vec3.create(0, 0, 1), vec3.create(1, 0, 0));
30
+ arc.set(arcOut[1], vec3.create(0, 0, 1), vec3.create(1, 0, 0));
31
+
32
+ plane.set(junctionPlane, vec3.create(0, 0, 1), 0);
33
+
34
+ });
35
+
36
+
37
+
38
+
39
+
40
+ test('arcSlice - No intersection 1', () => {
41
+ junctionPlane.distance = 2; // Set distance to ensure no intersection
42
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
43
+ expect(result).toBe(0);
44
+ });
45
+
46
+
47
+
48
+ test('arcSlice - Full intersection 1', () => {
49
+ junctionPlane.distance = 0; // Set distance to ensure full intersection
50
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
51
+ expect(result).toBe(1);
52
+ const isEqual = arc.equals(arcOut[0], arcExpected);
53
+ expect(isEqual).toBe(true);
54
+ });
55
+
56
+
57
+ test('arcSlice-1', () => {
58
+ // Set up a case where the arc intersects with the plane
59
+
60
+
61
+ const r3 = Math.sqrt(3);
62
+ const juctionNormal = vec3.create(r3, r3, r3);
63
+
64
+ plane.set(junctionPlane, juctionNormal, 0);
65
+
66
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
67
+ expect(result).toBe(1);
68
+ });
69
+
70
+
71
+ test('arcSlice - Plane intersection line is out of sphere', () => {
72
+ // Set up a case where the arc intersects with the plane
73
+
74
+ const point1 = vec3.create(0, 1, 0);
75
+ const point2 = vec3.create(0, 0, 1);
76
+ arc.set(arcIn, point1, point2);
77
+
78
+ const juctionNormal = vec3.create(r3, r3, r3);
79
+
80
+ const closestPoint = vec3.create(r2, r2, 0);
81
+ const distance = vec3.dot(juctionNormal, closestPoint) + EPSILON;
82
+ plane.set(junctionPlane, juctionNormal, distance);
83
+
84
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
85
+ expect(result).toBe(0);
86
+ });
87
+
88
+
89
+ test("arcSlice - Planes are parallel", () => {
90
+
91
+ const point1 = vec3.create(0, 1, 0);
92
+ const point2 = vec3.create(0, 0, 1);
93
+ arc.set(arcIn, point1, point2);
94
+
95
+ plane.fromValues(junctionPlane, 1, 0, 0, 0.3); // Set a plane parallel to the arc's normal
96
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
97
+ expect(result).toBe(0); // Expect no intersection
98
+
99
+ junctionPlane.distance = -0.3;
100
+
101
+ const result2 = arcSlice(arcOut, arcIn, junctionPlane);
102
+ expect(result2).toBe(1); // Expect no intersection
103
+ const isEqual = arc.equals(arcOut[0], arcIn);
104
+ expect(isEqual).toBe(true); // Expect the output arc to be equal to the input arc
105
+ });
106
+
107
+
108
+ test("arcSlice - Arc sliced in half", () => {
109
+
110
+ const point1 = vec3.create(0, 1, 0);
111
+ const point2 = vec3.create(0, 0, 1);
112
+ arc.set(arcIn, point1, point2);
113
+
114
+ expect(vec3.equals(arcIn.normal, vec3.create(1, 0, 0))).toBe(true); // Arc normal should be (1, 0, 0)
115
+
116
+ plane.fromValues(junctionPlane, 0, -r2, r2, 0); // Set a plane parallel to the arc's normal
117
+
118
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
119
+ expect(result).toBe(1); // Expect an intersection
120
+ const expectedPoint1 = vec3.create(0, r2, r2);
121
+ const expectedPoint2 = vec3.create(0, 0, 1);
122
+ arc.set(arcExpected, expectedPoint1, expectedPoint2);
123
+ const isEqual = arc.equals(arcOut[0], arcExpected);
124
+ expect(isEqual).toBe(true); // Expect the output arc to be equal to the expected arc
125
+ });
126
+
127
+
128
+ test("arcSlice - Arc sliced in middle", () => {
129
+ const point1 = vec3.create(0, 1, 0);
130
+ const point2 = vec3.create(0, 0, 1);
131
+ arc.set(arcIn, point1, point2);
132
+
133
+
134
+ plane.fromValues(junctionPlane, 0, r2, r2, r2);
135
+
136
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
137
+ expect(result).toBe(1);
138
+ expect(arc.equals(arcOut[0], arcIn)).toBe(true);
139
+
140
+
141
+ const gap = 1 - r2;
142
+ const stepCount = 100;
143
+
144
+ const points: [Vec3, Vec3] = [vec3.create(0, 1, 0), vec3.create(0, 0, 1)];
145
+ const lineOfPoints = line.create();
146
+ vec3.set(lineOfPoints.direction, 0, -r2, r2);
147
+ // Add normalization:
148
+ vec3.normalize(lineOfPoints.direction, lineOfPoints.direction);
149
+
150
+ for (let i = 0; i < stepCount - 1; i++) {
151
+ const distance = gap * i / stepCount + r2;
152
+ junctionPlane.distance = distance;
153
+ const result = arcSlice(arcOut, arcIn, junctionPlane);
154
+ expect(result).toBe(1);
155
+
156
+ vec3.set(lineOfPoints.origin, 0, r2 * distance, r2 * distance);
157
+ const haveIntersections = lineSphereIntersection(points, lineOfPoints, origin);
158
+ expect(haveIntersections).toBe(true); // Expect the line to intersect with the sphere
159
+
160
+ arc.set(arcExpected, points[0], points[1]);
161
+
162
+ const isEqual = arc.equals(arcOut[0], arcExpected);
163
+ if (!isEqual) {
164
+ console.log('Iteration:', i);
165
+ console.log('Expected arc:', arcExpected);
166
+ console.log('Actual arc:', arcOut[0]);
167
+ console.log('Points from intersection:', points);
168
+ }
169
+ expect(isEqual).toBe(true); // Expect the output arc to be equal to the expected arc
170
+
171
+ }
172
+ });
@@ -0,0 +1,127 @@
1
+ import { lineSphereIntersection } from '../../../Math/juction/line-sphere';
2
+ import { create } from '../../../Math/vec3';
3
+ import type { Line, Sphere, Vec3 } from '../../../Math/types';
4
+
5
+ describe('lineSphereIntersection', () => {
6
+ let intersections: [Vec3, Vec3];
7
+
8
+ beforeEach(() => {
9
+ intersections = [create(0, 0, 0), create(0, 0, 0)];
10
+ });
11
+
12
+ test('should return true for a line intersecting the sphere at two points', () => {
13
+ const line: Line = { origin: create(-2, 0.5, 0), direction: create(1, 0, 0) };
14
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 1 };
15
+
16
+ const result = lineSphereIntersection(intersections, line, sphere);
17
+
18
+ expect(result).toBe(true);
19
+ const t1 = 2 - Math.sqrt(0.75);
20
+ const t2 = 2 + Math.sqrt(0.75);
21
+
22
+ expect(intersections[0][0]).toBeCloseTo(t1 - 2);
23
+ expect(intersections[0][1]).toBeCloseTo(0.5);
24
+ expect(intersections[0][2]).toBeCloseTo(0);
25
+
26
+ expect(intersections[1][0]).toBeCloseTo(t2 - 2);
27
+ expect(intersections[1][1]).toBeCloseTo(0.5);
28
+ expect(intersections[1][2]).toBeCloseTo(0);
29
+ });
30
+
31
+ test('should return true for a line passing through the center of the sphere', () => {
32
+ const line: Line = { origin: create(0, 0, 0), direction: create(0, 1, 0) };
33
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 5 };
34
+
35
+ const result = lineSphereIntersection(intersections, line, sphere);
36
+
37
+ expect(result).toBe(true);
38
+ // Order might vary, so check both possibilities
39
+ const p1 = create(0, -5, 0);
40
+ const p2 = create(0, 5, 0);
41
+ const receivedP1 = intersections[0];
42
+ const receivedP2 = intersections[1];
43
+
44
+ const match1 = Math.abs(receivedP1[1] - p1[1]) < 1e-9 && Math.abs(receivedP2[1] - p2[1]) < 1e-9;
45
+ const match2 = Math.abs(receivedP1[1] - p2[1]) < 1e-9 && Math.abs(receivedP2[1] - p1[1]) < 1e-9;
46
+
47
+ expect(match1 || match2).toBe(true);
48
+ });
49
+
50
+ test('should return true for a tangent line', () => {
51
+ const line: Line = { origin: create(-2, 1, 0), direction: create(1, 0, 0) };
52
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 1 };
53
+
54
+ const result = lineSphereIntersection(intersections, line, sphere);
55
+
56
+ expect(result).toBe(true);
57
+ expect(intersections[0][0]).toBeCloseTo(0);
58
+ expect(intersections[0][1]).toBeCloseTo(1);
59
+ expect(intersections[0][2]).toBeCloseTo(0);
60
+ expect(intersections[1][0]).toBeCloseTo(0);
61
+ expect(intersections[1][1]).toBeCloseTo(1);
62
+ expect(intersections[1][2]).toBeCloseTo(0);
63
+ });
64
+
65
+ test('should return false for a line that does not intersect the sphere', () => {
66
+ const line: Line = { origin: create(-5, 5, 0), direction: create(1, 0, 0) };
67
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 1 };
68
+
69
+ const result = lineSphereIntersection(intersections, line, sphere);
70
+
71
+ expect(result).toBe(false);
72
+ });
73
+
74
+ test('should handle non-normalized direction vectors', () => {
75
+ const line: Line = { origin: create(-10, 0, 0), direction: create(2, 0, 0) };
76
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 1 };
77
+
78
+ const result = lineSphereIntersection(intersections, line, sphere);
79
+
80
+ expect(result).toBe(true);
81
+ const p1 = create(-1, 0, 0);
82
+ const p2 = create(1, 0, 0);
83
+ const receivedP1 = intersections[0];
84
+ const receivedP2 = intersections[1];
85
+
86
+ const match1 = Math.abs(receivedP1[0] - p1[0]) < 1e-9 && Math.abs(receivedP2[0] - p2[0]) < 1e-9;
87
+ const match2 = Math.abs(receivedP1[0] - p2[0]) < 1e-9 && Math.abs(receivedP2[0] - p1[0]) < 1e-9;
88
+
89
+ expect(match1 || match2).toBe(true);
90
+ });
91
+
92
+ test('should handle sphere not at the origin', () => {
93
+ const line: Line = { origin: create(8, 5, 5), direction: create(1, 0, 0) };
94
+ const sphere: Sphere = { center: create(10, 5, 5), radius: 1 };
95
+
96
+ const result = lineSphereIntersection(intersections, line, sphere);
97
+
98
+ expect(result).toBe(true);
99
+ const p1 = create(9, 5, 5);
100
+ const p2 = create(11, 5, 5);
101
+ const receivedP1 = intersections[0];
102
+ const receivedP2 = intersections[1];
103
+
104
+ const match1 = Math.abs(receivedP1[0] - p1[0]) < 1e-9 && Math.abs(receivedP2[0] - p2[0]) < 1e-9;
105
+ const match2 = Math.abs(receivedP1[0] - p2[0]) < 1e-9 && Math.abs(receivedP2[0] - p1[0]) < 1e-9;
106
+
107
+ expect(match1 || match2).toBe(true);
108
+ });
109
+
110
+ test('should return true when the line origin is inside the sphere', () => {
111
+ const line: Line = { origin: create(0, 0, 0), direction: create(1, 1, 1) };
112
+ const sphere: Sphere = { center: create(0, 0, 0), radius: 5 };
113
+
114
+ const result = lineSphereIntersection(intersections, line, sphere);
115
+
116
+ expect(result).toBe(true);
117
+ const t = 5 / Math.sqrt(3);
118
+
119
+ expect(intersections[0][0]).toBeCloseTo(-t);
120
+ expect(intersections[0][1]).toBeCloseTo(-t);
121
+ expect(intersections[0][2]).toBeCloseTo(-t);
122
+
123
+ expect(intersections[1][0]).toBeCloseTo(t);
124
+ expect(intersections[1][1]).toBeCloseTo(t);
125
+ expect(intersections[1][2]).toBeCloseTo(t);
126
+ });
127
+ });
@@ -0,0 +1,91 @@
1
+ import { Plane, Line, Vec3, Quaternion } from '../../../Math/types';
2
+ import * as plane from '../../../Math/plane';
3
+ import * as line from '../../../Math/line';
4
+ import * as vec3 from '../../../Math/vec3';
5
+ import * as quaternion from '../../../Math/quaternion';
6
+ import { planePlaneJunction } from '../../../Math/juction/plane-plane';
7
+
8
+
9
+ let plane1: Plane;
10
+ let plane2: Plane;
11
+ let intersectionLine: Line;
12
+ let quaternion1: Quaternion;
13
+
14
+ beforeAll(() => {
15
+ plane1 = plane.create();
16
+ plane2 = plane.create();
17
+ intersectionLine = line.create();
18
+ quaternion1 = quaternion.create();
19
+ });
20
+
21
+
22
+ test('plane-plane intersection - parallel planes', () => {
23
+ plane.fromValues(plane1, 0, 0, 1, 5); // Plane: z = 5
24
+ plane.fromValues(plane2, 0, 0, 1, 10); // Plane: z = 10
25
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
26
+ expect(result).toBe(false);
27
+ });
28
+
29
+ test('plane-plane intersection - intersecting planes', () => {
30
+ plane.fromValues(plane1, 0, 0, 1, 5); // Plane: z = 5
31
+ plane.fromValues(plane2, 1, 0, 0, 3); // Plane: x = 3
32
+
33
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
34
+ expect(result).toBe(true);
35
+ expect(vec3.equals(intersectionLine.direction, vec3.create(0, 1, 0))).toBe(true);
36
+ expect(vec3.equals(intersectionLine.origin, vec3.create(3, 0, 5))).toBe(true);
37
+ });
38
+
39
+
40
+ test('plane-plane intersection - rotating a plane', () => {
41
+ // plane1 z = 5
42
+ plane.fromValues(plane1, 0, 0, 1, 5);
43
+
44
+ // plane2 x = 3, for the start
45
+ vec3.randomUnit(plane2.normal);
46
+ plane2.distance = 3;
47
+
48
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
49
+ expect(result).toBe(true);
50
+ const quaRotateLine = line.clone(intersectionLine);
51
+
52
+ const step = 90;
53
+ quaternion.fromAxisAngle(quaternion1, plane1.normal, Math.PI / step); // Rotate 90 degrees around Y-axis
54
+
55
+
56
+ for (let i = 0; i < step; i++) {
57
+
58
+ vec3.applyQuaternion(plane2.normal, plane2.normal, quaternion1);
59
+
60
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
61
+
62
+
63
+ line.applyQuaternion(quaRotateLine, quaRotateLine, quaternion1);
64
+
65
+ expect(result).toBe(true);
66
+ expect(vec3.equals(intersectionLine.direction, quaRotateLine.direction)).toBe(true);
67
+ expect(line.contains(intersectionLine, quaRotateLine.origin)).toBe(true);
68
+ }
69
+ });
70
+
71
+ test("plane-plane intersection 1", () => {
72
+ const r2 = Math.sqrt(2) / 2;
73
+ plane.fromValues(plane1, 1, 0, 0, 0);
74
+ plane.fromValues(plane2, 0, -r2, r2, 0);
75
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
76
+
77
+ expect(result).toBe(true);
78
+ console.log(intersectionLine);
79
+ expect(vec3.equals(intersectionLine.direction, vec3.create(0, r2, r2)) || vec3.equals(intersectionLine.direction, vec3.create(0, -r2, -r2))
80
+ ).toBe(true);
81
+ expect(line.contains(intersectionLine, vec3.create(0, 0, 0))).toBe(true);
82
+ });
83
+
84
+ test("plane-plane intersection 2", () => {
85
+ plane.fromValues(plane1, 1, 0, 0, 1);
86
+ plane.fromValues(plane2, 0, 1, 0, 1);
87
+ const result = planePlaneJunction(intersectionLine, plane1, plane2);
88
+ expect(result).toBe(true);
89
+ expect(vec3.equals(intersectionLine.direction, vec3.create(0, 0, 1))).toBe(true);
90
+ expect(line.contains(intersectionLine, vec3.create(1, 1, 0))).toBe(true);
91
+ });
@@ -0,0 +1,17 @@
1
+ import { Vec3, Plane } from '../../Math/types';
2
+ import * as vec3 from '../../Math/vec3';
3
+ import * as plane from '../../Math/plane';
4
+
5
+
6
+ const EPSILON = 1e-6;
7
+
8
+ const _0plane = plane.create(vec3.create(0, 0, 1), 0);
9
+ const _1plane = plane.create(vec3.create(1, 1, 1), 0);
10
+
11
+ beforeAll(() => {
12
+ // Initialize any necessary data or state before running the tests
13
+ plane.set(_0plane, vec3.create(0, 0, 1), 0);
14
+ plane.set(_1plane, vec3.create(1, 1, 1), 0);
15
+ });
16
+
17
+
@@ -0,0 +1,43 @@
1
+ import { Plane, Vec3 } from "../../Math/types";
2
+ import * as vec3 from "../../Math/vec3";
3
+ import * as plane from "../../Math/plane";
4
+
5
+
6
+ const _planeA = /*@__PURE__*/ plane.create(vec3.create(1, 0, 0), 0);
7
+ const _planeB = /*@__PURE__*/ plane.create(vec3.create(0, 1, 0), 0);
8
+ const _vecA = /*@__PURE__*/ vec3.create(1, 0, 0);
9
+
10
+ beforeAll(() => {
11
+ vec3.set(_vecA, 1, 0, 0);
12
+ plane.set(_planeA, vec3.create(1, 0, 0), 0);
13
+ plane.set(_planeB, vec3.create(0, 1, 0), 0);
14
+ });
15
+
16
+ test("Plane: getUnitSphereRadiusAngle", () => {
17
+ const angleA = plane.getUnitSphereRadiusAngle(_planeA);
18
+ const angleB = plane.getUnitSphereRadiusAngle(_planeB);
19
+
20
+ expect(angleA).toBeCloseTo(Math.PI / 2, 5); // 90 degrees
21
+ expect(angleB).toBeCloseTo(Math.PI / 2, 5); // 90 degrees
22
+ });
23
+
24
+
25
+ test("Plane: getUnitSphereRadiusAngle 1", () => {
26
+
27
+ vec3.set(_vecA, 1, 1, 0);
28
+ vec3.normalize(_vecA, _vecA);
29
+ const distance = Math.sqrt(2) / 2; // Distance from origin to the plane
30
+ plane.set(_planeA, _vecA, distance);
31
+ const angleA = plane.getUnitSphereRadiusAngle(_planeA);
32
+ expect(angleA).toBeCloseTo(Math.PI / 4, 5); // 45 degrees
33
+
34
+ for (let i = 0; i < 100; i++) {
35
+ const distance = Math.random();
36
+
37
+ const angle = Math.acos(distance);
38
+ vec3.randomUnit(_vecA)
39
+ plane.set(_planeA, _vecA, distance);
40
+ const angleA = plane.getUnitSphereRadiusAngle(_planeA);
41
+ expect(angleA).toBeCloseTo(angle, 5); // Check if the angle is close to the expected value
42
+ }
43
+ });
@@ -0,0 +1,33 @@
1
+ import { Vec3 } from "../../Math/types";
2
+ import * as vec3 from "../../Math/vec3";
3
+
4
+ test("vec3.create", () => {
5
+ const v = vec3.create(1, 2, 3);
6
+ expect(v).toEqual([1, 2, 3]);
7
+ });
8
+
9
+
10
+ test("vec3.length", () => {
11
+ const v = vec3.create(3, 4, 0);
12
+ const length = vec3.length(v);
13
+ expect(length).toBe(5);
14
+ });
15
+
16
+
17
+ test("LongLat to Vec3 and back", () => {
18
+ const longLat: [number, number] = [0, 0]
19
+ const longLatBack: [number, number] = [0, 0]
20
+ const v = vec3.create();
21
+ for (let lon = -170; lon <= 170; lon += 30) {
22
+ for (let lat = -85; lat <= 85; lat += 30) {
23
+ longLat[0] = lon * Math.PI / 180;
24
+ longLat[1] = lat * Math.PI / 180;
25
+ vec3.fromLongLatToUnitVector(v, longLat);
26
+ vec3.fromUnitVectorToLongLat(longLatBack, v);
27
+ expect(Math.abs(longLatBack[0] - longLat[0]) < 0.00001).toBe(true);
28
+ expect(Math.abs(longLatBack[1] - longLat[1]) < 0.00001).toBe(true);
29
+ }
30
+ }
31
+
32
+ });
33
+