astro-viewer 1.3.0
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/README.md +373 -0
- package/dist/astroviewer.cjs +13941 -0
- package/dist/astroviewer.cjs.map +1 -0
- package/dist/astroviewer.js +2 -0
- package/dist/astroviewer.js.map +1 -0
- package/dist/astroviewer.min.js +2 -0
- package/dist/astroviewer.min.js.map +1 -0
- package/lib-esm/AstroSphere.d.ts +114 -0
- package/lib-esm/AstroSphere.d.ts.map +1 -0
- package/lib-esm/AstroSphere.js +679 -0
- package/lib-esm/AstroSphere.js.map +1 -0
- package/lib-esm/AstroViewer.d.ts +81 -0
- package/lib-esm/AstroViewer.d.ts.map +1 -0
- package/lib-esm/AstroViewer.js +348 -0
- package/lib-esm/AstroViewer.js.map +1 -0
- package/lib-esm/Camera.d.ts +74 -0
- package/lib-esm/Camera.d.ts.map +1 -0
- package/lib-esm/Camera.js +334 -0
- package/lib-esm/Camera.js.map +1 -0
- package/lib-esm/Config.d.ts +20 -0
- package/lib-esm/Config.d.ts.map +1 -0
- package/lib-esm/Config.js +32 -0
- package/lib-esm/Config.js.map +1 -0
- package/lib-esm/Global.d.ts +27 -0
- package/lib-esm/Global.d.ts.map +1 -0
- package/lib-esm/Global.js +52 -0
- package/lib-esm/Global.js.map +1 -0
- package/lib-esm/index.d.ts +17 -0
- package/lib-esm/index.d.ts.map +1 -0
- package/lib-esm/index.js +16 -0
- package/lib-esm/index.js.map +1 -0
- package/lib-esm/model/AbstractSkyEntity.d.ts +55 -0
- package/lib-esm/model/AbstractSkyEntity.d.ts.map +1 -0
- package/lib-esm/model/AbstractSkyEntity.js +153 -0
- package/lib-esm/model/AbstractSkyEntity.js.map +1 -0
- package/lib-esm/model/AstroGL.d.ts +11 -0
- package/lib-esm/model/AstroGL.d.ts.map +1 -0
- package/lib-esm/model/AstroGL.js +2 -0
- package/lib-esm/model/AstroGL.js.map +1 -0
- package/lib-esm/model/ColorMaps.d.ts +17 -0
- package/lib-esm/model/ColorMaps.d.ts.map +1 -0
- package/lib-esm/model/ColorMaps.js +1288 -0
- package/lib-esm/model/ColorMaps.js.map +1 -0
- package/lib-esm/model/FoV.d.ts +63 -0
- package/lib-esm/model/FoV.d.ts.map +1 -0
- package/lib-esm/model/FoV.js +275 -0
- package/lib-esm/model/FoV.js.map +1 -0
- package/lib-esm/model/MetadataColumn.d.ts +50 -0
- package/lib-esm/model/MetadataColumn.d.ts.map +1 -0
- package/lib-esm/model/MetadataColumn.js +95 -0
- package/lib-esm/model/MetadataColumn.js.map +1 -0
- package/lib-esm/model/MetadataManager.d.ts +43 -0
- package/lib-esm/model/MetadataManager.d.ts.map +1 -0
- package/lib-esm/model/MetadataManager.js +117 -0
- package/lib-esm/model/MetadataManager.js.map +1 -0
- package/lib-esm/model/Point.d.ts +53 -0
- package/lib-esm/model/Point.d.ts.map +1 -0
- package/lib-esm/model/Point.js +133 -0
- package/lib-esm/model/Point.js.map +1 -0
- package/lib-esm/model/Point2D.d.ts +9 -0
- package/lib-esm/model/Point2D.d.ts.map +1 -0
- package/lib-esm/model/Point2D.js +16 -0
- package/lib-esm/model/Point2D.js.map +1 -0
- package/lib-esm/model/Source.d.ts +34 -0
- package/lib-esm/model/Source.d.ts.map +1 -0
- package/lib-esm/model/Source.js +63 -0
- package/lib-esm/model/Source.js.map +1 -0
- package/lib-esm/model/catalogues/CatalogueGL.d.ts +91 -0
- package/lib-esm/model/catalogues/CatalogueGL.d.ts.map +1 -0
- package/lib-esm/model/catalogues/CatalogueGL.js +614 -0
- package/lib-esm/model/catalogues/CatalogueGL.js.map +1 -0
- package/lib-esm/model/catalogues/CatalogueProps.d.ts +2 -0
- package/lib-esm/model/catalogues/CatalogueProps.d.ts.map +1 -0
- package/lib-esm/model/catalogues/CatalogueProps.js +156 -0
- package/lib-esm/model/catalogues/CatalogueProps.js.map +1 -0
- package/lib-esm/model/footprints/Footprint.d.ts +44 -0
- package/lib-esm/model/footprints/Footprint.d.ts.map +1 -0
- package/lib-esm/model/footprints/Footprint.js +104 -0
- package/lib-esm/model/footprints/Footprint.js.map +1 -0
- package/lib-esm/model/footprints/FootprintProps.d.ts +2 -0
- package/lib-esm/model/footprints/FootprintProps.d.ts.map +1 -0
- package/lib-esm/model/footprints/FootprintProps.js +87 -0
- package/lib-esm/model/footprints/FootprintProps.js.map +1 -0
- package/lib-esm/model/footprints/FootprintSetGL.d.ts +106 -0
- package/lib-esm/model/footprints/FootprintSetGL.d.ts.map +1 -0
- package/lib-esm/model/footprints/FootprintSetGL.js +592 -0
- package/lib-esm/model/footprints/FootprintSetGL.js.map +1 -0
- package/lib-esm/model/grid/EquatorialGrid.d.ts +49 -0
- package/lib-esm/model/grid/EquatorialGrid.d.ts.map +1 -0
- package/lib-esm/model/grid/EquatorialGrid.js +302 -0
- package/lib-esm/model/grid/EquatorialGrid.js.map +1 -0
- package/lib-esm/model/grid/GridTextHelper.d.ts +26 -0
- package/lib-esm/model/grid/GridTextHelper.d.ts.map +1 -0
- package/lib-esm/model/grid/GridTextHelper.js +92 -0
- package/lib-esm/model/grid/GridTextHelper.js.map +1 -0
- package/lib-esm/model/grid/HealpixGrid.d.ts +49 -0
- package/lib-esm/model/grid/HealpixGrid.d.ts.map +1 -0
- package/lib-esm/model/grid/HealpixGrid.js +306 -0
- package/lib-esm/model/grid/HealpixGrid.js.map +1 -0
- package/lib-esm/model/hips/AllSky.d.ts +40 -0
- package/lib-esm/model/hips/AllSky.d.ts.map +1 -0
- package/lib-esm/model/hips/AllSky.js +232 -0
- package/lib-esm/model/hips/AllSky.js.map +1 -0
- package/lib-esm/model/hips/AncestorTile.d.ts +38 -0
- package/lib-esm/model/hips/AncestorTile.d.ts.map +1 -0
- package/lib-esm/model/hips/AncestorTile.js +248 -0
- package/lib-esm/model/hips/AncestorTile.js.map +1 -0
- package/lib-esm/model/hips/FoVHelper.d.ts +11 -0
- package/lib-esm/model/hips/FoVHelper.d.ts.map +1 -0
- package/lib-esm/model/hips/FoVHelper.js +107 -0
- package/lib-esm/model/hips/FoVHelper.js.map +1 -0
- package/lib-esm/model/hips/HiPS.d.ts +47 -0
- package/lib-esm/model/hips/HiPS.d.ts.map +1 -0
- package/lib-esm/model/hips/HiPS.js +222 -0
- package/lib-esm/model/hips/HiPS.js.map +1 -0
- package/lib-esm/model/hips/HiPSDescriptor.d.ts +37 -0
- package/lib-esm/model/hips/HiPSDescriptor.d.ts.map +1 -0
- package/lib-esm/model/hips/HiPSDescriptor.js +132 -0
- package/lib-esm/model/hips/HiPSDescriptor.js.map +1 -0
- package/lib-esm/model/hips/Tile.d.ts +51 -0
- package/lib-esm/model/hips/Tile.d.ts.map +1 -0
- package/lib-esm/model/hips/Tile.js +355 -0
- package/lib-esm/model/hips/Tile.js.map +1 -0
- package/lib-esm/model/hips/TileBuffer.d.ts +39 -0
- package/lib-esm/model/hips/TileBuffer.d.ts.map +1 -0
- package/lib-esm/model/hips/TileBuffer.js +148 -0
- package/lib-esm/model/hips/TileBuffer.js.map +1 -0
- package/lib-esm/model/hips/VisibleTilesManager.d.ts +35 -0
- package/lib-esm/model/hips/VisibleTilesManager.d.ts.map +1 -0
- package/lib-esm/model/hips/VisibleTilesManager.js +160 -0
- package/lib-esm/model/hips/VisibleTilesManager.js.map +1 -0
- package/lib-esm/model/tap/TapMetadata.d.ts +31 -0
- package/lib-esm/model/tap/TapMetadata.d.ts.map +1 -0
- package/lib-esm/model/tap/TapMetadata.js +55 -0
- package/lib-esm/model/tap/TapMetadata.js.map +1 -0
- package/lib-esm/model/tap/TapMetadataList.d.ts +23 -0
- package/lib-esm/model/tap/TapMetadataList.d.ts.map +1 -0
- package/lib-esm/model/tap/TapMetadataList.js +58 -0
- package/lib-esm/model/tap/TapMetadataList.js.map +1 -0
- package/lib-esm/model/tap/TapRepo.d.ts +27 -0
- package/lib-esm/model/tap/TapRepo.d.ts.map +1 -0
- package/lib-esm/model/tap/TapRepo.js +51 -0
- package/lib-esm/model/tap/TapRepo.js.map +1 -0
- package/lib-esm/services/SesameService.d.ts +14 -0
- package/lib-esm/services/SesameService.d.ts.map +1 -0
- package/lib-esm/services/SesameService.js +54 -0
- package/lib-esm/services/SesameService.js.map +1 -0
- package/lib-esm/services/helpers.d.ts +5 -0
- package/lib-esm/services/helpers.d.ts.map +1 -0
- package/lib-esm/services/helpers.js +16 -0
- package/lib-esm/services/helpers.js.map +1 -0
- package/lib-esm/services/hipsNodeService.d.ts +7 -0
- package/lib-esm/services/hipsNodeService.d.ts.map +1 -0
- package/lib-esm/services/hipsNodeService.js +65 -0
- package/lib-esm/services/hipsNodeService.js.map +1 -0
- package/lib-esm/services/parse-hipslist.d.ts +3 -0
- package/lib-esm/services/parse-hipslist.d.ts.map +1 -0
- package/lib-esm/services/parse-hipslist.js +25 -0
- package/lib-esm/services/parse-hipslist.js.map +1 -0
- package/lib-esm/services/queryCatalogueByFoV.d.ts +2 -0
- package/lib-esm/services/queryCatalogueByFoV.d.ts.map +1 -0
- package/lib-esm/services/queryCatalogueByFoV.js +56 -0
- package/lib-esm/services/queryCatalogueByFoV.js.map +1 -0
- package/lib-esm/services/queryFootprintSetByFov.d.ts +2 -0
- package/lib-esm/services/queryFootprintSetByFov.d.ts.map +1 -0
- package/lib-esm/services/queryFootprintSetByFov.js +128 -0
- package/lib-esm/services/queryFootprintSetByFov.js.map +1 -0
- package/lib-esm/services/tapRepoService.d.ts +2 -0
- package/lib-esm/services/tapRepoService.d.ts.map +1 -0
- package/lib-esm/services/tapRepoService.js +190 -0
- package/lib-esm/services/tapRepoService.js.map +1 -0
- package/lib-esm/services/types.d.ts +13 -0
- package/lib-esm/services/types.d.ts.map +1 -0
- package/lib-esm/services/types.js +2 -0
- package/lib-esm/services/types.js.map +1 -0
- package/lib-esm/shader/CatalogueShaderProgram.d.ts +35 -0
- package/lib-esm/shader/CatalogueShaderProgram.d.ts.map +1 -0
- package/lib-esm/shader/CatalogueShaderProgram.js +94 -0
- package/lib-esm/shader/CatalogueShaderProgram.js.map +1 -0
- package/lib-esm/shader/FootprintShaderProgram.d.ts +31 -0
- package/lib-esm/shader/FootprintShaderProgram.d.ts.map +1 -0
- package/lib-esm/shader/FootprintShaderProgram.js +86 -0
- package/lib-esm/shader/FootprintShaderProgram.js.map +1 -0
- package/lib-esm/shader/GridShaderManager.d.ts +6 -0
- package/lib-esm/shader/GridShaderManager.d.ts.map +1 -0
- package/lib-esm/shader/GridShaderManager.js +29 -0
- package/lib-esm/shader/GridShaderManager.js.map +1 -0
- package/lib-esm/shader/HiPSShaderProgram.d.ts +54 -0
- package/lib-esm/shader/HiPSShaderProgram.d.ts.map +1 -0
- package/lib-esm/shader/HiPSShaderProgram.js +257 -0
- package/lib-esm/shader/HiPSShaderProgram.js.map +1 -0
- package/lib-esm/shader/ShaderManager.d.ts +12 -0
- package/lib-esm/shader/ShaderManager.d.ts.map +1 -0
- package/lib-esm/shader/ShaderManager.js +344 -0
- package/lib-esm/shader/ShaderManager.js.map +1 -0
- package/lib-esm/shader/ShaderManagerMutliHiPS.d.ts +12 -0
- package/lib-esm/shader/ShaderManagerMutliHiPS.d.ts.map +1 -0
- package/lib-esm/shader/ShaderManagerMutliHiPS.js +750 -0
- package/lib-esm/shader/ShaderManagerMutliHiPS.js.map +1 -0
- package/lib-esm/utils/CoordsType.d.ts +10 -0
- package/lib-esm/utils/CoordsType.d.ts.map +1 -0
- package/lib-esm/utils/CoordsType.js +12 -0
- package/lib-esm/utils/CoordsType.js.map +1 -0
- package/lib-esm/utils/FoVUtils.d.ts +46 -0
- package/lib-esm/utils/FoVUtils.d.ts.map +1 -0
- package/lib-esm/utils/FoVUtils.js +217 -0
- package/lib-esm/utils/FoVUtils.js.map +1 -0
- package/lib-esm/utils/GeomUtils.d.ts +36 -0
- package/lib-esm/utils/GeomUtils.d.ts.map +1 -0
- package/lib-esm/utils/GeomUtils.js +267 -0
- package/lib-esm/utils/GeomUtils.js.map +1 -0
- package/lib-esm/utils/MouseHelper.d.ts +36 -0
- package/lib-esm/utils/MouseHelper.d.ts.map +1 -0
- package/lib-esm/utils/MouseHelper.js +94 -0
- package/lib-esm/utils/MouseHelper.js.map +1 -0
- package/lib-esm/utils/PerspectiveMatrixManager.d.ts +11 -0
- package/lib-esm/utils/PerspectiveMatrixManager.d.ts.map +1 -0
- package/lib-esm/utils/PerspectiveMatrixManager.js +37 -0
- package/lib-esm/utils/PerspectiveMatrixManager.js.map +1 -0
- package/lib-esm/utils/RayPickingUtils.d.ts +30 -0
- package/lib-esm/utils/RayPickingUtils.d.ts.map +1 -0
- package/lib-esm/utils/RayPickingUtils.js +112 -0
- package/lib-esm/utils/RayPickingUtils.js.map +1 -0
- package/lib-esm/utils/STCSParser.d.ts +16 -0
- package/lib-esm/utils/STCSParser.d.ts.map +1 -0
- package/lib-esm/utils/STCSParser.js +96 -0
- package/lib-esm/utils/STCSParser.js.map +1 -0
- package/lib-esm/utils/ShaderUtility.d.ts +2 -0
- package/lib-esm/utils/ShaderUtility.d.ts.map +1 -0
- package/lib-esm/utils/ShaderUtility.js +23 -0
- package/lib-esm/utils/ShaderUtility.js.map +1 -0
- package/lib-esm/utils/Utils.d.ts +32 -0
- package/lib-esm/utils/Utils.d.ts.map +1 -0
- package/lib-esm/utils/Utils.js +77 -0
- package/lib-esm/utils/Utils.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderManagerMutliHiPS.js","sourceRoot":"","sources":["../../src/shader/ShaderManagerMutliHiPS.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAI5B,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,MAAM,CAAC,MAAM;QACX,OAAO;;;;;;;;;;;;;MAaL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyCL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8FL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqIL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+GL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8GL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,UAAU;QACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8GL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8GL,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoordsType.d.ts","sourceRoot":"","sources":["../../src/utils/CoordsType.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,UAAU;IACpB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,KAAK,UAAU;CAChB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enum for coordinate types.
|
|
3
|
+
* @author Fabrizio Giordano (Fab77)
|
|
4
|
+
*/
|
|
5
|
+
export var CoordsType;
|
|
6
|
+
(function (CoordsType) {
|
|
7
|
+
CoordsType["CARTESIAN"] = "cartesian";
|
|
8
|
+
CoordsType["SPHERICAL"] = "spherical";
|
|
9
|
+
CoordsType["ASTRO"] = "astro";
|
|
10
|
+
})(CoordsType || (CoordsType = {}));
|
|
11
|
+
// export default CoordsType;
|
|
12
|
+
//# sourceMappingURL=CoordsType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoordsType.js","sourceRoot":"","sources":["../../src/utils/CoordsType.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,qCAAuB,CAAA;IACvB,qCAAuB,CAAA;IACvB,6BAAe,CAAA;AACjB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,6BAA6B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Fabrizio Giordano (Fab)
|
|
3
|
+
*/
|
|
4
|
+
import { Point } from '../model/Point.js';
|
|
5
|
+
import { ReadonlyMat4 } from 'gl-matrix';
|
|
6
|
+
import Camera from '../Camera.js';
|
|
7
|
+
import { AbstractSkyEntity } from '../model/AbstractSkyEntity.js';
|
|
8
|
+
import { HealpixGrid } from '../model/grid/HealpixGrid.js';
|
|
9
|
+
export declare class FoVUtils {
|
|
10
|
+
/**
|
|
11
|
+
* Return the minimum FoV value between `_fovY_deg` and `_fovX_deg`.
|
|
12
|
+
* (Kept here for parity; this class doesn’t maintain those fields.)
|
|
13
|
+
*/
|
|
14
|
+
getMinFoV(this: {
|
|
15
|
+
_fovY_deg: number;
|
|
16
|
+
_fovX_deg: number;
|
|
17
|
+
}): number;
|
|
18
|
+
/**
|
|
19
|
+
* Compute the FoV polygon as a list of Points (clockwise).
|
|
20
|
+
* Uses ray picking + frustum planes against a unit sphere.
|
|
21
|
+
*/
|
|
22
|
+
static getFoVPolygon(camera: Camera, canvas: HTMLCanvasElement, model: AbstractSkyEntity, healpixGrid: HealpixGrid, webgl: WebGL2RenderingContext, pMatrix: ReadonlyMat4): Point[];
|
|
23
|
+
/**
|
|
24
|
+
* Ray pick against 8 key screen positions (corners + midpoints).
|
|
25
|
+
* Returns Points in clockwise order starting from top-left.
|
|
26
|
+
*/
|
|
27
|
+
static getScreenCornersIntersection(pMatrix: ReadonlyMat4, camera: Camera, canvas: HTMLCanvasElement, healpixGrid: HealpixGrid, webgl: WebGL2RenderingContext): Point[];
|
|
28
|
+
/** Returns the center point (in J2000) of the current view as a `Point`. */
|
|
29
|
+
static getCenterJ2000(canvas: HTMLCanvasElement, healpixGrid: HealpixGrid, webgl: WebGL2RenderingContext, camera: Camera, pMatrix: ReadonlyMat4): Point;
|
|
30
|
+
/** Middle point on the unit sphere along the arc between two 3D points. */
|
|
31
|
+
static computeMiddlePoint(p1: Point, p2: Point): Point[];
|
|
32
|
+
/**
|
|
33
|
+
* Nearest intersection point between a frustum plane and the unit sphere,
|
|
34
|
+
* using the plane normal.
|
|
35
|
+
*/
|
|
36
|
+
static getNearestSpherePoint(plane: number[]): Point[];
|
|
37
|
+
/**
|
|
38
|
+
* Intersections between a frustum plane and the unit sphere,
|
|
39
|
+
* computed via two perpendicular planes.
|
|
40
|
+
* Returns two points (first from `plane4Circle_1`, second from `plane4Circle_2`).
|
|
41
|
+
*/
|
|
42
|
+
static getFrustumIntersectionWithSphere(_M: ReadonlyMat4, plane4Sphere: number[], plane4Circle_1: number[], plane4Circle_2: number[]): Point[];
|
|
43
|
+
/** Build ADQL string from an array of Points (ra,dec pairs). */
|
|
44
|
+
static getAstroFoVPolygon(points: Point[]): string;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=FoVUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FoVUtils.d.ts","sourceRoot":"","sources":["../../src/utils/FoVUtils.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAQ,YAAY,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,qBAAa,QAAQ;IACnB;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAIjE;;;OAGG;IACH,MAAM,CAAC,aAAa,CAElB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,YAAY,GACpB,KAAK,EAAE;IA+KV;;;OAGG;IACH,MAAM,CAAC,4BAA4B,CACjC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,sBAAsB,GAAG,KAAK,EAAE;IAmCrI,4EAA4E;IAC5E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,iBAAiB,EAC7C,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK;IAY/C,2EAA2E;IAC3E,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE;IAexD;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE;IAmBtD;;;;OAIG;IACH,MAAM,CAAC,gCAAgC,CACrC,EAAE,EAAE,YAAY,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,cAAc,EAAE,MAAM,EAAE,EACxB,cAAc,EAAE,MAAM,EAAE,GACvB,KAAK,EAAE;IAsDV,gEAAgE;IAChE,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM;CAGnD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* @author Fabrizio Giordano (Fab)
|
|
4
|
+
*/
|
|
5
|
+
import { Point } from '../model/Point.js';
|
|
6
|
+
import RayPickingUtils from './RayPickingUtils.js';
|
|
7
|
+
import { CoordsType } from './CoordsType.js';
|
|
8
|
+
import { mat4 } from 'gl-matrix';
|
|
9
|
+
export class FoVUtils {
|
|
10
|
+
/**
|
|
11
|
+
* Return the minimum FoV value between `_fovY_deg` and `_fovX_deg`.
|
|
12
|
+
* (Kept here for parity; this class doesn’t maintain those fields.)
|
|
13
|
+
*/
|
|
14
|
+
getMinFoV() {
|
|
15
|
+
return this._fovY_deg <= this._fovX_deg ? this._fovY_deg : this._fovX_deg;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Compute the FoV polygon as a list of Points (clockwise).
|
|
19
|
+
* Uses ray picking + frustum planes against a unit sphere.
|
|
20
|
+
*/
|
|
21
|
+
static getFoVPolygon(
|
|
22
|
+
// _pMatrix: ReadonlyMat4 | null,
|
|
23
|
+
camera, canvas, model, healpixGrid, webgl, pMatrix) {
|
|
24
|
+
// const pMatrix = (computePerspectiveMatrixSingleton.pMatrix ??
|
|
25
|
+
// _pMatrix) as ReadonlyMat4;
|
|
26
|
+
// const pMatrix = computePerspectiveMatrixSingleton.pMatrix as ReadonlyMat4
|
|
27
|
+
const vMatrix = camera.getCameraMatrix();
|
|
28
|
+
const mMatrix = model.getModelMatrix();
|
|
29
|
+
const canvasWidth = canvas.clientWidth;
|
|
30
|
+
const canvasHeight = canvas.clientHeight;
|
|
31
|
+
let points = [];
|
|
32
|
+
// First check: does the sphere cover the whole screen?
|
|
33
|
+
const intersectionWithModel = RayPickingUtils.getIntersectionPointWithSingleModel(0, 0, healpixGrid, webgl, camera, pMatrix);
|
|
34
|
+
if (intersectionWithModel.length > 0) {
|
|
35
|
+
// Fully covered → grab corners + midpoints (CASE C)
|
|
36
|
+
const cornersPoints = FoVUtils.getScreenCornersIntersection(pMatrix, camera, canvas, healpixGrid, webgl);
|
|
37
|
+
points = cornersPoints;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Partial coverage: build frustum planes
|
|
41
|
+
let M = mat4.create();
|
|
42
|
+
M = mat4.multiply(M, vMatrix, mMatrix);
|
|
43
|
+
M = mat4.multiply(M, pMatrix, M);
|
|
44
|
+
const topPlane = [M[3] - M[1], M[7] - M[5], M[11] - M[9], M[15] - M[13]]; // m41-m21, ...
|
|
45
|
+
const bottomPlane = [M[3] + M[1], M[7] + M[5], M[11] + M[9], M[15] + M[13]];
|
|
46
|
+
const rightPlane = [M[3] - M[0], M[7] - M[4], M[11] - M[8], M[15] - M[12]];
|
|
47
|
+
const leftPlane = [M[3] + M[0], M[7] + M[4], M[11] + M[8], M[15] + M[12]];
|
|
48
|
+
const intersectionTopMiddle = RayPickingUtils.getIntersectionPointWithSingleModel(canvasWidth / 2, 0, healpixGrid, webgl, camera, pMatrix);
|
|
49
|
+
const intersectionRightMiddle = RayPickingUtils.getIntersectionPointWithSingleModel(canvasWidth, canvasHeight / 2, healpixGrid, webgl, camera, pMatrix);
|
|
50
|
+
// CASE A: zoomed out, hemisphere fully visible
|
|
51
|
+
if (intersectionTopMiddle.length === 0 &&
|
|
52
|
+
intersectionRightMiddle.length === 0) {
|
|
53
|
+
const topPoints = FoVUtils.getNearestSpherePoint(topPlane);
|
|
54
|
+
const bottomPoints = FoVUtils.getNearestSpherePoint(bottomPlane);
|
|
55
|
+
const leftPoints = FoVUtils.getNearestSpherePoint(leftPlane);
|
|
56
|
+
const rightPoints = FoVUtils.getNearestSpherePoint(rightPlane);
|
|
57
|
+
const middleLeftTop = FoVUtils.computeMiddlePoint(leftPoints[0], topPoints[0])[0];
|
|
58
|
+
const middleTopRight = FoVUtils.computeMiddlePoint(topPoints[0], rightPoints[0])[0];
|
|
59
|
+
const middleRightBottom = FoVUtils.computeMiddlePoint(rightPoints[0], bottomPoints[0])[0];
|
|
60
|
+
const middleBottomLeft = FoVUtils.computeMiddlePoint(bottomPoints[0], leftPoints[0])[0];
|
|
61
|
+
points.push(topPoints[0], middleTopRight, rightPoints[0], middleRightBottom, bottomPoints[0], middleBottomLeft, leftPoints[0], middleLeftTop);
|
|
62
|
+
}
|
|
63
|
+
// CASE E: no intersection on top/bottom planes
|
|
64
|
+
else if (intersectionTopMiddle.length === 0) {
|
|
65
|
+
const topPoints = FoVUtils.getNearestSpherePoint(topPlane);
|
|
66
|
+
const bottomPoints = FoVUtils.getNearestSpherePoint(bottomPlane);
|
|
67
|
+
const leftPoints = FoVUtils.getFrustumIntersectionWithSphere(M, leftPlane, bottomPlane, topPlane);
|
|
68
|
+
const rightPoints = FoVUtils.getFrustumIntersectionWithSphere(M, rightPlane, topPlane, bottomPlane);
|
|
69
|
+
const middleLeftTop = FoVUtils.computeMiddlePoint(leftPoints[1], topPoints[0])[0];
|
|
70
|
+
const middleTopRight = FoVUtils.computeMiddlePoint(topPoints[0], rightPoints[0])[0];
|
|
71
|
+
const middleRightBottom = FoVUtils.computeMiddlePoint(rightPoints[1], bottomPoints[0])[0];
|
|
72
|
+
const middleBottomLeft = FoVUtils.computeMiddlePoint(bottomPoints[0], leftPoints[0])[0];
|
|
73
|
+
points.push(topPoints[0], middleTopRight, rightPoints[0], rightPoints[1], middleRightBottom, bottomPoints[0], middleBottomLeft, leftPoints[0], leftPoints[1], middleLeftTop);
|
|
74
|
+
}
|
|
75
|
+
// CASE D: no intersection on right/left planes
|
|
76
|
+
else if (intersectionRightMiddle.length === 0) {
|
|
77
|
+
const topPoints = FoVUtils.getFrustumIntersectionWithSphere(M, topPlane, leftPlane, rightPlane);
|
|
78
|
+
const bottomPoints = FoVUtils.getFrustumIntersectionWithSphere(M, bottomPlane, rightPlane, leftPlane);
|
|
79
|
+
const leftPoints = FoVUtils.getNearestSpherePoint(leftPlane);
|
|
80
|
+
const rightPoints = FoVUtils.getNearestSpherePoint(rightPlane);
|
|
81
|
+
const middleLeftTop = FoVUtils.computeMiddlePoint(leftPoints[0], topPoints[0])[0];
|
|
82
|
+
const middleTopRight = FoVUtils.computeMiddlePoint(topPoints[1], rightPoints[0])[0];
|
|
83
|
+
const middleRightBottom = FoVUtils.computeMiddlePoint(rightPoints[0], bottomPoints[0])[0];
|
|
84
|
+
const middleBottomLeft = FoVUtils.computeMiddlePoint(bottomPoints[1], leftPoints[0])[0];
|
|
85
|
+
points.push(topPoints[0], topPoints[1], middleTopRight, rightPoints[0], middleRightBottom, bottomPoints[0], bottomPoints[1], middleBottomLeft, leftPoints[0], middleLeftTop);
|
|
86
|
+
}
|
|
87
|
+
// CASE B: all frustum planes intersect
|
|
88
|
+
else {
|
|
89
|
+
const topPoints = FoVUtils.getFrustumIntersectionWithSphere(M, topPlane, leftPlane, rightPlane);
|
|
90
|
+
const bottomPoints = FoVUtils.getFrustumIntersectionWithSphere(M, bottomPlane, rightPlane, leftPlane);
|
|
91
|
+
const leftPoints = FoVUtils.getFrustumIntersectionWithSphere(M, leftPlane, bottomPlane, topPlane);
|
|
92
|
+
const rightPoints = FoVUtils.getFrustumIntersectionWithSphere(M, rightPlane, topPlane, bottomPlane);
|
|
93
|
+
points.push(topPoints[0], topPoints[1], rightPoints[0], rightPoints[1], bottomPoints[0], bottomPoints[1], leftPoints[0], leftPoints[1]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return points;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Ray pick against 8 key screen positions (corners + midpoints).
|
|
100
|
+
* Returns Points in clockwise order starting from top-left.
|
|
101
|
+
*/
|
|
102
|
+
static getScreenCornersIntersection(pMatrix, camera, canvas, healpixGrid, webgl) {
|
|
103
|
+
const w = canvas.clientWidth;
|
|
104
|
+
const h = canvas.clientHeight;
|
|
105
|
+
const topLeft = RayPickingUtils.getIntersectionPointWithSingleModel(0, 0, healpixGrid, webgl, camera, pMatrix);
|
|
106
|
+
const middleTop = RayPickingUtils.getIntersectionPointWithSingleModel(w / 2, 0, healpixGrid, webgl, camera, pMatrix);
|
|
107
|
+
const topRight = RayPickingUtils.getIntersectionPointWithSingleModel(w, 0, healpixGrid, webgl, camera, pMatrix);
|
|
108
|
+
const middleRight = RayPickingUtils.getIntersectionPointWithSingleModel(w, h / 2, healpixGrid, webgl, camera, pMatrix);
|
|
109
|
+
const bottomRight = RayPickingUtils.getIntersectionPointWithSingleModel(w, h, healpixGrid, webgl, camera, pMatrix);
|
|
110
|
+
const middleBottom = RayPickingUtils.getIntersectionPointWithSingleModel(w / 2, h, healpixGrid, webgl, camera, pMatrix);
|
|
111
|
+
const bottomLeft = RayPickingUtils.getIntersectionPointWithSingleModel(0, h, healpixGrid, webgl, camera, pMatrix);
|
|
112
|
+
const middleLeft = RayPickingUtils.getIntersectionPointWithSingleModel(0, h / 2, healpixGrid, webgl, camera, pMatrix);
|
|
113
|
+
const out = [];
|
|
114
|
+
const pushIf = (ip) => {
|
|
115
|
+
if (ip.length > 0) {
|
|
116
|
+
out.push(new Point({ x: ip[0], y: ip[1], z: ip[2] }, CoordsType.CARTESIAN));
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
pushIf(topLeft);
|
|
120
|
+
pushIf(middleTop);
|
|
121
|
+
pushIf(topRight);
|
|
122
|
+
pushIf(middleRight);
|
|
123
|
+
pushIf(bottomRight);
|
|
124
|
+
pushIf(middleBottom);
|
|
125
|
+
pushIf(bottomLeft);
|
|
126
|
+
pushIf(middleLeft);
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
/** Returns the center point (in J2000) of the current view as a `Point`. */
|
|
130
|
+
static getCenterJ2000(canvas, healpixGrid, webgl, camera, pMatrix) {
|
|
131
|
+
const w = canvas.clientWidth;
|
|
132
|
+
const h = canvas.clientHeight;
|
|
133
|
+
const center = RayPickingUtils.getIntersectionPointWithSingleModel(w / 2, h / 2, healpixGrid, webgl, camera, pMatrix);
|
|
134
|
+
if (center.length <= 0)
|
|
135
|
+
throw Error(`Central point is null`);
|
|
136
|
+
return new Point({ x: center[0], y: center[1], z: center[2] }, CoordsType.CARTESIAN);
|
|
137
|
+
}
|
|
138
|
+
/** Middle point on the unit sphere along the arc between two 3D points. */
|
|
139
|
+
static computeMiddlePoint(p1, p2) {
|
|
140
|
+
// midpoint of segment
|
|
141
|
+
const xm = (p1.x + p2.x) / 2;
|
|
142
|
+
const ym = (p1.y + p2.y) / 2;
|
|
143
|
+
const zm = (p1.z + p2.z) / 2;
|
|
144
|
+
// project the midpoint back to unit sphere
|
|
145
|
+
const len = Math.hypot(xm, ym, zm) || 1;
|
|
146
|
+
const x = xm / len;
|
|
147
|
+
const y = ym / len;
|
|
148
|
+
const z = zm / len;
|
|
149
|
+
return [new Point({ x, y, z }, CoordsType.CARTESIAN)];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Nearest intersection point between a frustum plane and the unit sphere,
|
|
153
|
+
* using the plane normal.
|
|
154
|
+
*/
|
|
155
|
+
static getNearestSpherePoint(plane) {
|
|
156
|
+
const [A, B, C, D] = plane;
|
|
157
|
+
const R = 1;
|
|
158
|
+
const invLen = 1 / Math.sqrt(A * A + B * B + C * C);
|
|
159
|
+
const t1 = R * invLen;
|
|
160
|
+
const t2 = -R * invLen;
|
|
161
|
+
const P1 = [A * t1, B * t1, C * t1];
|
|
162
|
+
const P2 = [A * t2, B * t2, C * t2];
|
|
163
|
+
const den = Math.sqrt(A * A + B * B + C * C) || 1;
|
|
164
|
+
const dist1 = Math.abs(A * P1[0] + B * P1[1] + C * P1[2] + D) / den;
|
|
165
|
+
const dist2 = Math.abs(A * P2[0] + B * P2[1] + C * P2[2] + D) / den;
|
|
166
|
+
const P = dist1 <= dist2 ? P1 : P2;
|
|
167
|
+
return [new Point({ x: P[0], y: P[1], z: P[2] }, CoordsType.CARTESIAN)];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Intersections between a frustum plane and the unit sphere,
|
|
171
|
+
* computed via two perpendicular planes.
|
|
172
|
+
* Returns two points (first from `plane4Circle_1`, second from `plane4Circle_2`).
|
|
173
|
+
*/
|
|
174
|
+
static getFrustumIntersectionWithSphere(_M, plane4Sphere, plane4Circle_1, plane4Circle_2) {
|
|
175
|
+
const [A0, B0, C0, D0] = plane4Sphere;
|
|
176
|
+
// center of the circle (projection of sphere center onto plane)
|
|
177
|
+
const denom0 = (A0 * A0 + B0 * B0 + C0 * C0) || 1;
|
|
178
|
+
const x_c = -(A0 * D0) / denom0;
|
|
179
|
+
const y_c = -(B0 * D0) / denom0;
|
|
180
|
+
const z_c = -(C0 * D0) / denom0;
|
|
181
|
+
const d = Math.abs(D0) / Math.sqrt(denom0); // distance from sphere center (0,0,0)
|
|
182
|
+
const R = 1;
|
|
183
|
+
const out = [];
|
|
184
|
+
if (R > d) {
|
|
185
|
+
const r = Math.sqrt(R * R - d * d);
|
|
186
|
+
const pick = (plane) => {
|
|
187
|
+
const [A, B, C, D] = plane;
|
|
188
|
+
const invLen = 1 / Math.sqrt(A * A + B * B + C * C);
|
|
189
|
+
const t1 = r * invLen;
|
|
190
|
+
const t2 = -r * invLen;
|
|
191
|
+
const P1 = [x_c + A * t1, y_c + B * t1, z_c + C * t1];
|
|
192
|
+
const P2 = [x_c + A * t2, y_c + B * t2, z_c + C * t2];
|
|
193
|
+
const den = Math.sqrt(A * A + B * B + C * C) || 1;
|
|
194
|
+
const dist1 = Math.abs(A * P1[0] + B * P1[1] + C * P1[2] + D) / den;
|
|
195
|
+
const dist2 = Math.abs(A * P2[0] + B * P2[1] + C * P2[2] + D) / den;
|
|
196
|
+
return dist1 <= dist2 ? P1 : P2;
|
|
197
|
+
};
|
|
198
|
+
const P_intersection_1 = pick(plane4Circle_1);
|
|
199
|
+
const P_intersection_2 = pick(plane4Circle_2);
|
|
200
|
+
out.push(new Point({ x: P_intersection_1[0], y: P_intersection_1[1], z: P_intersection_1[2] }, CoordsType.CARTESIAN), new Point({ x: P_intersection_2[0], y: P_intersection_2[1], z: P_intersection_2[2] }, CoordsType.CARTESIAN));
|
|
201
|
+
}
|
|
202
|
+
else if (R === d) {
|
|
203
|
+
// Tangent: both intersections collapse to the circle center on the plane
|
|
204
|
+
out.push(new Point({ x: x_c, y: y_c, z: z_c }, CoordsType.CARTESIAN), new Point({ x: x_c, y: y_c, z: z_c }, CoordsType.CARTESIAN));
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// No intersection; return empty to avoid pushing undefined values
|
|
208
|
+
// console.log('Frustum plane not intersecting the sphere');
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
/** Build ADQL string from an array of Points (ra,dec pairs). */
|
|
213
|
+
static getAstroFoVPolygon(points) {
|
|
214
|
+
return points.map(p => p.toADQL()).join(',');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=FoVUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FoVUtils.js","sourceRoot":"","sources":["../../src/utils/FoVUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Point } from "../model/Point.js";
|
|
2
|
+
import Point2D from "../model/Point2D.js";
|
|
3
|
+
type ProjectionFlag = 0 | 1 | 2;
|
|
4
|
+
export interface SelectionObj {
|
|
5
|
+
poly4selection: Point2D[][];
|
|
6
|
+
flag: ProjectionFlag;
|
|
7
|
+
maxx: number;
|
|
8
|
+
maxy: number;
|
|
9
|
+
minx: number;
|
|
10
|
+
miny: number;
|
|
11
|
+
}
|
|
12
|
+
declare class GeomUtils {
|
|
13
|
+
static orthodromicDistance(p1: Point, p2: Point): number;
|
|
14
|
+
/**
|
|
15
|
+
* Decide the 2D projection strategy and pre-project polygons for point-in-polygon tests.
|
|
16
|
+
* Returns the projected polygons + bbox + a flag describing the projection used:
|
|
17
|
+
* 0 → all points in same hemisphere with |Dec| > 10 → stereographic-like projection using x,y from 3D
|
|
18
|
+
* 1 → all points in equatorial belt (|Dec| < 10) → use RA/Dec directly
|
|
19
|
+
* 2 → equatorial belt and polygon crosses RA=0 → shift RA>180 by -360
|
|
20
|
+
*/
|
|
21
|
+
static computeSelectionObject(polygons: Point[][]): SelectionObj;
|
|
22
|
+
/** Stereographic projection from 3D point on unit sphere onto plane */
|
|
23
|
+
static stereographic(point: Point): {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
};
|
|
27
|
+
static projectIn2D(point: Point): Point2D;
|
|
28
|
+
/**
|
|
29
|
+
* Robust point-in-polygon (ray casting) using the precomputed selection object.
|
|
30
|
+
* Works with any of the three flags (0,1,2).
|
|
31
|
+
*/
|
|
32
|
+
static checkPointInsidePolygon5(selectionObj: SelectionObj, point: Point): boolean;
|
|
33
|
+
static checkPointInsidePolygon4(polygons: Point[][], point: Point): boolean;
|
|
34
|
+
}
|
|
35
|
+
export default GeomUtils;
|
|
36
|
+
//# sourceMappingURL=GeomUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeomUtils.d.ts","sourceRoot":"","sources":["../../src/utils/GeomUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACxC,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAG1C,KAAK,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEhC,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,EAAE,EAAE,CAAC;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,cAAM,SAAS;IAEb,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM;IAQxD;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,YAAY;IAwIhE,uEAAuE;IACvE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAU5D,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKzC;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO;IAyElF,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO;CAmD5E;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { Point } from "../model/Point.js";
|
|
2
|
+
import Point2D from "../model/Point2D.js";
|
|
3
|
+
import { CoordsType } from "./CoordsType.js";
|
|
4
|
+
class GeomUtils {
|
|
5
|
+
// Orthodromic (great-circle) distance in radians
|
|
6
|
+
static orthodromicDistance(p1, p2) {
|
|
7
|
+
return Math.acos(Math.sin(p1.decDeg * Math.PI / 180) * Math.sin(p2.decDeg * Math.PI / 180) +
|
|
8
|
+
Math.cos(p1.decDeg * Math.PI / 180) * Math.cos(p2.decDeg * Math.PI / 180) *
|
|
9
|
+
Math.cos((p2.raDeg - p1.raDeg) * Math.PI / 180));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Decide the 2D projection strategy and pre-project polygons for point-in-polygon tests.
|
|
13
|
+
* Returns the projected polygons + bbox + a flag describing the projection used:
|
|
14
|
+
* 0 → all points in same hemisphere with |Dec| > 10 → stereographic-like projection using x,y from 3D
|
|
15
|
+
* 1 → all points in equatorial belt (|Dec| < 10) → use RA/Dec directly
|
|
16
|
+
* 2 → equatorial belt and polygon crosses RA=0 → shift RA>180 by -360
|
|
17
|
+
*/
|
|
18
|
+
static computeSelectionObject(polygons) {
|
|
19
|
+
let poly4selection = [];
|
|
20
|
+
let flag = 0;
|
|
21
|
+
let maxx;
|
|
22
|
+
let maxy;
|
|
23
|
+
let minx;
|
|
24
|
+
let miny;
|
|
25
|
+
const DEC_THRESHOLD = 10;
|
|
26
|
+
// 1 → northern hemisphere (Dec > +10), -1 → southern (Dec < -10), 0 → equatorial belt
|
|
27
|
+
let hemisphere = 0;
|
|
28
|
+
if (polygons[0][0].decDeg >= DEC_THRESHOLD) {
|
|
29
|
+
hemisphere = 1;
|
|
30
|
+
}
|
|
31
|
+
else if (polygons[0][0].decDeg <= -DEC_THRESHOLD) {
|
|
32
|
+
hemisphere = -1;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
flag = 1;
|
|
36
|
+
}
|
|
37
|
+
// Case flag = 0 → stereographic-like projection using x,y,z from 3D point
|
|
38
|
+
if (flag === 0) {
|
|
39
|
+
const first = GeomUtils.projectIn2D(polygons[0][0]);
|
|
40
|
+
maxx = minx = first.x;
|
|
41
|
+
maxy = miny = first.y;
|
|
42
|
+
for (const currpoly of polygons) {
|
|
43
|
+
const selpoly = [];
|
|
44
|
+
for (const point of currpoly) {
|
|
45
|
+
// If a point violates the hemisphere constraint, fall back to belt logic
|
|
46
|
+
if ((point.decDeg > hemisphere * DEC_THRESHOLD && hemisphere === -1) ||
|
|
47
|
+
(point.decDeg < hemisphere * DEC_THRESHOLD && hemisphere === 1)) {
|
|
48
|
+
flag = 1;
|
|
49
|
+
poly4selection = [];
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
const p = GeomUtils.projectIn2D(point);
|
|
53
|
+
selpoly.push(p);
|
|
54
|
+
if (p.x > maxx)
|
|
55
|
+
maxx = p.x;
|
|
56
|
+
if (p.y > maxy)
|
|
57
|
+
maxy = p.y;
|
|
58
|
+
if (p.x < minx)
|
|
59
|
+
minx = p.x;
|
|
60
|
+
if (p.y < miny)
|
|
61
|
+
miny = p.y;
|
|
62
|
+
}
|
|
63
|
+
poly4selection.push(selpoly);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (flag === 0) {
|
|
67
|
+
return {
|
|
68
|
+
poly4selection,
|
|
69
|
+
flag,
|
|
70
|
+
maxx: maxx,
|
|
71
|
+
maxy: maxy,
|
|
72
|
+
minx: minx,
|
|
73
|
+
miny: miny,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Case flag = 1 or 2 → work directly in (RA,Dec)
|
|
77
|
+
const RA_THRESHOLD = 180;
|
|
78
|
+
let belowThreshold = polygons[0][0].raDeg < RA_THRESHOLD;
|
|
79
|
+
maxx = minx = polygons[0][0].raDeg;
|
|
80
|
+
maxy = miny = polygons[0][0].decDeg;
|
|
81
|
+
for (const currpoly of polygons) {
|
|
82
|
+
const selpoly = [];
|
|
83
|
+
for (const point of currpoly) {
|
|
84
|
+
const p = new Point2D(point.raDeg, point.decDeg);
|
|
85
|
+
selpoly.push(p);
|
|
86
|
+
if (point.raDeg > maxx)
|
|
87
|
+
maxx = point.raDeg;
|
|
88
|
+
if (point.decDeg > maxy)
|
|
89
|
+
maxy = point.decDeg;
|
|
90
|
+
if (point.raDeg < minx)
|
|
91
|
+
minx = point.raDeg;
|
|
92
|
+
if (point.decDeg < miny)
|
|
93
|
+
miny = point.decDeg;
|
|
94
|
+
// Detect crossing of RA=0 meridian
|
|
95
|
+
if ((point.raDeg >= RA_THRESHOLD && belowThreshold) ||
|
|
96
|
+
(point.raDeg <= RA_THRESHOLD && !belowThreshold)) {
|
|
97
|
+
flag = 2;
|
|
98
|
+
poly4selection = [];
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
poly4selection.push(selpoly);
|
|
103
|
+
}
|
|
104
|
+
if (flag === 1) {
|
|
105
|
+
return {
|
|
106
|
+
poly4selection,
|
|
107
|
+
flag,
|
|
108
|
+
maxx,
|
|
109
|
+
maxy,
|
|
110
|
+
minx,
|
|
111
|
+
miny,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Case flag = 2 → shift RA>180 by -360 to unwrap around RA=0
|
|
115
|
+
let startRA = polygons[0][0].raDeg;
|
|
116
|
+
maxx = startRA >= RA_THRESHOLD ? startRA - 360 : startRA;
|
|
117
|
+
maxy = polygons[0][0].decDeg;
|
|
118
|
+
minx = maxx;
|
|
119
|
+
miny = maxy;
|
|
120
|
+
for (const currpoly of polygons) {
|
|
121
|
+
const selpoly = [];
|
|
122
|
+
for (const point of currpoly) {
|
|
123
|
+
const curra = point.raDeg >= RA_THRESHOLD ? point.raDeg - 360 : point.raDeg;
|
|
124
|
+
if (curra > maxx)
|
|
125
|
+
maxx = curra;
|
|
126
|
+
if (point.decDeg > maxy)
|
|
127
|
+
maxy = point.decDeg;
|
|
128
|
+
if (curra < minx)
|
|
129
|
+
minx = curra;
|
|
130
|
+
if (point.decDeg < miny)
|
|
131
|
+
miny = point.decDeg;
|
|
132
|
+
selpoly.push(new Point2D(curra, point.decDeg));
|
|
133
|
+
}
|
|
134
|
+
poly4selection.push(selpoly);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
poly4selection,
|
|
138
|
+
flag,
|
|
139
|
+
maxx,
|
|
140
|
+
maxy,
|
|
141
|
+
minx,
|
|
142
|
+
miny,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/** Stereographic projection from 3D point on unit sphere onto plane */
|
|
146
|
+
static stereographic(point) {
|
|
147
|
+
const x = Number(point.xyz[0]);
|
|
148
|
+
const y = Number(point.xyz[1]);
|
|
149
|
+
const z = Number(point.xyz[2]);
|
|
150
|
+
return {
|
|
151
|
+
x: (2 * x) / (1 - z),
|
|
152
|
+
y: (2 * y) / (1 - z),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
static projectIn2D(point) {
|
|
156
|
+
const p = GeomUtils.stereographic(point);
|
|
157
|
+
return new Point2D(p.x, p.y);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Robust point-in-polygon (ray casting) using the precomputed selection object.
|
|
161
|
+
* Works with any of the three flags (0,1,2).
|
|
162
|
+
*/
|
|
163
|
+
static checkPointInsidePolygon5(selectionObj, point) {
|
|
164
|
+
let p0;
|
|
165
|
+
if (selectionObj.flag === 0) {
|
|
166
|
+
p0 = GeomUtils.projectIn2D(point);
|
|
167
|
+
}
|
|
168
|
+
else if (selectionObj.flag === 1) {
|
|
169
|
+
p0 = new Point2D(point.raDeg, point.decDeg);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const RA_THRESHOLD = 180;
|
|
173
|
+
const raShifted = point.raDeg >= RA_THRESHOLD ? point.raDeg - 360 : point.raDeg;
|
|
174
|
+
p0 = new Point2D(raShifted, point.decDeg);
|
|
175
|
+
}
|
|
176
|
+
const p1 = new Point2D(p0.x, p0.y + 2 * Math.abs(selectionObj.maxy - selectionObj.miny));
|
|
177
|
+
// quick reject by bbox
|
|
178
|
+
if (p0.x > selectionObj.maxx ||
|
|
179
|
+
p0.x < selectionObj.minx ||
|
|
180
|
+
p0.y > selectionObj.maxy ||
|
|
181
|
+
p0.y < selectionObj.miny) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
// Ray casting against each sub-polygon
|
|
185
|
+
for (const currpoly of selectionObj.poly4selection) {
|
|
186
|
+
let intersections = 0;
|
|
187
|
+
for (let i = 0; i < currpoly.length - 1; i++) {
|
|
188
|
+
const p2 = currpoly[i];
|
|
189
|
+
const p3 = currpoly[i + 1];
|
|
190
|
+
const denominator = (p3.y - p2.y) * (p1.x - p0.x) - (p3.x - p2.x) * (p1.y - p0.y);
|
|
191
|
+
const numerator01 = (p3.x - p2.x) * (p0.y - p2.y) - (p3.y - p2.y) * (p0.x - p2.x);
|
|
192
|
+
const numerator23 = (p1.x - p0.x) * (p0.y - p2.y) - (p1.y - p0.y) * (p0.x - p2.x);
|
|
193
|
+
if (denominator !== 0) {
|
|
194
|
+
const lamda01 = numerator01 / denominator;
|
|
195
|
+
const lambda23 = numerator23 / denominator;
|
|
196
|
+
if (lamda01 >= 0 && lamda01 <= 1 && lambda23 >= 0 && lambda23 <= 1) {
|
|
197
|
+
intersections++;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// close the polygon: last with first
|
|
202
|
+
{
|
|
203
|
+
const p2 = currpoly[currpoly.length - 1];
|
|
204
|
+
const p3 = currpoly[0];
|
|
205
|
+
const denominator = (p3.y - p2.y) * (p1.x - p0.x) - (p3.x - p2.x) * (p1.y - p0.y);
|
|
206
|
+
const numerator01 = (p3.x - p2.x) * (p0.y - p2.y) - (p3.y - p2.y) * (p0.x - p2.x);
|
|
207
|
+
const numerator23 = (p1.x - p0.x) * (p0.y - p2.y) - (p1.y - p0.y) * (p0.x - p2.x);
|
|
208
|
+
if (denominator !== 0) {
|
|
209
|
+
const lamda01 = numerator01 / denominator;
|
|
210
|
+
const lambda23 = numerator23 / denominator;
|
|
211
|
+
if (lamda01 >= 0 && lamda01 <= 1 && lambda23 >= 0 && lambda23 <= 1) {
|
|
212
|
+
intersections++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (intersections % 2 === 1) {
|
|
217
|
+
return true; // inside this subpolygon
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
// Legacy version kept for reference; now typed and using getters
|
|
223
|
+
static checkPointInsidePolygon4(polygons, point) {
|
|
224
|
+
const p0 = GeomUtils.projectIn2D(point);
|
|
225
|
+
let maxdist = point.raDeg + 15;
|
|
226
|
+
if (maxdist > 360)
|
|
227
|
+
maxdist = point.raDeg - 15;
|
|
228
|
+
const p1point = new Point({ raDeg: maxdist, decDeg: point.decDeg }, CoordsType.ASTRO);
|
|
229
|
+
const p1 = GeomUtils.projectIn2D(p1point);
|
|
230
|
+
for (const currpoly of polygons) {
|
|
231
|
+
let intersections = 0;
|
|
232
|
+
for (let i = 0; i < currpoly.length - 1; i++) {
|
|
233
|
+
const p2 = GeomUtils.projectIn2D(currpoly[i]);
|
|
234
|
+
const p3 = GeomUtils.projectIn2D(currpoly[i + 1]);
|
|
235
|
+
const denominator = (p3.y - p2.y) * (p1.x - p0.x) - (p3.x - p2.x) * (p1.y - p0.y);
|
|
236
|
+
const numerator01 = (p3.x - p2.x) * (p0.y - p2.y) - (p3.y - p2.y) * (p0.x - p2.x);
|
|
237
|
+
const numerator23 = (p1.x - p0.x) * (p0.y - p2.y) - (p1.y - p0.y) * (p0.x - p2.x);
|
|
238
|
+
if (denominator !== 0) {
|
|
239
|
+
const lamda01 = numerator01 / denominator;
|
|
240
|
+
const lambda23 = numerator23 / denominator;
|
|
241
|
+
if (lamda01 >= 0 && lamda01 <= 1 && lambda23 >= 0 && lambda23 <= 1) {
|
|
242
|
+
intersections++;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
{
|
|
247
|
+
const p2 = GeomUtils.projectIn2D(currpoly[currpoly.length - 1]);
|
|
248
|
+
const p3 = GeomUtils.projectIn2D(currpoly[0]);
|
|
249
|
+
const denominator = (p3.y - p2.y) * (p1.x - p0.x) - (p3.x - p2.x) * (p1.y - p0.y);
|
|
250
|
+
const numerator01 = (p3.x - p2.x) * (p0.y - p2.y) - (p3.y - p2.y) * (p0.x - p2.x);
|
|
251
|
+
const numerator23 = (p1.x - p0.x) * (p0.y - p2.y) - (p1.y - p0.y) * (p0.x - p2.x);
|
|
252
|
+
if (denominator !== 0) {
|
|
253
|
+
const lamda01 = numerator01 / denominator;
|
|
254
|
+
const lambda23 = numerator23 / denominator;
|
|
255
|
+
if (lamda01 >= 0 && lamda01 <= 1 && lambda23 >= 0 && lambda23 <= 1) {
|
|
256
|
+
intersections++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (intersections % 2 === 1)
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export default GeomUtils;
|
|
267
|
+
//# sourceMappingURL=GeomUtils.js.map
|