@pirireis/webglobeplugins 0.9.9 → 0.9.11

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 (212) hide show
  1. package/Math/angle-calculation.js +15 -0
  2. package/Math/arc.js +65 -0
  3. package/Math/bounds/line-bbox.js +190 -0
  4. package/Math/constants.js +9 -0
  5. package/Math/frustum/camera.js +24 -0
  6. package/Math/frustum/from-globeinfo.js +48 -0
  7. package/Math/frustum/types.js +2 -0
  8. package/Math/globe-util/horizon-plane.js +112 -0
  9. package/Math/index.js +1 -0
  10. package/Math/juction/arc-plane.js +83 -0
  11. package/Math/juction/line-sphere.js +25 -0
  12. package/Math/juction/plane-plane.js +58 -0
  13. package/Math/line.js +58 -0
  14. package/Math/matrix4.js +1 -0
  15. package/Math/methods.js +206 -0
  16. package/Math/plane.js +62 -0
  17. package/Math/quaternion.js +108 -0
  18. package/Math/types.js +2 -0
  19. package/Math/utils.js +4 -0
  20. package/Math/vec3.js +129 -0
  21. package/algorithms/search-binary.js +19 -0
  22. package/altitude-locator/adaptors.js +1 -0
  23. package/altitude-locator/draw-subset-obj.js +19 -0
  24. package/altitude-locator/keymethod.js +1 -0
  25. package/altitude-locator/plugin.js +357 -0
  26. package/altitude-locator/types.js +23 -0
  27. package/arrowfield/adaptor.js +15 -0
  28. package/arrowfield/index.js +10 -0
  29. package/arrowfield/plugin.js +89 -0
  30. package/bearing-line/index.js +8 -0
  31. package/bearing-line/plugin.js +474 -0
  32. package/circle-line-chain/chain-list-map.js +211 -0
  33. package/circle-line-chain/init.js +1 -0
  34. package/circle-line-chain/plugin.js +449 -0
  35. package/circle-line-chain/util.js +5 -0
  36. package/compass-rose/compass-rose-padding-flat.js +247 -0
  37. package/compass-rose/compass-text-writer.js +161 -0
  38. package/compass-rose/index.js +7 -0
  39. package/compassrose/compassrose.js +300 -0
  40. package/compassrose/index.js +8 -0
  41. package/globe-types.js +1 -0
  42. package/heatwave/index.js +10 -0
  43. package/heatwave/isobar/objectarraylabels.js +206 -0
  44. package/heatwave/isobar/plugin.js +362 -0
  45. package/heatwave/isobar/quadtreecontours.js +316 -0
  46. package/heatwave/plugins/heatwaveglobeshell.js +224 -0
  47. package/index.js +11 -11
  48. package/jest.config.js +7 -0
  49. package/package.json +4 -4
  50. package/partialrings/buffer-manager.js +113 -0
  51. package/partialrings/index.js +41 -0
  52. package/partialrings/plugin.js +171 -0
  53. package/partialrings/program.js +197 -0
  54. package/pin/pin-object-array.js +308 -0
  55. package/pin/pin-point-totem.js +61 -0
  56. package/point-heat-map/adaptors/timetracksplugin-format-to-this.js +66 -0
  57. package/point-heat-map/index.js +1 -0
  58. package/point-heat-map/plugin-webworker.js +131 -0
  59. package/point-heat-map/point-to-heat-map-flow.js +129 -0
  60. package/point-tracks/key-methods.js +5 -0
  61. package/point-tracks/plugin.js +353 -0
  62. package/programs/arrowfield/index.js +7 -0
  63. package/programs/arrowfield/logic.js +149 -0
  64. package/programs/arrowfield/object.js +68 -0
  65. package/programs/data2legend/density-to-legend.js +77 -0
  66. package/programs/data2legend/point-to-density-texture.js +75 -0
  67. package/programs/float2legendwithratio/index.js +8 -0
  68. package/programs/float2legendwithratio/logic.js +125 -0
  69. package/programs/float2legendwithratio/object.js +113 -0
  70. package/programs/globe-util/is-globe-moved.js +22 -0
  71. package/programs/globeshell/index.js +8 -0
  72. package/programs/globeshell/noise/noises.js +1 -0
  73. package/programs/globeshell/wiggle/index.js +8 -0
  74. package/programs/globeshell/wiggle/logic.js +252 -0
  75. package/programs/globeshell/wiggle/object.js +74 -0
  76. package/programs/helpers/blender/index.js +1 -0
  77. package/programs/helpers/blender/program.js +62 -0
  78. package/programs/helpers/fadeaway/index.js +7 -0
  79. package/programs/helpers/fadeaway/logic.js +50 -0
  80. package/programs/helpers/fadeaway/object.js +21 -0
  81. package/programs/helpers/index.js +8 -0
  82. package/programs/index.js +58 -0
  83. package/programs/interface.js +1 -0
  84. package/programs/line-on-globe/angled-line.js +117 -0
  85. package/programs/line-on-globe/circle-accurate-3d.js +91 -0
  86. package/programs/line-on-globe/circle-accurate-flat.js +158 -0
  87. package/programs/line-on-globe/circle-accurate.js +108 -0
  88. package/programs/line-on-globe/circle.js +102 -0
  89. package/programs/line-on-globe/degree-padding-around-circle-3d.js +109 -0
  90. package/programs/line-on-globe/index.js +1 -0
  91. package/programs/line-on-globe/lines-color-instanced-flat.js +91 -0
  92. package/programs/line-on-globe/linestrip.js +110 -0
  93. package/programs/line-on-globe/naive-accurate-flexible.js +125 -0
  94. package/programs/line-on-globe/to-the-surface.js +82 -0
  95. package/programs/line-on-globe/util.js +8 -0
  96. package/programs/picking/pickable-renderer.js +104 -0
  97. package/programs/point-on-globe/element-globe-surface-glow.js +102 -0
  98. package/programs/point-on-globe/element-point-glow.js +85 -0
  99. package/programs/point-on-globe/square-pixel-point.js +125 -0
  100. package/programs/programcache.js +131 -0
  101. package/programs/rings/distancering/circleflatprogram.js +114 -0
  102. package/programs/rings/distancering/circlepaddingfreeangleprogram.js +358 -0
  103. package/programs/rings/distancering/circlepaddysharedbuffer.js +433 -0
  104. package/programs/rings/distancering/index.js +14 -0
  105. package/programs/rings/distancering/paddyflatprogram.js +119 -0
  106. package/programs/rings/distancering/paddyflatprogram2d.js +121 -0
  107. package/programs/rings/distancering/paddyflatprogram3d.js +119 -0
  108. package/programs/rings/distancering/shader.js +1 -0
  109. package/programs/rings/index.js +17 -0
  110. package/programs/rings/partial-ring/piece-of-pie.js +173 -0
  111. package/programs/totems/camerauniformblock.js +147 -0
  112. package/programs/totems/canvas-webglobe-info.js +102 -0
  113. package/programs/totems/gpu-selection-uniform-block.js +104 -0
  114. package/programs/totems/index.js +40 -0
  115. package/programs/two-d/pixel-circle.js +1 -0
  116. package/programs/two-d/pixel-padding-for-compass.js +101 -0
  117. package/programs/util.js +18 -0
  118. package/programs/vectorfields/index.js +23 -0
  119. package/programs/vectorfields/logics/drawrectangleparticles.js +66 -0
  120. package/programs/vectorfields/logics/index.js +12 -0
  121. package/programs/vectorfields/logics/pixelbased.js +86 -0
  122. package/programs/vectorfields/logics/ubo.js +57 -0
  123. package/programs/vectorfields/pingpongbuffermanager.js +80 -0
  124. package/rangerings/enum.js +5 -0
  125. package/rangerings/index.js +15 -0
  126. package/rangerings/plugin.js +610 -0
  127. package/rangerings/rangeringangletext.js +341 -0
  128. package/rangerings/ring-account.js +134 -0
  129. package/shaders/fragment-toy/firework.js +4 -0
  130. package/shaders/fragment-toy/singularity.js +5 -0
  131. package/shape-on-terrain/arc/naive/plugin.js +252 -0
  132. package/timetracks/adaptors-line-strip.js +82 -0
  133. package/timetracks/adaptors.js +136 -0
  134. package/timetracks/index.js +19 -0
  135. package/timetracks/plugin-line-strip.js +254 -0
  136. package/timetracks/plugin.js +262 -0
  137. package/timetracks/program-line-strip.js +418 -0
  138. package/timetracks/program.js +466 -0
  139. package/timetracks/programpoint-line-strip.js +101 -0
  140. package/timetracks/programpoint.js +101 -0
  141. package/types.js +15 -0
  142. package/util/account/bufferoffsetmanager.js +202 -0
  143. package/util/account/index.js +23 -0
  144. package/util/account/single-attribute-buffer-management/buffer-manager.js +112 -0
  145. package/util/account/single-attribute-buffer-management/buffer-orchestrator.js +180 -0
  146. package/util/account/single-attribute-buffer-management/index.js +9 -0
  147. package/util/account/single-attribute-buffer-management/object-store.js +53 -0
  148. package/util/account/single-attribute-buffer-management/types.js +2 -0
  149. package/util/account/util.js +24 -0
  150. package/util/algorithms/index.js +1 -0
  151. package/util/algorithms/search-binary.js +28 -0
  152. package/util/check/get.js +18 -0
  153. package/util/check/index.js +1 -0
  154. package/util/check/typecheck.js +51 -0
  155. package/util/geometry/index.js +53 -0
  156. package/util/gl-util/buffer/attribute-loader.js +81 -0
  157. package/util/gl-util/buffer/index.js +6 -0
  158. package/util/gl-util/buffer/types.js +1 -0
  159. package/util/gl-util/draw-options/methods.js +38 -0
  160. package/util/gl-util/draw-options/types.js +15 -0
  161. package/util/gl-util/uniform-block/manager.js +168 -0
  162. package/util/gl-util/uniform-block/shader.js +1 -0
  163. package/util/gl-util/uniform-block/types.js +8 -0
  164. package/util/heatwavedatamanager/datamanager.js +212 -0
  165. package/util/heatwavedatamanager/index.js +10 -0
  166. package/util/heatwavedatamanager/pointcoordinatesdatacalculator.js +125 -0
  167. package/util/heatwavedatamanager/pointcoordsmeta.js +21 -0
  168. package/util/index.js +57 -0
  169. package/util/interpolation/index.js +1 -0
  170. package/util/interpolation/timetrack/index.js +5 -0
  171. package/util/interpolation/timetrack/timetrack-interpolator.js +81 -0
  172. package/util/interpolation/timetrack/web-worker-str.js +5 -0
  173. package/util/interpolation/timetrack/web-worker.js +48 -0
  174. package/util/jshelpers/data-filler.js +20 -0
  175. package/util/jshelpers/equality.js +20 -0
  176. package/util/jshelpers/index.js +37 -0
  177. package/util/jshelpers/timefilters.js +32 -0
  178. package/util/picking/fence.js +46 -0
  179. package/util/picking/picker-displayer.js +145 -0
  180. package/util/programs/draw-texture-on-canvas.js +71 -0
  181. package/util/programs/index.js +17 -0
  182. package/util/programs/shapesonglobe.js +174 -0
  183. package/util/programs/supersampletotextures.js +107 -0
  184. package/util/programs/texturetoglobe.js +132 -0
  185. package/util/shaderfunctions/geometrytransformations.js +45 -0
  186. package/util/shaderfunctions/index.js +18 -0
  187. package/util/shaderfunctions/nodata.js +5 -0
  188. package/util/shaderfunctions/noisefunctions.js +13 -0
  189. package/util/surface-line-data/arc-bboxes.js +25 -0
  190. package/util/surface-line-data/arcs-to-cuts.js +53 -0
  191. package/util/surface-line-data/cut-arc.js +1 -0
  192. package/util/surface-line-data/flow.js +28 -0
  193. package/util/surface-line-data/rbush-manager.js +1 -0
  194. package/util/surface-line-data/types.js +1 -0
  195. package/util/surface-line-data/web-worker.js +1 -0
  196. package/util/webglobe/gldefaultstates.js +7 -0
  197. package/util/webglobe/index.js +18 -0
  198. package/util/webglobe/rasteroverlay.js +80 -0
  199. package/util/webglobjectbuilders.js +393 -0
  200. package/util/webglobjectbuilders1.js +238 -0
  201. package/waveparticles/adaptor.js +18 -0
  202. package/waveparticles/index.js +10 -0
  203. package/waveparticles/plugin.js +271 -0
  204. package/wind/imagetovectorfieldandmagnitude.js +35 -0
  205. package/wind/index.js +14 -0
  206. package/wind/plugin.js +724 -0
  207. package/wind/vectorfieldimage.js +25 -0
  208. package/write-text/attached-text-writer.js +93 -0
  209. package/write-text/context-text.js +105 -0
  210. package/write-text/context-text3.js +160 -0
  211. package/write-text/index.js +5 -0
  212. package/write-text/writer-plugin.js +8 -0
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bearingRealAngle = bearingRealAngle;
4
+ function bearingRealAngle(long, lat, endLong, endLat) {
5
+ var rLong = Radians * long;
6
+ var rLat = Radians * lat;
7
+ var rEndLong = Radians * endLong;
8
+ var rEndLat = Radians * endLat;
9
+ var delta_long = rEndLong - rLong;
10
+ var x = Math.sin(delta_long) * Math.cos(rEndLat);
11
+ var y = Math.cos(rLat) * Math.sin(rEndLat) - Math.sin(rLat) * Math.cos(rEndLat) * Math.cos(delta_long);
12
+ var initialBearing = Math.atan2(x, y) / Radians;
13
+ initialBearing = (initialBearing + 360) % 360;
14
+ return initialBearing;
15
+ }
package/Math/arc.js ADDED
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.arc = void 0;
4
+ var vec3_1 = require("./vec3");
5
+ var constants_1 = require("./constants");
6
+ var _0vector = /*@__PURE__*/ vec3_1.vec3.create(0, 0, 0);
7
+ var _1vector = /*@__PURE__*/ vec3_1.vec3.create(1, 1, 1);
8
+ exports.arc = Object.freeze({
9
+ create: function (p0, p1) {
10
+ var normal = vec3_1.vec3.create(0, 0, 0);
11
+ vec3_1.vec3.cross(normal, p0, p1);
12
+ var coverPlaneNormal = [p0[0] + p1[0], p0[1] + p1[1], p0[2] + p1[2]];
13
+ vec3_1.vec3.normalize(coverPlaneNormal, coverPlaneNormal);
14
+ var dot = vec3_1.vec3.dot(coverPlaneNormal, p0);
15
+ return {
16
+ p0: vec3_1.vec3.clone(p0),
17
+ p1: vec3_1.vec3.clone(p1),
18
+ normal: vec3_1.vec3.clone(normal),
19
+ coverPlane: {
20
+ normal: coverPlaneNormal,
21
+ distance: dot
22
+ }
23
+ };
24
+ },
25
+ set: function (out, p0, p1) {
26
+ vec3_1.vec3.copy(out.p0, p0);
27
+ vec3_1.vec3.copy(out.p1, p1);
28
+ vec3_1.vec3.cross(out.normal, p0, p1);
29
+ var coverPlaneNormal = [p0[0] + p1[0], p0[1] + p1[1], p0[2] + p1[2]];
30
+ vec3_1.vec3.normalize(coverPlaneNormal, coverPlaneNormal);
31
+ out.coverPlane.normal = coverPlaneNormal;
32
+ out.coverPlane.distance = vec3_1.vec3.dot(coverPlaneNormal, p0);
33
+ },
34
+ copy: function (out, a) {
35
+ vec3_1.vec3.copy(out.p0, a.p0);
36
+ vec3_1.vec3.copy(out.p1, a.p1);
37
+ vec3_1.vec3.copy(out.normal, a.normal);
38
+ out.coverPlane.normal = vec3_1.vec3.clone(a.coverPlane.normal);
39
+ out.coverPlane.distance = a.coverPlane.distance;
40
+ },
41
+ clone: function (a) {
42
+ return {
43
+ p0: vec3_1.vec3.clone(a.p0),
44
+ p1: vec3_1.vec3.clone(a.p1),
45
+ normal: vec3_1.vec3.clone(a.normal),
46
+ coverPlane: {
47
+ normal: vec3_1.vec3.clone(a.coverPlane.normal),
48
+ distance: a.coverPlane.distance
49
+ }
50
+ };
51
+ },
52
+ isPointOn: function (arc, point) {
53
+ var alignment = Math.abs(vec3_1.vec3.dot(point, arc.normal)) < constants_1.EPSILON;
54
+ var distance = Math.abs(vec3_1.vec3.lengthSquared(point) - 1) < constants_1.EPSILON;
55
+ var cover = vec3_1.vec3.dot(arc.coverPlane.normal, point) >= arc.coverPlane.distance;
56
+ return alignment || distance || cover;
57
+ },
58
+ equals: function (a, b) {
59
+ return vec3_1.vec3.equals(a.p0, b.p0) && vec3_1.vec3.equals(a.p1, b.p1);
60
+ },
61
+ populatePoints: function (out, arc, count) {
62
+ // rotate p0 around normal vector with a quaternion
63
+ // calculate angle
64
+ }
65
+ });
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGreatCircleArcBBox = getGreatCircleArcBBox;
4
+ function isClose(a, b, rtol, atol) {
5
+ if (rtol === void 0) { rtol = 1e-5; }
6
+ if (atol === void 0) { atol = 1e-8; }
7
+ // JavaScript equivalent of NumPy's isclose
8
+ return Math.abs(a - b) <= (atol + rtol * Math.abs(b));
9
+ }
10
+ function mod(n, m) {
11
+ // Proper modulo operation that handles negative numbers
12
+ return ((n % m) + m) % m;
13
+ }
14
+ function calculateInitialBearing(phi1, lambda1, phi2, lambda2) {
15
+ // Calculates the initial bearing (forward azimuth) from point 1 to point 2
16
+ if (isClose(Math.cos(phi1), 0)) { // Starting from a pole
17
+ if (phi1 > 0) { // North pole
18
+ return Math.PI; // Bearing is South
19
+ }
20
+ else { // South pole
21
+ return 0; // Bearing is North
22
+ }
23
+ }
24
+ var deltaLambda = lambda2 - lambda1;
25
+ var y = Math.sin(deltaLambda) * Math.cos(phi2);
26
+ var x = Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(deltaLambda);
27
+ var theta = Math.atan2(y, x);
28
+ return theta;
29
+ }
30
+ function getGreatCircleArcBBox(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad) {
31
+ // Calculates the bounding box around the great circle arc between two points
32
+ // on a spherical surface, handling edge cases like poles and antimeridian crossing.
33
+ // Args: Latitudes and longitudes in radians
34
+ // Returns: [phiMin, phiMax, lambdaMin, lambdaMax] in radians
35
+ // === Edge Case: Same Points ===
36
+ if (isClose(phi1Rad, phi2Rad) && isClose(lambda1Rad, lambda2Rad)) {
37
+ return [phi1Rad, phi1Rad, lambda1Rad, lambda1Rad];
38
+ }
39
+ // === Edge Case: Antipodal Points ===
40
+ var deltaLambdaNorm = mod(lambda1Rad - lambda2Rad + Math.PI, 2 * Math.PI) - Math.PI;
41
+ if (isClose(phi1Rad, -phi2Rad) && isClose(Math.abs(deltaLambdaNorm), Math.PI)) {
42
+ // Path covers all longitudes and passes through poles
43
+ return [-Math.PI / 2, Math.PI / 2, -Math.PI, Math.PI];
44
+ }
45
+ // === Longitude Bounds ===
46
+ var lambda1Adj = lambda1Rad;
47
+ var lambda2Adj = lambda2Rad;
48
+ // Handle antimeridian crossing
49
+ var deltaLambda = lambda2Rad - lambda1Rad;
50
+ if (deltaLambda > Math.PI) {
51
+ deltaLambda -= 2 * Math.PI;
52
+ }
53
+ else if (deltaLambda <= -Math.PI) {
54
+ deltaLambda += 2 * Math.PI;
55
+ }
56
+ var crossesAntimeridian = Math.abs(lambda2Rad - lambda1Rad) > Math.PI;
57
+ if (crossesAntimeridian) {
58
+ // Add 2*pi to the smaller longitude
59
+ if (lambda1Rad < lambda2Rad) {
60
+ lambda1Adj += 2 * Math.PI;
61
+ }
62
+ else {
63
+ lambda2Adj += 2 * Math.PI;
64
+ }
65
+ }
66
+ var lambdaMin = Math.min(lambda1Adj, lambda2Adj);
67
+ var lambdaMax = Math.max(lambda1Adj, lambda2Adj);
68
+ // === Latitude Bounds ===
69
+ var phiMin = Math.min(phi1Rad, phi2Rad);
70
+ var phiMax = Math.max(phi1Rad, phi2Rad);
71
+ // === Vertex Check ===
72
+ // Check the maximum/minimum latitude reached by the great circle
73
+ var theta12 = calculateInitialBearing(phi1Rad, lambda1Rad, phi2Rad, lambda2Rad);
74
+ var theta21 = calculateInitialBearing(phi2Rad, lambda2Rad, phi1Rad, lambda1Rad);
75
+ var cosPhi1 = Math.cos(phi1Rad);
76
+ if (!isClose(cosPhi1, 0)) { // Starting point is not a pole
77
+ // Compute the absolute latitude of the vertex
78
+ var argAcos = Math.abs(Math.sin(theta12) * cosPhi1);
79
+ var phiVtxAbs = Math.acos(Math.min(Math.max(argAcos, -1.0), 1.0));
80
+ // Check if the path crosses the northern vertex
81
+ if (isClose(theta12, 0) && phiVtxAbs > phiMax) { // Starting due north
82
+ phiMax = phiVtxAbs;
83
+ }
84
+ else if (isClose(Math.abs(theta12), Math.PI) && -phiVtxAbs < phiMin) { // Starting due south
85
+ phiMin = -phiVtxAbs;
86
+ }
87
+ else {
88
+ // General case: Check if the path crosses the vertex
89
+ var finalBearingAtP2 = mod(theta21 + Math.PI + Math.PI, 2 * Math.PI) - Math.PI;
90
+ // Northern vertex check
91
+ if ((-Math.PI / 2 < theta12 && theta12 < Math.PI / 2) &&
92
+ !(finalBearingAtP2 >= -Math.PI / 2 && finalBearingAtP2 <= Math.PI / 2)) {
93
+ if (phiVtxAbs > phiMax) {
94
+ phiMax = phiVtxAbs;
95
+ }
96
+ }
97
+ // Southern vertex check
98
+ if (!(theta12 >= -Math.PI / 2 && theta12 <= Math.PI / 2) &&
99
+ (-Math.PI / 2 < finalBearingAtP2 && finalBearingAtP2 < Math.PI / 2)) {
100
+ if (-phiVtxAbs < phiMin) {
101
+ phiMin = -phiVtxAbs;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return [phiMin, phiMax, lambdaMin, lambdaMax];
107
+ }
108
+ // --- Example Usage ---
109
+ function degreesToRadians(deg) {
110
+ return deg * Math.PI / 180;
111
+ }
112
+ function radiansToDegrees(rad) {
113
+ return rad * 180 / Math.PI;
114
+ }
115
+ // Test Case 1: London to Tokyo
116
+ var lat1Deg = 51.5, lon1Deg = -0.1;
117
+ var lat2Deg = 35.7, lon2Deg = 139.7;
118
+ var phi1 = degreesToRadians(lat1Deg);
119
+ var lambda1 = degreesToRadians(lon1Deg);
120
+ var phi2 = degreesToRadians(lat2Deg);
121
+ var lambda2 = degreesToRadians(lon2Deg);
122
+ var _a = getGreatCircleArcBBox(phi1, lambda1, phi2, lambda2), phiMinRad = _a[0], phiMaxRad = _a[1], lambdaMinRad = _a[2], lambdaMaxRad = _a[3];
123
+ var phiMinDeg = radiansToDegrees(phiMinRad);
124
+ var phiMaxDeg = radiansToDegrees(phiMaxRad);
125
+ var lambdaMinDeg = radiansToDegrees(lambdaMinRad);
126
+ var lambdaMaxDeg = radiansToDegrees(lambdaMaxRad);
127
+ console.log("Input Points (Radians):");
128
+ console.log(" P1: Latitude=".concat(lat1Deg, ", Longitude=").concat(lon1Deg));
129
+ console.log(" P2: Latitude=".concat(lat2Deg, ", Longitude=").concat(lon2Deg));
130
+ console.log(" P1: Latitude=".concat(phi1.toFixed(4), ", Longitude=").concat(lambda1.toFixed(4)));
131
+ console.log(" P2: Latitude=".concat(phi2.toFixed(4), ", Longitude=").concat(lambda2.toFixed(4)));
132
+ console.log("-".repeat(20));
133
+ console.log("Bounding Box (Radians):");
134
+ // console phys://console.log(` Minimum Latitude (phi_min): ${phiMinRad.toFixed(4)}`);
135
+ console.log(" Maximum Latitude (phi_max): ".concat(phiMaxRad.toFixed(4)));
136
+ console.log(" Minimum Longitude (lambda_min): ".concat(lambdaMinRad.toFixed(4)));
137
+ console.log(" Maximum Longitude (lambda_max): ".concat(lambdaMaxRad.toFixed(4)));
138
+ console.log("-".repeat(20));
139
+ console.log("Bounding Box (Degrees):");
140
+ console.log(" Minimum Latitude: ".concat(phiMinDeg.toFixed(2), "\u00B0"));
141
+ console.log(" Maximum Latitude: ".concat(phiMaxDeg.toFixed(2), "\u00B0"));
142
+ console.log(" Minimum Longitude: ".concat(lambdaMinDeg.toFixed(2), "\u00B0"));
143
+ console.log(" Maximum Longitude: ".concat(lambdaMaxDeg.toFixed(2), "\u00B0"));
144
+ // --- Antimeridian Crossing Test ---
145
+ console.log("\n" + "=".repeat(30));
146
+ console.log("Antimeridian Crossing Test");
147
+ var lat1DegAm = -18, lon1DegAm = 178;
148
+ var lat2DegAm = -14, lon2DegAm = -172;
149
+ var phi1Am = degreesToRadians(lat1DegAm);
150
+ var lambda1Am = degreesToRadians(lon1DegAm);
151
+ var phi2Am = degreesToRadians(lat2DegAm);
152
+ var lambda2Am = degreesToRadians(lon2DegAm);
153
+ var _b = getGreatCircleArcBBox(phi1Am, lambda1Am, phi2Am, lambda2Am), phiMinRadAm = _b[0], phiMaxRadAm = _b[1], lambdaMinRadAm = _b[2], lambdaMaxRadAm = _b[3];
154
+ var phiMinDegAm = radiansToDegrees(phiMinRadAm);
155
+ var phiMaxDegAm = radiansToDegrees(phiMaxRadAm);
156
+ var lambdaMinDegAm = radiansToDegrees(lambdaMinRadAm);
157
+ var lambdaMaxDegAm = radiansToDegrees(lambdaMaxRadAm);
158
+ console.log("Input Points (Degrees): P1=(".concat(lat1DegAm, ", ").concat(lon1DegAm, "), P2=(").concat(lat2DegAm, ", ").concat(lon2DegAm, ")"));
159
+ console.log("Bounding Box (Radians):");
160
+ console.log(" phi_min=".concat(phiMinRadAm.toFixed(4), ", phi_max=").concat(phiMaxRadAm.toFixed(4)));
161
+ console.log(" lambda_min=".concat(lambdaMinRadAm.toFixed(4), ", lambda_max=").concat(lambdaMaxRadAm.toFixed(4)));
162
+ console.log("Bounding Box (Degrees):");
163
+ console.log(" Min Latitude: ".concat(phiMinDegAm.toFixed(2), "\u00B0"));
164
+ console.log(" Max Latitude: ".concat(phiMaxDegAm.toFixed(2), "\u00B0"));
165
+ console.log(" Min Longitude: ".concat(lambdaMinDegAm.toFixed(2), "\u00B0 (178\u00B0 expected)"));
166
+ console.log(" Max Longitude: ".concat(lambdaMaxDegAm.toFixed(2), "\u00B0 (188\u00B0 expected, which is -172\u00B0 + 360\u00B0)"));
167
+ // --- Polar Crossing Test ---
168
+ console.log("\n" + "=".repeat(30));
169
+ console.log("Polar Crossing Test");
170
+ var lat1DegP = 80, lon1DegP = 20;
171
+ var lat2DegP = 80, lon2DegP = -100;
172
+ var phi1P = degreesToRadians(lat1DegP);
173
+ var lambda1P = degreesToRadians(lon1DegP);
174
+ var phi2P = degreesToRadians(lat2DegP);
175
+ var lambda2P = degreesToRadians(lon2DegP);
176
+ var _c = getGreatCircleArcBBox(phi1P, lambda1P, phi2P, lambda2P), phiMinRadP = _c[0], phiMaxRadP = _c[1], lambdaMinRadP = _c[2], lambdaMaxRadP = _c[3];
177
+ var phiMinDegP = radiansToDegrees(phiMinRadP);
178
+ var phiMaxDegP = radiansToDegrees(phiMaxRadP);
179
+ var lambdaMinDegP = radiansToDegrees(lambdaMinRadP);
180
+ var lambdaMaxDegP = radiansToDegrees(lambdaMaxRadP);
181
+ console.log("Input Points (Degrees): P1=(".concat(lat1DegP, ", ").concat(lon1DegP, "), P2=(").concat(lat2DegP, ", ").concat(lon2DegP, ")"));
182
+ console.log("Bounding Box (Radians):");
183
+ console.log(" phi_min=".concat(phiMinRadP.toFixed(4), ", phi_max=").concat(phiMaxRadP.toFixed(4)));
184
+ console.log(" lambda_min=".concat(lambdaMinRadP.toFixed(4), ", lambda_max=").concat(lambdaMaxRadP.toFixed(4)));
185
+ console.log("Bounding Box (Degrees):");
186
+ console.log(" Min Latitude: ".concat(phiMinDegP.toFixed(2), "\u00B0"));
187
+ console.log(" Max Latitude: ".concat(phiMaxDegP.toFixed(2), "\u00B0 (Should be close to North Pole > 80\u00B0)"));
188
+ console.log(" Min Longitude: ".concat(lambdaMinDegP.toFixed(2), "\u00B0"));
189
+ console.log(" Max Longitude: ".concat(lambdaMaxDegP.toFixed(2), "\u00B0"));
190
+ // --- line points intersection with bbox ---
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EPSILON = exports.WORLD_RADIUS_MERCATOR = exports.WORLD_RADIUS_3D = void 0;
4
+ var WORLD_RADIUS_3D = 6378.137;
5
+ exports.WORLD_RADIUS_3D = WORLD_RADIUS_3D;
6
+ var WORLD_RADIUS_MERCATOR = 6378136.99911;
7
+ exports.WORLD_RADIUS_MERCATOR = WORLD_RADIUS_MERCATOR;
8
+ var EPSILON = 1e-10; // Used for floating point comparisons
9
+ exports.EPSILON = EPSILON;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ // import { WORLD_RADIUS_3D } from '../constants';
3
+ // import { Plane } from '../plane';
4
+ // import { Vector3D } from '../vector3d';
5
+ // import { Quaternion } from '../quaternion';
6
+ // function cameraFrustum(
7
+ // globe: any,
8
+ // out: {
9
+ // near: Plane,
10
+ // far: Plane,
11
+ // left: Plane,
12
+ // right: Plane,
13
+ // top: Plane,
14
+ // bottom: Plane
15
+ // },
16
+ // fieldOfView: number = 50 // in degrees
17
+ // ): void {
18
+ // const lookinfo = globe.api_GetCurrentLookInfo();
19
+ // lookinfo.CenterLong *= Math.PI / 180; // convert degrees to radians
20
+ // lookinfo.CenterLat *= Math.PI / 180; // convert degrees to radians
21
+ // const lookAtPosition = Vector3D.fromLongLatRadians(lookinfo.CenterLong, lookinfo.CenterLat);
22
+ // const cameraPosition = new Vector3D(globe.Fp.x, globe.Fp.y, globe.Fp.z).divideByScaler(WORLD_RADIUS_3D);
23
+ // return
24
+ // }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ // import { Plane } from "../plane";
3
+ // import { Vector3D } from "../vector3d";
4
+ // import { WORLD_RADIUS_3D } from "../constants";
5
+ // import { Quaternion } from "../quaternion";
6
+ // import { FrustumPlanes } from "./types";
7
+ // const _quaternion = new Quaternion();
8
+ // export function getFrustum(globe: any, fieldOfView: number = 50 * Math.PI / 180,
9
+ // out: FrustumPlanes): void {
10
+ // const lookinfo = globe.api_GetCurrentLookInfo();
11
+ // lookinfo.CenterLong *= Math.PI / 180; // convert degrees to radians
12
+ // lookinfo.CenterLat *= Math.PI / 180; // convert degrees to radians
13
+ // lookinfo.NorthAng *= Math.PI / 180; // convert degrees to radians
14
+ // const lookAtPosition = Vector3D.fromLongLatRadians(lookinfo.CenterLong, lookinfo.CenterLat);
15
+ // const cameraPosition = new Vector3D(globe.Fp.x, globe.Fp.y, globe.Fp.z).divideByScaler(WORLD_RADIUS_3D);
16
+ // const lookFromCamera = lookAtPosition.clone().subtract(cameraPosition).normalize();
17
+ // const cameraZ = new Vector3D(globe.Fu.x, globe.Fu.y, globe.Fu.z);
18
+ // const cameraY = cameraZ.clone().cross(lookFromCamera).normalize();
19
+ // const bottomNormal = cameraZ.clone().applyQuaternion(
20
+ // _quaternion.setFromAxisAngle(cameraY, -fieldOfView)
21
+ // ).normalize();
22
+ // const topNormal = cameraZ.clone().applyQuaternion(
23
+ // _quaternion.setFromAxisAngle(cameraY, fieldOfView)
24
+ // ).negate().normalize();
25
+ // const leftNormal = cameraY.clone().applyQuaternion(
26
+ // _quaternion.setFromAxisAngle(cameraZ, fieldOfView)
27
+ // ).negate().normalize();
28
+ // const rightNormal = cameraY.clone().applyQuaternion(
29
+ // _quaternion.setFromAxisAngle(cameraZ, -fieldOfView)
30
+ // ).normalize();
31
+ // out.top.set(topNormal, topNormal.dot(cameraPosition));
32
+ // out.bottom.set(bottomNormal, bottomNormal.dot(cameraPosition));
33
+ // out.left.set(leftNormal, leftNormal.dot(cameraPosition));
34
+ // out.right.set(rightNormal, rightNormal.dot(cameraPosition));
35
+ // out.far.set(cameraPosition.normalize(), 0.01);
36
+ // out.near = null; // Near plane is not calculated in this function, set to null
37
+ // vectorInfo(globe, [out]);
38
+ // }
39
+ // let interval = 0;
40
+ // const vectorInfo = (globe, args: null | Array<any>) => {
41
+ // interval++;
42
+ // if (interval % 100 === 0) {
43
+ // console.log("Fp:", globe.Fp.x / WORLD_RADIUS_3D, globe.Fp.y / WORLD_RADIUS_3D, globe.Fp.z / WORLD_RADIUS_3D);
44
+ // console.log("Fu:", globe.Fu.x, globe.Fu.y, globe.Fu.z);
45
+ // if (args) console.log(...args)
46
+ // interval = 0;
47
+ // }
48
+ // }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // TODO: REMOVE
3
+ // // import { Vector3D, Quaternion, Plane, Ray, Matrix4 } from 'your-3d-math-library'; // <-- ADAPT THIS IMPORT
4
+ // import { Vector3D } from '../vector3d';
5
+ // import { Plane } from '../plane';
6
+ // import { Line } from '../line';
7
+ // import { Matrix4 } from '../matrix4';
8
+ // import { Quaternion } from '../quaternion';
9
+ // // --- Assume these static helper variables exist within your class ---
10
+ // const _lookFromOrigin = new Vector3D();
11
+ // const _cameraPosition = new Vector3D();
12
+ // const _finalForward = new Vector3D();
13
+ // const _approxUp = new Vector3D();
14
+ // const _finalRight = new Vector3D();
15
+ // const _finalUp = new Vector3D();
16
+ // const _tempVec = new Vector3D(); // General purpose helper
17
+ // const _initialBottomRayDir = new Vector3D();
18
+ // const _qOrient = new Quaternion();
19
+ // const _rollQuaternion = new Quaternion();
20
+ // const _rotationMatrix = new Matrix4();
21
+ // const _fieldOfViewBottomRay = new Line(new Vector3D(), new Vector3D());
22
+ // const _origin3d = new Vector3D(0, 0, 0); // Globe Center
23
+ // // --- Assume these constants exist ---
24
+ // const WORLD_RADIUS_3D = 6371000; // Example: Earth radius
25
+ // const FIELD_OF_VIEW = (25 * Math.PI) / 180; // Example: 25 degrees half-FOV in radians
26
+ // // // --- Assume Plane class has these methods ---
27
+ // // interface Plane {
28
+ // // setFromNormalAndPoint(normal: Vector3D, point: Vector3D): this;
29
+ // // set(normal: Vector3D, constant: number): this;
30
+ // // // ... other plane methods
31
+ // // }
32
+ // // // --- Assume Ray class has these methods ---
33
+ // // interface Ray {
34
+ // // origin: Vector3D;
35
+ // // direction: Vector3D;
36
+ // // intersectionSphere(center: Vector3D, radius: number): Vector3D[] | null; // Or similar
37
+ // // // ... other ray methods
38
+ // // }
39
+ // // // --- Assume Vector3D has setFromLongLat ---
40
+ // // interface Vector3D {
41
+ // // setFromLongLat(lon: number, lat: number): this;
42
+ // // // ... other vector methods
43
+ // // }
44
+ // // // --- END OF ASSUMPTIONS ---
45
+ // /**
46
+ // * Calculates a culling plane representing the bottom edge of the camera's field of view.
47
+ // * @param globe - The globe object, expected to have api_GetCurrentLookInfo and Fp properties.
48
+ // * @param out - The Plane object to store the result.
49
+ // * @param fieldOfView - The vertical half-angle of the field of view in radians.
50
+ // * @returns The calculated Plane.
51
+ // */
52
+ // function calculateHorizonPlane(globe: any, out: Plane, fieldOfView: number = FIELD_OF_VIEW): Plane {
53
+ // const cameraLookInfo = globe.api_GetCurrentLookInfo();
54
+ // cameraLookInfo.CenterLong *= Math.PI / 180;
55
+ // cameraLookInfo.CenterLat *= Math.PI / 180;
56
+ // // cameraLookInfo.Tilt *= Math.PI / 180; // Tilt is now implicitly handled
57
+ // cameraLookInfo.NorthAng *= Math.PI / 180;
58
+ // // Set _lookFromOrigin based on camera target (Lon/Lat)
59
+ // (_lookFromOrigin as any).setFromLongLat(cameraLookInfo.CenterLong, cameraLookInfo.CenterLat); // Cast to any if setFromLongLat is custom
60
+ // // 1. Calculate _cameraPosition and _finalForward (_lookFromCamera)
61
+ // _cameraPosition.set(globe.Fp.x, globe.Fp.y, globe.Fp.z); // Using your X negation
62
+ // _cameraPosition.divideScalar(WORLD_RADIUS_3D); // Scale to unit sphere
63
+ // Vector3D.subVectors(_lookFromOrigin, _cameraPosition, _finalForward).normalize();
64
+ // // 2. Calculate Q_orient (Final Camera Orientation Quaternion)
65
+ // // Use the vector from origin to camera as an initial 'up' reference
66
+ // _approxUp.copy(_cameraPosition).normalize();
67
+ // // Calculate Right vector using cross product
68
+ // Vector3D.crossVectors(_finalForward, _approxUp, _finalRight).normalize();
69
+ // // Handle edge case: If looking straight along (or opposite to) _approxUp
70
+ // if (_finalRight.lengthSq() < 0.0001) {
71
+ // // If vectors are parallel, _approxUp is not good.
72
+ // // Choose a different 'up', e.g., if _approxUp is near Z, use Y.
73
+ // if (Math.abs(_approxUp.z) > 0.9) {
74
+ // _approxUp.set(0, 1, 0);
75
+ // } else {
76
+ // _approxUp.set(0, 0, 1);
77
+ // }
78
+ // Vector3D.crossVectors(_finalForward, _approxUp, _finalRight).normalize();
79
+ // }
80
+ // // Calculate the 'true' Up vector, orthogonal to Right and Forward
81
+ // Vector3D.crossVectors(_finalRight, _finalForward, _finalUp).normalize();
82
+ // // Apply NorthAng (Roll) around the Forward axis
83
+ // _rollQuaternion.setFromAxisAngle(_finalForward, cameraLookInfo.NorthAng);
84
+ // _finalUp.applyQuaternion(_rollQuaternion);
85
+ // _finalRight.applyQuaternion(_rollQuaternion); // Must rotate Right as well!
86
+ // // Create Q_orient from the final basis vectors (Right, Up, -Forward)
87
+ // // This assumes a Matrix4.makeBasis(x, y, z) exists and builds a rotation matrix.
88
+ // // It also assumes local camera looks down -Z, hence negating _finalForward for the Z basis.
89
+ // _tempVec.copy(_finalForward).negate();
90
+ // _rotationMatrix.makeBasis(_finalRight, _finalUp, _tempVec); // <-- ADAPT: Ensure your library has makeBasis or equivalent
91
+ // _qOrient.setFromRotationMatrix(_rotationMatrix); // <-- ADAPT: Ensure this function exists
92
+ // // 3. Calculate Initial Bottom Ray (Local: -Z forward, Y up, X right)
93
+ // // Rotates (0, 0, -1) around (1, 0, 0) by fieldOfView
94
+ // _initialBottomRayDir.set(0, -Math.sin(fieldOfView), -Math.cos(fieldOfView));
95
+ // // 4. Calculate Final Bottom Ray (World)
96
+ // _fieldOfViewBottomRay.direction.copy(_initialBottomRayDir).applyQuaternion(_qOrient).normalize();
97
+ // _fieldOfViewBottomRay.origin.copy(_cameraPosition);
98
+ // // 5. Intersection and Plane
99
+ // const intersection = (_fieldOfViewBottomRay as any).intersectionSphere(_origin3d, 1); // Cast to any if method isn't standard
100
+ // if (intersection && intersection.length > 0) {
101
+ // // If ray intersects, use the closest point for the plane
102
+ // out.setFromNormalAndPoint(_lookFromOrigin, intersection[0]);
103
+ // } else {
104
+ // // If ray does not intersect (FOV covers globe or misses)
105
+ // // WARNING: This sets a plane through the globe's center.
106
+ // // This might not be the desired behavior for culling.
107
+ // // Consider what should happen if the whole globe *is* visible.
108
+ // out.set(_lookFromOrigin, 0.0);
109
+ // }
110
+ // return out;
111
+ // }
112
+ // export { calculateHorizonPlane };
package/Math/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.arcSlice = arcSlice;
4
+ var constants_1 = require("../constants");
5
+ var vec3_1 = require("../vec3");
6
+ var line_1 = require("../line");
7
+ var plane_1 = require("../plane");
8
+ var arc_1 = require("../arc");
9
+ var plane_plane_1 = require("./plane-plane");
10
+ var line_sphere_1 = require("./line-sphere");
11
+ var _intersectionLine = /*@__PURE__*/ line_1.line.create();
12
+ var _originPlane = /*@__PURE__*/ plane_1.plane.create();
13
+ _originPlane.distance = 0;
14
+ var _originSphere = /*@__PURE__*/ { center: vec3_1.vec3.create(0, 0, 0), radius: 1 };
15
+ var _intersectionPoints = /*@__PURE__*/ [vec3_1.vec3.create(), vec3_1.vec3.create()];
16
+ // TODO: out must be [Arc, Arc] there is a case where split into three arcs, visible by points or arcs but middle is not visible
17
+ /**
18
+ *
19
+ * @param out \
20
+ * @param inArc
21
+ * @param juctionPlane
22
+ * @returns number of arcs segments in the junction divided by the junction plane.
23
+ */
24
+ function arcSlice(out, inArc, juctionPlane) {
25
+ // arc coverPlane and junctionPlane intersection exist in the range of unit sphere
26
+ var coverRadiusAngle = plane_1.plane.getUnitSphereRadiusAngle(inArc.coverPlane);
27
+ var visibleRadiusAngle = plane_1.plane.getUnitSphereRadiusAngle(juctionPlane);
28
+ // TODO: RESEARCH efficient approach --
29
+ var angleBetween_Cover_Visible = Math.acos(vec3_1.vec3.dot(inArc.coverPlane.normal, juctionPlane.normal));
30
+ if (coverRadiusAngle + visibleRadiusAngle < angleBetween_Cover_Visible - constants_1.EPSILON) { // case A: out of range
31
+ return 0; // No intersection
32
+ }
33
+ // ------------------------------------
34
+ // the case when the arc is completely covered by the juction plane
35
+ if (visibleRadiusAngle + constants_1.EPSILON >= angleBetween_Cover_Visible + coverRadiusAngle) { // case B: fully visible
36
+ arc_1.arc.copy(out[0], inArc);
37
+ return 1;
38
+ }
39
+ // plane-plane intersection line should be calculated for the rest of the calculations
40
+ vec3_1.vec3.copy(_originPlane.normal, inArc.normal);
41
+ var isPlaneJunctions = (0, plane_plane_1.planePlaneJuction)(_intersectionLine, _originPlane, juctionPlane);
42
+ if (!isPlaneJunctions) { // case C: planes are parallel.
43
+ // case A covers opposite directions
44
+ // case B Covers they face each other
45
+ throw new Error("Unexpected case: planes are parallel, case A and B should Cover it");
46
+ }
47
+ // --- read until here ---
48
+ // calculate the intersection points
49
+ var isSphereIntersection = (0, line_sphere_1.lineSphereIntersection)(_intersectionPoints, _intersectionLine, _originSphere);
50
+ if (!isSphereIntersection) {
51
+ // other edge caes should be covered by now
52
+ return 0; // No intersection
53
+ }
54
+ var i0IsCovered = plane_1.plane.distanceToPoint(inArc.coverPlane, _intersectionPoints[0]) > -constants_1.EPSILON;
55
+ var i1IsCovered = plane_1.plane.distanceToPoint(inArc.coverPlane, _intersectionPoints[1]) > -constants_1.EPSILON;
56
+ var p0IsVisible = plane_1.plane.distanceToPoint(juctionPlane, inArc.p0) > -constants_1.EPSILON;
57
+ var p1IsVisible = plane_1.plane.distanceToPoint(juctionPlane, inArc.p1) > -constants_1.EPSILON;
58
+ if (!p0IsVisible && !p1IsVisible && !i0IsCovered && !i1IsCovered) {
59
+ return 0; // No intersection
60
+ }
61
+ if (i0IsCovered && i1IsCovered && p0IsVisible && p1IsVisible) {
62
+ // calculate which points are closer
63
+ var p0i0DistanceSquared = vec3_1.vec3.distanceSquared(inArc.p0, _intersectionPoints[0]);
64
+ var p0i1DistanceSquared = vec3_1.vec3.distanceSquared(inArc.p0, _intersectionPoints[1]);
65
+ var case0 = p0i0DistanceSquared < p0i1DistanceSquared;
66
+ arc_1.arc.set(out[0], inArc.p0, case0 ? _intersectionPoints[0] : _intersectionPoints[1]);
67
+ arc_1.arc.set(out[1], inArc.p1, !case0 ? _intersectionPoints[0] : _intersectionPoints[1]);
68
+ return 2;
69
+ }
70
+ if (i0IsCovered && i1IsCovered) {
71
+ arc_1.arc.set(out[0], _intersectionPoints[0], _intersectionPoints[1]);
72
+ return 1;
73
+ }
74
+ if (p0IsVisible && p1IsVisible) {
75
+ arc_1.arc.copy(out[0], inArc);
76
+ return 1;
77
+ }
78
+ if ((p0IsVisible || p1IsVisible) !== (i0IsCovered || i1IsCovered)) {
79
+ throw new Error("Unexpected case: one covered and one visible point must be present");
80
+ }
81
+ arc_1.arc.set(out[0], p0IsVisible ? inArc.p0 : inArc.p1, i0IsCovered ? _intersectionPoints[0] : _intersectionPoints[1]);
82
+ return 1;
83
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lineSphereIntersection = lineSphereIntersection;
4
+ var vec3_1 = require("../vec3");
5
+ var line_1 = require("../line");
6
+ var _0vector = /*@__PURE__*/ vec3_1.vec3.create(0, 0, 0);
7
+ function lineSphereIntersection(out, inLine, inSphere) {
8
+ vec3_1.vec3.subtract(_0vector, inLine.origin, inSphere.center);
9
+ var distanceSquared = vec3_1.vec3.lengthSquared(_0vector);
10
+ var radiusSquared = inSphere.radius * inSphere.radius;
11
+ var dot = vec3_1.vec3.dot(_0vector, inLine.direction);
12
+ var dotSquared = dot * dot;
13
+ var _a = dotSquared + radiusSquared - distanceSquared;
14
+ if (_a < 0) {
15
+ return false; // no intersection
16
+ }
17
+ else {
18
+ var a = Math.sqrt(_a);
19
+ var t1 = dot - a;
20
+ var t2 = dot + a;
21
+ line_1.line.at(out[0], inLine, t1);
22
+ line_1.line.at(out[1], inLine, t2);
23
+ return true;
24
+ }
25
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.planePlaneJuction = planePlaneJuction;
4
+ var constants_1 = require("../constants");
5
+ var vec3_1 = require("../vec3");
6
+ var _normal1 = vec3_1.vec3.create();
7
+ var _normal2 = vec3_1.vec3.create();
8
+ function planePlaneJuction(out, plane1, plane2) {
9
+ vec3_1.vec3.copy(_normal1, plane1.normal);
10
+ vec3_1.vec3.copy(_normal2, plane2.normal);
11
+ var distance1 = plane1.distance;
12
+ var distance2 = plane2.distance;
13
+ var origin = out.origin, direction = out.direction;
14
+ var dot = vec3_1.vec3.dot(_normal1, _normal2);
15
+ if (Math.abs(dot) > 1 - constants_1.EPSILON) {
16
+ return false; // Planes are parallel, no intersection
17
+ }
18
+ vec3_1.vec3.cross(direction, _normal1, _normal2);
19
+ var magnitudeSquired = vec3_1.vec3.lengthSquared(out.direction);
20
+ if (magnitudeSquired < constants_1.EPSILON) {
21
+ return false; // No valid intersection line
22
+ }
23
+ var magnitude = Math.sqrt(magnitudeSquired);
24
+ direction[0] /= magnitude;
25
+ direction[1] /= magnitude;
26
+ direction[2] /= magnitude;
27
+ var determinant;
28
+ // Calculate the intersection point
29
+ // set z = 0
30
+ determinant = _normal1[0] * _normal2[1] - _normal1[1] * _normal2[0];
31
+ if (Math.abs(determinant) > constants_1.EPSILON) {
32
+ origin[0] = (distance1 * _normal2[1] - distance2 * _normal1[1]) / determinant;
33
+ origin[1] = (distance2 * _normal1[0] - distance1 * _normal2[0]) / determinant;
34
+ origin[2] = 0;
35
+ }
36
+ else {
37
+ // set y = 0
38
+ determinant = _normal1[0] * _normal2[2] - _normal1[2] * _normal2[0];
39
+ if (Math.abs(determinant) > constants_1.EPSILON) {
40
+ origin[0] = (distance1 * _normal2[2] - distance2 * _normal1[2]) / determinant;
41
+ origin[1] = 0;
42
+ origin[2] = (distance2 * _normal1[0] - distance1 * _normal2[0]) / determinant;
43
+ }
44
+ else {
45
+ // set x = 0
46
+ determinant = _normal1[1] * _normal2[2] - _normal1[2] * _normal2[1];
47
+ if (Math.abs(determinant) > constants_1.EPSILON) {
48
+ origin[0] = 0;
49
+ origin[1] = (distance1 * _normal2[2] - distance2 * _normal1[2]) / determinant;
50
+ origin[2] = (distance2 * _normal1[1] - distance1 * _normal2[1]) / determinant;
51
+ }
52
+ else {
53
+ return false; // No valid intersection point
54
+ }
55
+ }
56
+ }
57
+ return true;
58
+ }