@pirireis/webglobeplugins 1.0.2 → 1.0.3
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.
- package/Math/{angle-calculation.ts → angle-calculation.js} +14 -18
- package/Math/{arc-cdf-points.ts → arc-cdf-points.js} +272 -329
- package/Math/{arc-generate-points-exponantial.ts → arc-generate-points-exponantial.js} +254 -299
- package/Math/{arc.ts → arc.js} +292 -421
- package/Math/bounds/line-bbox.js +186 -225
- package/Math/{circle-cdf-points.ts → circle-cdf-points.js} +78 -143
- package/Math/{circle.ts → circle.js} +33 -49
- package/Math/{constants.ts → constants.js} +4 -12
- package/Math/contour/{quadtreecontours.ts → quadtreecontours.js} +300 -371
- package/Math/contour/quadtreecontours1.js +298 -336
- package/Math/{finite-line-2d.ts → finite-line-2d.js} +58 -68
- package/Math/{haversine.ts → haversine.js} +22 -33
- package/Math/index.js +1 -0
- package/Math/juction/{arc-plane.ts → arc-plane.js} +143 -203
- package/Math/juction/{line-sphere.ts → line-sphere.js} +22 -32
- package/Math/juction/{plane-plane.ts → plane-plane.js} +53 -62
- package/Math/{line.ts → line.js} +52 -84
- package/Math/matrix4.js +1 -0
- package/Math/{methods.ts → methods.js} +126 -182
- package/Math/{plane.ts → plane.js} +56 -92
- package/Math/{quaternion.ts → quaternion.js} +106 -128
- package/Math/templete-shapes/{grid-visually-equal.ts → grid-visually-equal.js} +65 -118
- package/Math/tessellation/constants.js +1 -0
- package/Math/tessellation/{methods.ts → methods.js} +49 -79
- package/Math/tessellation/{nearest-value-padding.ts → nearest-value-padding.js} +112 -147
- package/Math/tessellation/{spherical-triangle-area.ts → spherical-triangle-area.js} +99 -127
- package/Math/tessellation/{tile-merger.ts → tile-merger.js} +429 -578
- package/Math/tessellation/{triangle-tessellation.ts → triangle-tessellation.js} +386 -533
- package/Math/tessellation/types.js +1 -0
- package/Math/types.js +1 -0
- package/Math/utils.js +2 -3
- package/Math/{vec3.ts → vec3.js} +155 -227
- package/Math/{xyz-tile.ts → xyz-tile.js} +18 -26
- package/algorithms/search-binary.js +16 -14
- package/altitude-locator/adaptors.js +1 -0
- package/altitude-locator/keymethod.js +1 -0
- package/altitude-locator/plugin.js +344 -445
- package/altitude-locator/types.js +21 -26
- package/compass-rose/compass-rose-padding-flat.js +230 -274
- package/compass-rose/{compass-text-writer.ts → compass-text-writer.js} +155 -210
- package/compass-rose/index.js +3 -3
- package/{constants.ts → constants.js} +6 -8
- package/heatwave/datamanager.js +149 -168
- package/heatwave/heatwave.js +206 -261
- package/heatwave/index.js +5 -5
- package/heatwave/isobar.js +303 -340
- package/heatwave/{texture-point-sampler.ts → texture-point-sampler.js} +187 -220
- package/investigation-tools/draw/tiles/adapters.js +67 -0
- package/investigation-tools/draw/tiles/{tiles.ts → tiles.js} +128 -162
- package/jest.config.js +7 -6
- package/package.json +1 -1
- package/pin/pin-object-array1.js +300 -381
- package/pin/pin-point-totem1.js +60 -77
- package/programs/arrowfield/arrow-field.js +60 -89
- package/programs/arrowfield/logic.js +141 -173
- package/programs/data2legend/density-to-legend.js +68 -86
- package/programs/data2legend/point-to-density-texture.js +67 -84
- package/programs/float2legendwithratio/index.js +2 -3
- package/programs/float2legendwithratio/logic.js +118 -144
- package/programs/float2legendwithratio/object.js +104 -141
- package/programs/helpers/blender.js +58 -73
- package/programs/helpers/{fadeaway.ts → fadeaway.js} +60 -73
- package/programs/index.js +20 -19
- package/programs/line-on-globe/circle-accurate-3d.js +85 -112
- package/programs/line-on-globe/circle-accurate-flat.js +148 -200
- package/programs/line-on-globe/degree-padding-around-circle-3d.js +102 -134
- package/programs/line-on-globe/index.js +1 -0
- package/programs/line-on-globe/lines-color-instanced-flat.js +80 -99
- package/programs/line-on-globe/linestrip/data.js +4 -0
- package/programs/line-on-globe/linestrip/{linestrip.ts → linestrip.js} +93 -152
- package/programs/line-on-globe/{naive-accurate-flexible.ts → naive-accurate-flexible.js} +126 -175
- package/programs/line-on-globe/util.js +5 -8
- package/programs/picking/pickable-polygon-renderer.js +98 -129
- package/programs/picking/pickable-renderer.js +98 -130
- package/programs/point-on-globe/element-globe-surface-glow.js +93 -122
- package/programs/point-on-globe/element-point-glow.js +80 -114
- package/programs/point-on-globe/square-pixel-point.js +121 -139
- package/programs/polygon-on-globe/{texture-dem-triangles.ts → texture-dem-triangles.js} +163 -207
- package/programs/{programcache.ts → programcache.js} +126 -134
- package/programs/rings/index.js +1 -1
- package/programs/rings/partial-ring/{piece-of-pie.ts → piece-of-pie.js} +152 -222
- package/programs/totems/camera-totem-attactment-interface.js +1 -0
- package/programs/totems/{camerauniformblock.ts → camerauniformblock.js} +225 -310
- package/programs/totems/{canvas-webglobe-info.ts → canvas-webglobe-info.js} +132 -147
- package/programs/totems/{dem-textures-manager.ts → dem-textures-manager.js} +257 -360
- package/programs/totems/{globe-changes.ts → globe-changes.js} +59 -79
- package/programs/totems/gpu-selection-uniform-block.js +99 -127
- package/programs/totems/{index.ts → index.js} +2 -2
- package/programs/two-d/pixel-padding-for-compass.js +87 -101
- package/programs/util.js +14 -19
- package/programs/vectorfields/logics/{constants.ts → constants.js} +4 -5
- package/programs/vectorfields/logics/{drawrectangleparticles.ts → drawrectangleparticles.js} +80 -115
- package/programs/vectorfields/logics/index.js +2 -4
- package/programs/vectorfields/logics/particle-ubo.js +16 -0
- package/programs/vectorfields/logics/{pixelbased.ts → pixelbased.js} +86 -115
- package/programs/vectorfields/logics/ubo.js +51 -57
- package/programs/vectorfields/{pingpongbuffermanager.ts → pingpongbuffermanager.js} +99 -113
- package/range-tools-on-terrain/bearing-line/{adapters.ts → adapters.js} +114 -154
- package/range-tools-on-terrain/bearing-line/{plugin.ts → plugin.js} +457 -569
- package/range-tools-on-terrain/bearing-line/types.js +1 -0
- package/range-tools-on-terrain/circle-line-chain/{adapters.ts → adapters.js} +85 -104
- package/range-tools-on-terrain/circle-line-chain/{chain-list-map.ts → chain-list-map.js} +382 -446
- package/range-tools-on-terrain/circle-line-chain/{plugin.ts → plugin.js} +464 -607
- package/range-tools-on-terrain/circle-line-chain/types.js +1 -0
- package/range-tools-on-terrain/range-ring/{adapters.ts → adapters.js} +93 -114
- package/range-tools-on-terrain/range-ring/{enum.ts → enum.js} +2 -2
- package/range-tools-on-terrain/range-ring/{plugin.ts → plugin.js} +377 -444
- package/range-tools-on-terrain/range-ring/rangeringangletext.js +331 -0
- package/range-tools-on-terrain/range-ring/types.js +9 -0
- package/semiplugins/interface.js +1 -0
- package/semiplugins/lightweight/{line-plugin.ts → line-plugin.js} +221 -342
- package/semiplugins/lightweight/{piece-of-pie-plugin.ts → piece-of-pie-plugin.js} +200 -275
- package/semiplugins/shape-on-terrain/{arc-plugin.ts → arc-plugin.js} +481 -616
- package/semiplugins/shape-on-terrain/{circle-plugin.ts → circle-plugin.js} +444 -588
- package/semiplugins/shape-on-terrain/{padding-1-degree.ts → padding-1-degree.js} +539 -713
- package/semiplugins/shape-on-terrain/terrain-polygon/{adapters.ts → adapters.js} +55 -69
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{cache.ts → cache.js} +102 -149
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{index-polygon-map.ts → index-polygon-map.js} +45 -58
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{manager.ts → manager.js} +4 -4
- package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +177 -196
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{polygon-to-triangles.ts → polygon-to-triangles.js} +100 -144
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{random.ts → random.js} +121 -165
- package/semiplugins/shape-on-terrain/terrain-polygon/data/types.js +1 -0
- package/semiplugins/shape-on-terrain/terrain-polygon/data/{worker-contact.ts → worker-contact.js} +63 -81
- package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +125 -146
- package/semiplugins/shape-on-terrain/terrain-polygon/{terrain-polygon.ts → terrain-polygon.js} +219 -265
- package/semiplugins/shape-on-terrain/terrain-polygon/types.js +8 -0
- package/semiplugins/shell/bbox-renderer/index.js +2 -0
- package/semiplugins/shell/bbox-renderer/{logic.ts → logic.js} +209 -273
- package/semiplugins/shell/bbox-renderer/object.js +75 -0
- package/semiplugins/type.js +1 -0
- package/semiplugins/utility/{container-plugin.ts → container-plugin.js} +94 -126
- package/semiplugins/utility/{object-pass-container-plugin.ts → object-pass-container-plugin.js} +80 -101
- package/shaders/fragment-toy/firework.js +1 -1
- package/shaders/fragment-toy/singularity.js +2 -5
- package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
- package/tracks/point-heat-map/index.js +1 -0
- package/tracks/point-heat-map/plugin-webworker.js +121 -148
- package/tracks/point-heat-map/point-to-heat-map-flow.js +121 -150
- package/tracks/point-tracks/key-methods.js +2 -3
- package/tracks/point-tracks/plugin.js +401 -487
- package/tracks/timetracks/adaptors-line-strip.js +65 -79
- package/tracks/timetracks/plugin-line-strip.js +240 -295
- package/tracks/timetracks/program-line-strip.js +411 -495
- package/tracks/timetracks/programpoint-line-strip.js +109 -137
- package/types.js +19 -0
- package/util/account/bufferoffsetmanager.js +176 -209
- package/util/account/create-buffermap-orchastration.js +39 -0
- package/util/account/index.js +3 -6
- package/util/account/single-attribute-buffer-management/{buffer-manager.ts → buffer-manager.js} +119 -151
- package/util/account/single-attribute-buffer-management/{buffer-orchestrator.ts → buffer-orchestrator.js} +212 -238
- package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.ts → buffer-orchestrator1.js} +159 -184
- package/util/account/single-attribute-buffer-management/{index.ts → index.js} +4 -11
- package/util/account/single-attribute-buffer-management/{object-store.ts → object-store.js} +55 -76
- package/util/account/single-attribute-buffer-management/types.js +1 -0
- package/util/account/util.js +18 -22
- package/util/algorithms/index.js +1 -0
- package/util/algorithms/search-binary.js +25 -26
- package/util/build-strategy/{static-dynamic.ts → static-dynamic.js} +41 -50
- package/util/check/index.js +1 -0
- package/util/check/typecheck.js +66 -0
- package/util/{frame-counter-trigger.ts → frame-counter-trigger.js} +84 -99
- package/util/geometry/{index.ts → index.js} +121 -155
- package/util/gl-util/buffer/{attribute-loader.ts → attribute-loader.js} +62 -84
- package/util/gl-util/buffer/{index.ts → index.js} +3 -6
- package/util/gl-util/draw-options/{methods.ts → methods.js} +32 -47
- package/util/gl-util/uniform-block/{manager.ts → manager.js} +200 -232
- package/util/{globe-default-gl-states.ts → globe-default-gl-states.js} +4 -5
- package/util/{helper-methods.ts → helper-methods.js} +8 -9
- package/util/index.js +10 -9
- package/util/interpolation/index.js +1 -0
- package/util/interpolation/timetrack/index.js +2 -9
- package/util/interpolation/timetrack/timetrack-interpolator.js +79 -94
- package/util/interpolation/timetrack/web-worker.js +46 -51
- package/util/picking/{fence.ts → fence.js} +43 -47
- package/util/picking/{picker-displayer.ts → picker-displayer.js} +176 -226
- package/util/programs/draw-from-pixel-coords.js +164 -201
- package/util/programs/{draw-texture-on-canvas.ts → draw-texture-on-canvas.js} +69 -91
- package/util/programs/supersampletotextures.js +97 -130
- package/util/programs/texturetoglobe.js +128 -153
- package/util/shaderfunctions/{geometrytransformations.ts → geometrytransformations.js} +44 -106
- package/util/shaderfunctions/index.js +2 -2
- package/util/shaderfunctions/nodata.js +2 -4
- package/util/shaderfunctions/noisefunctions.js +7 -10
- package/util/{webglobjectbuilders.ts → webglobjectbuilders.js} +358 -446
- package/vectorfield/arrowfield/adaptor.js +11 -11
- package/vectorfield/arrowfield/index.js +3 -3
- package/vectorfield/arrowfield/plugin.js +83 -128
- package/vectorfield/waveparticles/adaptor.js +15 -16
- package/vectorfield/waveparticles/index.js +3 -3
- package/vectorfield/waveparticles/{plugin.ts → plugin.js} +415 -506
- package/vectorfield/wind/adapters/{image-to-fields.ts → image-to-fields.js} +61 -74
- package/vectorfield/wind/adapters/types.js +1 -0
- package/vectorfield/wind/{imagetovectorfieldandmagnitude.ts → imagetovectorfieldandmagnitude.js} +53 -78
- package/vectorfield/wind/index.js +5 -5
- package/vectorfield/wind/{plugin-persistant copy.ts → plugin-persistant copy.js } +364 -461
- package/vectorfield/wind/{plugin-persistant.ts → plugin-persistant.js} +375 -483
- package/vectorfield/wind/plugin.js +685 -883
- package/vectorfield/wind/vectorfieldimage.js +23 -27
- package/write-text/{context-text-bulk.ts → context-text-bulk.js} +200 -285
- package/write-text/context-text3.js +167 -0
- package/write-text/{context-text4.ts → context-text4.js} +146 -231
- package/write-text/context-textDELETE.js +94 -125
- package/write-text/objectarraylabels/{index.ts → index.js} +2 -2
- package/write-text/objectarraylabels/objectarraylabels.js +200 -247
- package/Math/matrix4.ts +0 -0
- package/Math/mesh/mapbox-delaunay.d.ts +0 -74
- package/Math/roadmap.md +0 -10
- package/Math/tessellation/constants.ts +0 -1
- package/Math/tessellation/roadmap.md +0 -48
- package/Math/tessellation/types.ts +0 -1
- package/Math/types.ts +0 -68
- package/investigation-tools/draw/tiles/adapters.ts +0 -133
- package/programs/line-on-globe/linestrip/data.ts +0 -29
- package/programs/polygon-on-globe/roadmap.md +0 -8
- package/programs/totems/camera-totem-attactment-interface.ts +0 -4
- package/programs/vectorfields/logics/particle-ubo.ts +0 -23
- package/publish.bat +0 -62
- package/range-tools-on-terrain/bearing-line/types.ts +0 -65
- package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
- package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
- package/range-tools-on-terrain/range-ring/types.ts +0 -30
- package/semiplugins/interface.ts +0 -14
- package/semiplugins/shape-on-terrain/goal.md +0 -12
- package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +0 -20
- package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +0 -209
- package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +0 -5
- package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +0 -37
- package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +0 -90
- package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +0 -69
- package/semiplugins/shell/bbox-renderer/index.ts +0 -2
- package/semiplugins/shell/bbox-renderer/object.ts +0 -129
- package/semiplugins/type.ts +0 -8
- package/terrain-plugin.mmd +0 -83
- package/tests/Math/arc-sampling-test.js +0 -367
- package/tests/Math/arc-sampling-test.ts +0 -429
- package/tests/Math/arc.test.ts +0 -77
- package/tests/Math/junction/arc-limit.test.ts +0 -7
- package/tests/Math/junction/arc-plane-points.test.ts +0 -196
- package/tests/Math/junction/arc-plane.test.ts +0 -172
- package/tests/Math/junction/line-sphere.test.ts +0 -127
- package/tests/Math/junction/plane-plane.test.ts +0 -91
- package/tests/Math/plane-test.ts +0 -17
- package/tests/Math/plane.test.ts +0 -43
- package/tests/Math/vec3.test.ts +0 -33
- package/tracks/point-heat-map/readme.md +0 -15
- package/tracks/timetracks/readme.md +0 -1
- package/tsconfig.json +0 -22
- package/types/@pirireis/webglobe.d.ts +0 -102
- package/types/delaunator.d.ts +0 -40
- package/types/earcut.d.ts +0 -11
- package/types/rbush.d.ts +0 -57
- package/types.ts +0 -319
- package/util/account/create-buffermap-orchastration.ts +0 -85
- package/util/account/single-attribute-buffer-management/types.ts +0 -43
- package/util/check/typecheck.ts +0 -74
- package/vectorfield/wind/adapters/types.ts +0 -12
- package/write-text/context-text3.ts +0 -252
- package/write-text/objectarraylabels/objectarraylabels.d.ts +0 -72
|
@@ -1,68 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const x = (value - b1) / m1;
|
|
60
|
-
// check if point is within line segment
|
|
61
|
-
if (x < Math.min(x0, x1) || x > Math.max(x0, x1)) {
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
out[0] = x;
|
|
65
|
-
out[1] = value;
|
|
66
|
-
return 1;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
1
|
+
function junctionPoint(out, inLine, origin, slope) {
|
|
2
|
+
const x0 = inLine[0];
|
|
3
|
+
const y0 = inLine[1];
|
|
4
|
+
const x1 = inLine[0];
|
|
5
|
+
const y1 = inLine[1];
|
|
6
|
+
const m1 = (y1 - y0) / (x1 - x0); // slope of line
|
|
7
|
+
const b1 = y0 - m1 * x0; // y-intercept of line
|
|
8
|
+
const m2 = slope;
|
|
9
|
+
const b2 = origin[1] - m2 * origin[0]; // y-intercept of line
|
|
10
|
+
if (m1 === m2) {
|
|
11
|
+
return 0; // parallel lines
|
|
12
|
+
}
|
|
13
|
+
const x = (b2 - b1) / (m1 - m2);
|
|
14
|
+
const y = m1 * x + b1;
|
|
15
|
+
// check if point is within line segment
|
|
16
|
+
if (x < Math.min(x0, x1) || x > Math.max(x0, x1) ||
|
|
17
|
+
y < Math.min(y0, y1) || y > Math.max(y0, y1)) {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
out[0] = x;
|
|
21
|
+
out[1] = y;
|
|
22
|
+
return 1;
|
|
23
|
+
}
|
|
24
|
+
export function junctionVerticalOrHorizontalLines(out, inLine1, value, isVertical) {
|
|
25
|
+
const x0 = inLine1[0];
|
|
26
|
+
const y0 = inLine1[1];
|
|
27
|
+
const x1 = inLine1[0];
|
|
28
|
+
const y1 = inLine1[1];
|
|
29
|
+
if (isVertical) {
|
|
30
|
+
// vertical line x = value
|
|
31
|
+
const m1 = (y1 - y0) / (x1 - x0);
|
|
32
|
+
const b1 = y0 - m1 * x0;
|
|
33
|
+
const y = m1 * value + b1;
|
|
34
|
+
// check if point is within line segment
|
|
35
|
+
if (y < Math.min(y0, y1) || y > Math.max(y0, y1)) {
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
out[0] = value;
|
|
39
|
+
out[1] = y;
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// horizontal line y = value
|
|
44
|
+
const m1 = (y1 - y0) / (x1 - x0);
|
|
45
|
+
const b1 = y0 - m1 * x0;
|
|
46
|
+
if (m1 === 0) {
|
|
47
|
+
return 0; // parallel lines
|
|
48
|
+
}
|
|
49
|
+
const x = (value - b1) / m1;
|
|
50
|
+
// check if point is within line segment
|
|
51
|
+
if (x < Math.min(x0, x1) || x > Math.max(x0, x1)) {
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
out[0] = x;
|
|
55
|
+
out[1] = value;
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,33 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
* @param
|
|
6
|
-
* @param
|
|
7
|
-
* @
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// Haversine: a = sin²(Δφ/2) + cos(φ1)cos(φ2)sin²(Δλ/2)
|
|
25
|
-
const a =
|
|
26
|
-
Math.sin(Δφ * 0.5) ** 2 +
|
|
27
|
-
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ * 0.5) ** 2;
|
|
28
|
-
|
|
29
|
-
// c = 2 * atan2(√a, √(1−a))
|
|
30
|
-
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
31
|
-
|
|
32
|
-
return c; // arc length
|
|
33
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Calculate great-circle distance (arc length) between two lat/lon points
|
|
3
|
+
* @param lat1 Latitude of point 1 (Radian)
|
|
4
|
+
* @param lon1 Longitude of point 1 (Radian)
|
|
5
|
+
* @param lat2 Latitude of point 2 (Radian)
|
|
6
|
+
* @param lon2 Longitude of point 2 (Radian)
|
|
7
|
+
* @returns Distance in unit sphere radius
|
|
8
|
+
*/
|
|
9
|
+
export function haversine(lat1, lon1, lat2, lon2) {
|
|
10
|
+
// Convert to radians in-place (minimal allocations)
|
|
11
|
+
const φ1 = lat1;
|
|
12
|
+
const φ2 = lat2;
|
|
13
|
+
const Δφ = lat2 - lat1;
|
|
14
|
+
const Δλ = lon2 - lon1;
|
|
15
|
+
// Haversine: a = sin²(Δφ/2) + cos(φ1)cos(φ2)sin²(Δλ/2)
|
|
16
|
+
const a = Math.sin(Δφ * 0.5) ** 2 +
|
|
17
|
+
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ * 0.5) ** 2;
|
|
18
|
+
// c = 2 * atan2(√a, √(1−a))
|
|
19
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
20
|
+
return c; // arc length
|
|
21
|
+
}
|
|
22
|
+
;
|
package/Math/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -1,203 +1,143 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
// TODO:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
out[
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return 1;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
function showArc(arc: Arc): string {
|
|
150
|
-
return `Arc: p0(${arc.p0[0].toFixed(2)}, ${arc.p0[1].toFixed(2)}, ${arc.p0[2]}) - p1(${arc.p1[0]}, ${arc.p1[1].toFixed(2)}, ${arc.p1[2].toFixed(2)})`
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function showPlane(plane: Plane): string {
|
|
154
|
-
return `Plane: n(${plane.normal[0].toFixed(2)}, ${plane.normal[1].toFixed(2)}, ${plane.normal[2].toFixed(2)}) d(${plane.distance.toFixed(2)})`
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export function pointsOnArc(inArc: Arc, junctionPlane: Plane, out: [Vec3, Vec3]): number /*count*/ {
|
|
158
|
-
// case A: junction plane is too far
|
|
159
|
-
if (Math.abs(junctionPlane.distance) > 1) {
|
|
160
|
-
return 0;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Calculate plane-plane intersection
|
|
164
|
-
vec3copy(_originPlane.normal, inArc.normal);
|
|
165
|
-
const isPlaneJunctions = planePlaneJunction(_intersectionLine, _originPlane, junctionPlane);
|
|
166
|
-
|
|
167
|
-
// case B: planes are parallel
|
|
168
|
-
if (!isPlaneJunctions) {
|
|
169
|
-
return 0;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Calculate intersection points with unit sphere
|
|
173
|
-
const isSphereIntersection = lineSphereIntersection(_intersectionPoints, _intersectionLine, _originSphere);
|
|
174
|
-
// case C: intersection line does not intersect the unit sphere
|
|
175
|
-
if (!isSphereIntersection) {
|
|
176
|
-
return 0;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Check which intersection points are covered by the arc
|
|
180
|
-
const i0IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[0]) > -EPSILON;
|
|
181
|
-
const i1IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[1]) > -EPSILON;
|
|
182
|
-
|
|
183
|
-
// Check which endpoints are visible
|
|
184
|
-
|
|
185
|
-
let count = 0;
|
|
186
|
-
|
|
187
|
-
// Add covered intersection points
|
|
188
|
-
if (i0IsCovered) {
|
|
189
|
-
copy(out[count], _intersectionPoints[0]);
|
|
190
|
-
count++;
|
|
191
|
-
}
|
|
192
|
-
if (Math.abs(Math.abs(junctionPlane.distance) - 1) < EPSILON) {
|
|
193
|
-
return count; // Tangent case, only one intersection point
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (i1IsCovered) {
|
|
197
|
-
copy(out[count], _intersectionPoints[1]);
|
|
198
|
-
count++;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
return count;
|
|
203
|
-
}
|
|
1
|
+
import { EPSILON } from "../constants";
|
|
2
|
+
import { create as vec3create, copy as vec3copy, dot, distanceSquared, copy, normalize } from "../vec3";
|
|
3
|
+
import { create as lineCreate } from "../line";
|
|
4
|
+
import { create as planeCreate, distanceToPoint, getUnitSphereRadiusAngle } from "../plane";
|
|
5
|
+
import { copy as arcCopy, set as arcSet } from "../arc";
|
|
6
|
+
import { planePlaneJunction } from "./plane-plane";
|
|
7
|
+
import { lineSphereIntersection } from "./line-sphere";
|
|
8
|
+
const _intersectionLine = /*@__PURE__*/ lineCreate();
|
|
9
|
+
const _originPlane = /*@__PURE__*/ planeCreate();
|
|
10
|
+
_originPlane.distance = 0;
|
|
11
|
+
const _originSphere = /*@__PURE__*/ { center: vec3create(0, 0, 0), radius: 1 };
|
|
12
|
+
const _intersectionPoints = /*@__PURE__*/ [vec3create(), vec3create()];
|
|
13
|
+
// 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
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param out \
|
|
17
|
+
* @param inArc
|
|
18
|
+
* @param junctionPlane
|
|
19
|
+
* @returns number of arcs segments in the junction divided by the junction plane.
|
|
20
|
+
*/
|
|
21
|
+
export function arcSlice(out, inArc, junctionPlane) {
|
|
22
|
+
if (junctionPlane.distance < -1 + EPSILON) {
|
|
23
|
+
arcCopy(out[0], inArc);
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
// arc coverPlane and junctionPlane intersection exist in the range of unit sphere
|
|
27
|
+
const coverRadiusAngle = getUnitSphereRadiusAngle(inArc.coverPlane);
|
|
28
|
+
const visibleRadiusAngle = getUnitSphereRadiusAngle(junctionPlane);
|
|
29
|
+
// TODO: RESEARCH efficient approach --
|
|
30
|
+
const angleBetween_Cover_Visible = Math.acos(dot(inArc.coverPlane.normal, junctionPlane.normal));
|
|
31
|
+
if (coverRadiusAngle + visibleRadiusAngle < angleBetween_Cover_Visible - EPSILON) { // case A: out of range
|
|
32
|
+
return 0; // No intersection
|
|
33
|
+
}
|
|
34
|
+
// ------------------------------------
|
|
35
|
+
// the case when the arc is completely covered by the juction plane
|
|
36
|
+
if (visibleRadiusAngle + EPSILON >= angleBetween_Cover_Visible + coverRadiusAngle) { // case B: fully visible
|
|
37
|
+
arcCopy(out[0], inArc);
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
// plane-plane intersection line should be calculated for the rest of the calculations
|
|
41
|
+
vec3copy(_originPlane.normal, inArc.normal);
|
|
42
|
+
const isPlaneJunctions = planePlaneJunction(_intersectionLine, _originPlane, junctionPlane);
|
|
43
|
+
if (!isPlaneJunctions) { // case C: planes are parallel.
|
|
44
|
+
if (junctionPlane.distance <= 0) { // same direction
|
|
45
|
+
arcCopy(out[0], inArc);
|
|
46
|
+
return 1; // No intersection
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return 0; // No intersection
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// --- read until here ---
|
|
53
|
+
// calculate the intersection points
|
|
54
|
+
const isSphereIntersection = lineSphereIntersection(_intersectionPoints, _intersectionLine, _originSphere);
|
|
55
|
+
if (!isSphereIntersection) {
|
|
56
|
+
return 0; // No intersection
|
|
57
|
+
}
|
|
58
|
+
// ← ADD NORMALIZATION HERE
|
|
59
|
+
normalize(_intersectionPoints[0], _intersectionPoints[0]);
|
|
60
|
+
normalize(_intersectionPoints[1], _intersectionPoints[1]);
|
|
61
|
+
const i0IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[0]) > EPSILON;
|
|
62
|
+
const i1IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[1]) > EPSILON;
|
|
63
|
+
const p0IsVisible = distanceToPoint(junctionPlane, inArc.p0) > EPSILON;
|
|
64
|
+
const p1IsVisible = distanceToPoint(junctionPlane, inArc.p1) > EPSILON;
|
|
65
|
+
if (!p0IsVisible && !p1IsVisible && !i0IsCovered && !i1IsCovered) {
|
|
66
|
+
return 0; // No intersection
|
|
67
|
+
}
|
|
68
|
+
if (i0IsCovered && i1IsCovered && p0IsVisible && p1IsVisible) {
|
|
69
|
+
// calculate which points are closer
|
|
70
|
+
if (dot(inArc.coverPlane.normal, junctionPlane.normal) > 1 - EPSILON) {
|
|
71
|
+
arcCopy(out[0], inArc);
|
|
72
|
+
return 1;
|
|
73
|
+
}
|
|
74
|
+
else if (dot(inArc.coverPlane.normal, junctionPlane.normal) < -1 + EPSILON) {
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
// Determine which intersection point is closer to p0
|
|
78
|
+
const p0i0DistanceSquared = distanceSquared(inArc.p0, _intersectionPoints[0]);
|
|
79
|
+
const p0i1DistanceSquared = distanceSquared(inArc.p0, _intersectionPoints[1]);
|
|
80
|
+
const closerToP0 = p0i0DistanceSquared < p0i1DistanceSquared ? 0 : 1;
|
|
81
|
+
// The visible portion is from p0 to the closer intersection point
|
|
82
|
+
arcSet(out[0], inArc.p0, _intersectionPoints[closerToP0]);
|
|
83
|
+
// The second arc goes from the farther point to p1
|
|
84
|
+
arcSet(out[1], _intersectionPoints[1 - closerToP0], inArc.p1);
|
|
85
|
+
return 2;
|
|
86
|
+
}
|
|
87
|
+
if (i0IsCovered && i1IsCovered) {
|
|
88
|
+
arcSet(out[0], _intersectionPoints[0], _intersectionPoints[1]);
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
if (p0IsVisible && p1IsVisible) {
|
|
92
|
+
arcCopy(out[0], inArc);
|
|
93
|
+
return 1;
|
|
94
|
+
}
|
|
95
|
+
if ((p0IsVisible || p1IsVisible) !== (i0IsCovered || i1IsCovered)) {
|
|
96
|
+
throw new Error("Unexpected case: one covered and one visible point must be present");
|
|
97
|
+
}
|
|
98
|
+
arcSet(out[0], p0IsVisible ? inArc.p0 : inArc.p1, i0IsCovered ? _intersectionPoints[0] : _intersectionPoints[1]);
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
function showArc(arc) {
|
|
102
|
+
return `Arc: p0(${arc.p0[0].toFixed(2)}, ${arc.p0[1].toFixed(2)}, ${arc.p0[2]}) - p1(${arc.p1[0]}, ${arc.p1[1].toFixed(2)}, ${arc.p1[2].toFixed(2)})`;
|
|
103
|
+
}
|
|
104
|
+
function showPlane(plane) {
|
|
105
|
+
return `Plane: n(${plane.normal[0].toFixed(2)}, ${plane.normal[1].toFixed(2)}, ${plane.normal[2].toFixed(2)}) d(${plane.distance.toFixed(2)})`;
|
|
106
|
+
}
|
|
107
|
+
export function pointsOnArc(inArc, junctionPlane, out) {
|
|
108
|
+
// case A: junction plane is too far
|
|
109
|
+
if (Math.abs(junctionPlane.distance) > 1) {
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
// Calculate plane-plane intersection
|
|
113
|
+
vec3copy(_originPlane.normal, inArc.normal);
|
|
114
|
+
const isPlaneJunctions = planePlaneJunction(_intersectionLine, _originPlane, junctionPlane);
|
|
115
|
+
// case B: planes are parallel
|
|
116
|
+
if (!isPlaneJunctions) {
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
// Calculate intersection points with unit sphere
|
|
120
|
+
const isSphereIntersection = lineSphereIntersection(_intersectionPoints, _intersectionLine, _originSphere);
|
|
121
|
+
// case C: intersection line does not intersect the unit sphere
|
|
122
|
+
if (!isSphereIntersection) {
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
// Check which intersection points are covered by the arc
|
|
126
|
+
const i0IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[0]) > -EPSILON;
|
|
127
|
+
const i1IsCovered = distanceToPoint(inArc.coverPlane, _intersectionPoints[1]) > -EPSILON;
|
|
128
|
+
// Check which endpoints are visible
|
|
129
|
+
let count = 0;
|
|
130
|
+
// Add covered intersection points
|
|
131
|
+
if (i0IsCovered) {
|
|
132
|
+
copy(out[count], _intersectionPoints[0]);
|
|
133
|
+
count++;
|
|
134
|
+
}
|
|
135
|
+
if (Math.abs(Math.abs(junctionPlane.distance) - 1) < EPSILON) {
|
|
136
|
+
return count; // Tangent case, only one intersection point
|
|
137
|
+
}
|
|
138
|
+
if (i1IsCovered) {
|
|
139
|
+
copy(out[count], _intersectionPoints[1]);
|
|
140
|
+
count++;
|
|
141
|
+
}
|
|
142
|
+
return count;
|
|
143
|
+
}
|
|
@@ -1,32 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const sqrtDiscriminant = Math.sqrt(discriminant);
|
|
24
|
-
const t1 = (-dot_ - sqrtDiscriminant) / dirLengthSq;
|
|
25
|
-
const t2 = (-dot_ + sqrtDiscriminant) / dirLengthSq;
|
|
26
|
-
|
|
27
|
-
at(out[0], inLine, t1);
|
|
28
|
-
at(out[1], inLine, t2);
|
|
29
|
-
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
1
|
+
import { create, dot, lengthSquared, subtract } from "../vec3";
|
|
2
|
+
import { at } from "../line";
|
|
3
|
+
const _0vector = /*@__PURE__*/ create(0, 0, 0);
|
|
4
|
+
export function lineSphereIntersection(out, inLine, inSphere) {
|
|
5
|
+
subtract(_0vector, inLine.origin, inSphere.center);
|
|
6
|
+
const dirLengthSq = lengthSquared(inLine.direction);
|
|
7
|
+
const dot_ = dot(_0vector, inLine.direction);
|
|
8
|
+
const distanceSquared = lengthSquared(_0vector);
|
|
9
|
+
const radiusSquared = inSphere.radius * inSphere.radius;
|
|
10
|
+
const discriminant = dot_ * dot_ - dirLengthSq * (distanceSquared - radiusSquared);
|
|
11
|
+
if (discriminant < 0) {
|
|
12
|
+
return false; // no intersection
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
const sqrtDiscriminant = Math.sqrt(discriminant);
|
|
16
|
+
const t1 = (-dot_ - sqrtDiscriminant) / dirLengthSq;
|
|
17
|
+
const t2 = (-dot_ + sqrtDiscriminant) / dirLengthSq;
|
|
18
|
+
at(out[0], inLine, t1);
|
|
19
|
+
at(out[1], inLine, t2);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|