@johnmorrisdotca/hoshi-stars 0.1.0 → 0.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/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.3.0] - 2026-11-08
6
+
7
+ - 199 more common star names, 335 in all: every name on the IAU Catalog of Star Names whose star is in the 5,080, among them Acrux, Alcor, the Pleiades (Alcyone, Merope, Electra, Atlas, Maia, Taygeta, Pleione, Celaeno, Asterope), Rasalas, Mesarthim, Zosma and Tiaki. Each has its katakana (`アクルックス`, `アルコル`, `アルキオネ`), and the demo's search finds them in both. Adhara's katakana is now `アダーラ`, as the National Astronomical Observatory of Japan writes it. The source and its date are in `NOTICE.md`.
8
+
9
+ ## [0.2.0] - 2026-11-08
10
+
11
+ - New entry point `@johnmorrisdotca/hoshi-stars/milky-way`: a brightness map of the Milky Way (about 11 kB of numbers) with the bright core toward Sagittarius and the Great Rift, the Coalsack and the Cygnus Rift as dimmer places. `milkyWayBrightness(point)` gives 0 to 1 toward a point of the sky, `milkyWayBands(levels, { step })` cuts it into ribbons of sky points to fill as soft bands, and `toGalactic` and `fromGalactic` change between right ascension and declination and galactic longitude and latitude. Made by `scripts/make-milky-way-data.py` from SAO star counts (NASA HEASARC; no licence stated, used with credit and removed on request), the IRAS 100 micron and COBE DIRBE dust maps (NASA, public domain) and a bulge of our own figures; see `NOTICE.md`.
12
+ - The demo: a **Milky Way** (天の川) button draws the band under the stars and the lines, in every projection, on by default; `layers=milky` is in the address and in the embed page's.
13
+
5
14
  ## [0.1.0] - 2026-11-08
6
15
 
7
16
  - New `Star.nameJa`: the katakana name (`シリウス`, `ベテルギウス`) of each of the 136 named stars, which `starByName` also finds. The spellings are the IAU names written in Japanese letters by hand, with the usual Japanese forms; see `NOTICE.md`.
package/NOTICE.md CHANGED
@@ -5,8 +5,8 @@ Hoshi Stars is original work by John Morris, under the MIT licence in `LICENSE`.
5
5
  ## The stars
6
6
 
7
7
  - **Bright stars (`@johnmorrisdotca/hoshi-stars`)**: the Yale Bright Star Catalogue, D. Hoffleit and W. H. Warren Jr. (1991), "The Bright Star Catalogue, 5th Revised Edition (Preliminary Version)", Astronomical Data Center (NASA Goddard Space Flight Center) and the Centre de Données astronomiques de Strasbourg, catalogue V/50, as NASA's HEASARC serves it (table bsc5p, https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.html, file heasarc_bsc5p.tdat.gz, read 2026-11-08; a US government source), the 5,080 stars to visual magnitude 6.0, written out as numbers by `scripts/make-star-data.py` into `src/data/stars.ts`. The catalogue's own documentation calls it public domain and the Astronomical Data Center asks that it and the authors be acknowledged, which this line does; there is no formal licence text, so this footing is informal.
8
- - **Star names**: our own list after the IAU Working Group on Star Names (https://www.iau.org/science/scientific_bodies/working_groups/280/).
9
- - **Star names in Japanese (`Star.nameJa`, `src/data/star-names-ja.ts`)**: the katakana spelling of each of the 136 IAU names, written by hand for this package. A transliteration of a name is not a creative work, so no licence is needed, and no list is copied: no Wikipedia text and no source with non-commercial or share-alike terms. The spellings follow the usual Japanese forms; those of the 27 stars on the National Astronomical Observatory of Japan's "おもな恒星の名前" page (https://eco.mtk.nao.ac.jp/koyomi/faq/stars.html, read 2026-11-08, copyright NAOJ) were compared with it, and all 27 agree (the comparison only; that page is not copied). The other 109 are our own reading of the IAU spelling and **wait for a Japanese reviewer**.
8
+ - **Star names**: the IAU Working Group on Star Names (WGSN, https://www.iau.org/science/scientific_bodies/working_groups/280/), "IAU Catalog of Star Names (IAU-CSN)" (https://www.pas.rochester.edu/~emamajek/WGSN/IAU-CSN.txt, "Last updated 2022-04-04", read 2026-11-08). The names are facts (which star the IAU named what), typed as a table keyed by Bright Star Catalogue (HR) number in `scripts/make-star-data.py`: every name in the list whose star is among the 5,080 (332 names), matched by the list's HR designation, and spelled as its ASCII name column spells it. The list states that IAU-produced products are released under Creative Commons Attribution, "as long as the source is mentioned", which this line does; only the names are used, none of its text. Three more names are traditional ones that are not on the IAU list: Navi (γ Cas, HR 264), Men (α Lup, HR 5469) and Rutilicus (ζ Her, HR 6212); 335 names in all.
9
+ - **Star names in Japanese (`Star.nameJa`, `src/data/star-names-ja.ts`)**: the katakana spelling of each of the 335 names, written by hand for this package. A transliteration of a name is not a creative work, so no licence is needed, and no list is copied: no Wikipedia text and no source with non-commercial or share-alike terms. The spellings follow the usual Japanese forms; those of the 27 stars on the National Astronomical Observatory of Japan's "おもな恒星の名前" page (https://eco.mtk.nao.ac.jp/koyomi/faq/stars.html, read 2026-11-08, copyright NAOJ) were compared with it. That page lists 27 stars (Acrux among them); 26 of the 27 spellings were already ours and agreed, except that it has アダーラ for Adhara where we had アダラ, now アダーラ (the comparison only; that page is not copied). The other 308 are our own reading of the IAU spelling and **wait for a Japanese reviewer**; a table of them for the reviewer is kept outside the repository.
10
10
  - **Star colour**: Ballesteros's B-V to temperature relation (F. J. Ballesteros 2012, EPL 97, 34008) and a piecewise black-body colour fit.
11
11
 
12
12
  ## The constellations
@@ -29,6 +29,15 @@ Hoshi Stars is original work by John Morris, under the MIT licence in `LICENSE`.
29
29
 
30
30
  - **Projections (`@johnmorrisdotca/hoshi-stars/projection`)**: stereographic, orthographic, gnomonic, azimuthal equidistant, equirectangular, Mollweide and Hammer, written from the formulas in J. P. Snyder, "Map Projections: A Working Manual", U.S. Geological Survey Professional Paper 1395 (1987), a U.S. Government work in the public domain. The formulas are mathematics; no library's code is copied.
31
31
 
32
+ ## The Milky Way
33
+
34
+ - **Milky Way brightness (`@johnmorrisdotca/hoshi-stars/milky-way`)**: a grid of 360 by 120 numbers of 0 to 31 (1 degree of galactic longitude by 0.5 degree of latitude, within 30 degrees of the plane) in `src/data/milky-way.ts`, written by `scripts/make-milky-way-data.py` from three sources. No image of the sky is read, copied or traced.
35
+ - **Star counts: the SAO Star Catalog** (Smithsonian Astrophysical Observatory Star Catalog, 258,944 stars to about visual magnitude 9.3; catalogue I/131A at the CDS), as NASA's HEASARC serves it (table `sao`, https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/sao.html, file https://heasarc.gsfc.nasa.gov/FTP/heasarc/dbase/tdat_files/heasarc_sao.tdat.gz, read 2026-11-08). **No licence is stated for this catalogue: it is used with credit to the Smithsonian Astrophysical Observatory and NASA's HEASARC, and removed on request.** Only the stars of visual magnitude 7.0 to 9.0 are counted, on an equal-area grid, and only the counts (a handful of smoothed numbers per square degree) are kept: no star of the catalogue is in the package. The counts show where the Milky Way's stars are thick and, where the catalogue falls short of its surroundings, where near dust (the Coalsack) hides the stars behind it.
36
+ - **Dust: the IRAS Sky Survey Atlas, 100 micron** (NASA/IPAC Infrared Science Archive; IRAS was a NASA, Dutch and British mission), as NASA's SkyView serves it (https://skyview.gsfc.nasa.gov, survey `IRAS 100`, read 2026-11-08), which labels the survey "Copyright: Public Domain" and its provenance "NASA IPAC/Jet Propulsion Laboratory". Where the atlas has unobserved strips, **COBE DIRBE's zodi-subtracted mission-average 100 micron map** (the COBE Team, NASA Goddard; SkyView survey `COBE DIRBE/ZSMA`, labelled "Copyright: Public Domain") fills them, on a scale matched in the plane. The map's glow compared with the glow around it says where the dust lanes are (the Great Rift, the Cygnus Rift); it is not an image of them. "IRAS" in SkyView is the ISSA atlas, not the Schlegel, Finkbeiner and Davis map nor IRIS, which others derived from it and which are not used.
37
+ - **The bulge and the disk: our own figures.** The bright core toward Sagittarius is a Gaussian some 8 degrees along the plane and 3.5 across, and the glow along the plane follows an exponential disk (scale length 2.6 kpc, the Sun 8.2 kpc from the centre) added up along each line of sight: round, published values of the Galaxy's size, not a copy of any map or model. The counts change the disk's glow only by how much each direction is richer or poorer than its neighbourhood.
38
+ - **Galactic frame**: the IAU's (north galactic pole at right ascension 192.85948 and declination 27.12825 degrees, and the north celestial pole at galactic longitude 122.93192 degrees, J2000), written as formulas.
39
+ - **Not used**: any photograph or drawing of the Milky Way (ESO's panorama, NASA's and ESA's pictures and Gaia's colour map were looked at, nowhere in the data or code, only to judge the result by eye); Planck's maps; the Schlegel, Finkbeiner and Davis dust map; Stellarium's textures (GPL) and anyone's artwork.
40
+
32
41
  ## Your sky
33
42
 
34
43
  - **Horizon view (`@johnmorrisdotca/hoshi-stars/sky`)**: written from the formulas in J. Meeus, "Astronomical Algorithms", 2nd ed. (Willmann-Bell, 1998): Greenwich mean sidereal time (the IAU 1982 expression, chapter 12), equatorial to horizontal coordinates (chapter 13), atmospheric refraction (Saemundsson's formula, chapter 16) and precession from J2000 (the IAU 1976 constants, chapter 21). The formulas are mathematics and the worked examples (12.a, 12.b, 13.b, 21.b) are used only as test values; no book text or library code is copied.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Hoshi Stars 星
2
2
 
3
+ <p>Part of <strong>SpaceProgramX (SPX)</strong>, the space packages: <a href="https://github.com/johnmorrisdotca/wakusei-planets">Wakusei Planets</a> · <a href="https://github.com/johnmorrisdotca/hoshi-stars">Hoshi Stars</a> · <a href="https://github.com/johnmorrisdotca/chikyu-earth">Chikyu Earth</a> · <a href="https://github.com/johnmorrisdotca/uchusen-rockets">Uchusen Rockets</a></p>
4
+
3
5
  **[Try the demo](https://johnmorrisdotca.github.io/hoshi-stars/)**: a sky chart you turn, zoom and search, in English and Japanese.
4
6
 
5
7
  The stars you can see without a telescope: 5,080 of them, with names, positions, proper motion, distance and colour. Typed, no dependencies, about 100 kB gzipped. Hoshi (星) is the Japanese word for a star.
@@ -179,6 +181,19 @@ An object has `id`, `messier`, `ngc`, `ic` (each a string such as `"NGC 224"`),
179
181
  - **Magnitudes and sizes of the Messier objects** are the published visual magnitudes and major axes of NASA HEASARC's Messier table, because Wikidata's V-band magnitudes for 14 of them are more than a magnitude off (the central star's, for the four planetary nebulae). The NGC and IC magnitudes are Wikidata's, except that a planetary nebula has none (Wikidata's is its central star's); about four in ten have none, and almost none has a size.
180
182
  - **Positions** are Wikidata's. Every Messier object was compared with NED and a sample of the others too; the objects that were more than an arc-minute apart are listed in [NOTICE.md](NOTICE.md), and where Wikidata was wrong the table has NED's position.
181
183
 
184
+ ## The Milky Way
185
+
186
+ `@johnmorrisdotca/hoshi-stars/milky-way` is a brightness map of the Milky Way in about 11 kB: the band along the galactic equator, the bright core toward Sagittarius, and the Great Rift, the Coalsack and the Cygnus Rift as dimmer places. It is made by `scripts/make-milky-way-data.py` from SAO star counts, NASA's IRAS 100 micron dust map and a bulge of our own figures (see [NOTICE.md](NOTICE.md)); no picture of the sky is traced.
187
+
188
+ ```ts
189
+ import { milkyWayBands, milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
190
+
191
+ console.log(milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 }) > 0.7); // true: the core, in Sagittarius
192
+ console.log(milkyWayBands([0.2, 0.5]).map((band) => band.strips.length)); // ribbons of sky points to fill as soft bands
193
+ ```
194
+
195
+ `milkyWayBrightness(point)` is 0 (dark sky) to 1 (the core); `milkyWayBands(levels, { step })` gives ribbons of sky points for `project`; `toGalactic` and `fromGalactic` change the frame. The demo draws it as soft bands under the stars, in every projection, and its **Milky Way** button turns it off.
196
+
182
197
  ## Put a chart in a page
183
198
 
184
199
  The package gives numbers; a chart is a few lines of SVG. In React, for example (Vue, Svelte, Angular, Vite, webpack, a plain `<script type="module">` from a CDN, Node and TypeScript are in the [guides](https://johnmorrisdotca.github.io/hoshi-stars/docs/)):
@@ -241,11 +256,11 @@ Docs: https://johnmorrisdotca.github.io/hoshi-stars/docs/ , with a Japanese page
241
256
 
242
257
  ## Where the data comes from
243
258
 
244
- The Yale Bright Star Catalogue (Hoffleit and Warren 1991), credited in [NOTICE.md](NOTICE.md). The larger catalogues (Hipparcos, Tycho, Gaia) are ESA's, licensed for non-commercial use only, so an MIT package cannot pass them on. Stars fainter than magnitude 6.0 are not in this package. The deep-sky objects are Wikidata's (CC0), with NASA HEASARC's Messier table and NED as checks.
259
+ The Yale Bright Star Catalogue (Hoffleit and Warren 1991), credited in [NOTICE.md](NOTICE.md). The larger catalogues (Hipparcos, Tycho, Gaia) are ESA's, licensed for non-commercial use only, so an MIT package cannot pass them on. Stars fainter than magnitude 6.0 are not in this package. The deep-sky objects are Wikidata's (CC0), with NASA HEASARC's Messier table and NED as checks. The Milky Way's brightness comes from SAO star counts (NASA HEASARC; no licence stated, used with credit and removed on request) and NASA's IRAS and COBE dust maps.
245
260
 
246
261
  ## Coming
247
262
 
248
- A Milky Way outline and a star-chart function, each its own import. This package is the sky behind [wakusei-planets](https://github.com/johnmorrisdotca/wakusei-planets); it does not depend on it.
263
+ A star-chart function as its own import. This package is the sky behind [wakusei-planets](https://github.com/johnmorrisdotca/wakusei-planets); it does not depend on it.
249
264
 
250
265
  ## The family
251
266
 
@@ -0,0 +1,5 @@
1
+ export declare const MILKY_WAY_COLUMNS = 360;
2
+ export declare const MILKY_WAY_ROWS = 120;
3
+ export declare const MILKY_WAY_LATITUDE = 30;
4
+ export declare const MILKY_WAY_LEVELS = 31;
5
+ export declare const MILKY_WAY_PACKED = "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECQcHCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMLBAgCCgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEIBAwCDwcHBwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcJAw0CDwsHBwIKAQkHBwcHAwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECwINAQ8NBwQIAgsBCQMJBgkHBwQJAAkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcMAg0ADw8HAw8BCQMKAwsECQcJAQ4CCAMIBggHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcEDwEPDw8HAg8IAAkCCwINAQwGDwgACQEKAAoFCAcHBwcCCAcHBwcHBwcHBwcDCAcHBwcIBwcHBwcHBwcHBwcBDw8PDwsHAQ8MAQ8MAQwCCQIPDwsECAcHBwcCCQcHBwcHBwcHBwkHAQoHBAkHBQkHBwcHBwcHBwcHBwAPDw8PDgUPCgALAA8PDAEJAg8PDQEJBwUJAgkHBAoCCAcHBwcHBwUJBwILBwAPAgkACAAJBwUJBwcHBwcHBwcHBwcADw8PDw4DDwsBDw8PDQIPDw4ACQMJBQwBCQcDCwEKBwcHBwcHBAoHAQsCCQAIAQ8BDAAJAQkFCAMIBwcHBwcHBwcHBwcPDw8PDwgBDwwADw8PDwAPDw8ACQILBAwCCQAIAA0BCwEKBwcHBwcHAA8PDQIIAAkADwEPAAoECgIJAQsHBwcHBwcHBwcHAA8PDw8PDw8PDw8PCAAPDw8KAQ4BDw8PCQAOBwIJBwcHBwAPDwgHAQkCDw8KBAsCCgEKBwcHBwcHBwcHBw8PDBIPDw8PDw8PDw8PDw8PDw8PDwsHAQkHAQgHBwQPDwgHAQoBDw8LAg0BDAAKBwcHBwcHBwcHBg8PDRMPDw8PDw8PDw8PDw8PDw8PDwsBCAQKBwEIBwcDDw8KBwAPDw8IAg0ADwoHBwcHBwcHBwcEDw8NFQ8PDw8PDw8PDw8PDw8PDw8PDgMLBwcHBA8PCwYPDw8PDw8BCgcHBwcHBwcHBw8PEQsVDw8PDw8PDw8PDw8PDw8PDw8PAgwBCQcHBg8PDQEPDw8PDw8PCQcHBwcHBwcHBQ8PEwkWDxAPDw8PDw8PDw8PDw8PDw8PDwAOAAoHBwQPDw8PDw8PDw8PCwcHBwcHBwcHBA8NFQkXCREPDw8PDw8PDw0QDw8PDw8PDw8PDwkHBwMPDw8PDw8PDw8PCwcHBwcHBwcHAw8OFxcJEQkQCRAPDw8PDw8PDw8PDw8PDw8PDw8KBwcDDw8PDw8PDw8PDwsHBwcHBwcHBwEPCBAIEAsXEhgXFQ8PDwsQDwoQDw8PCBAPDw8PDw8PDw8PDAcACgMPDw8PDw8PDw8PCwcHBwcHBwcHDwwRCBcUGRcVDxAPDwkRCBILEw4RDw4QDhAPDw8PDw8PDw8MBwsDDw4QDAAPDw8PDw8PDQcHBwcHBwcEDw0XFxEZFxUJEAoTDhIMFxAKFAsUDRELEgwUDw8PDw8PDw8PCwUNAg8PDw8PDw8PDw8MAggHBwcHBggHCAIIAA8PFxceFxcWChUKFxcRChUNEgoSDRQJEA8PDw8PDw8PDwUNAQ8PDw8PDw8PDw8PCgcHBwcCDAcCDw8J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EA8PDw8PDw8PDxALEAkRCRAPDxEKFA8KEA8PDwcHBwQPDw8PChcTHx0TGRMKFAsXFxQKEAoQCxcVCRcRDREMEQ8PDw8PDw8PDw8PDw8PDw8NEw8PDw8KBwcHBwEPDw8OFxMfHBQYEg0TCxcXEQ8OFxUJFw8RDBAPDw8PDw8PDw8PDw8PDw8PDRAIEQ8PDw8HBwcHBg8JAwkADw4XExgRHRcRDw4XFxAPDwgVCRQJEAgSDwoRDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwcHBwcGCQEMBw8PFxUcFxIPDxcVDhAPChAJEAwSChAIEQ8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDQcHBwcHCAcHAw8KFQkWGBcUDw8OFQ8IEA8PDBEKEAgQDw8PDw8PDw8PDw8PCgEPDw8PDw8PDw8PDQAJBwcHBwcHBwUJAw0TChcXFA8PDhIPDw8PCRAPDw8PDw8PDw8PDw8LAAsDDw8PDw8PDw8PDwsHBwcHBwcHBwcOEgoSChcQDw8PDw8PDw8JEA8PDw8PDw8PDw8NAA8JBwQPDw8PDw8PCgEPDw0HBwcHBwcHBwcPEAsRCxYPDw8PDw8PDw8PDw8PDw8PDw8PCQIMBwcBDw8PDw8PDwgCDw8MBwcHBwcHBwcHAA8PCxEPDw8PDw8PDw8PDw8PDw8PDw8IAQkCDAMLBwcGDw8PDw8PDQIPDwsHBwcHBwcHBwcADw8LEA8PDw8PDw8PDw8PDw8NAAgBDw8BDwwHDAQKBwcGDw8PDw8PDQIPDwoHBwcHBwcHBwcBDw8PDw8PDw8PDw8PDw8PDgIIBA8PAQ8KBwELBggHBwcPDw8PCQEJAA8NAg8PCgcHBwcHBwcHBwEPDQAPDw8PDw8PDw8PDw8PCgIIBwEPCQEMAQ8JBwIKBwcHBwIIAAwADw8NAg8PCAIIAg8KAQkHBwcHBwcHBwcBDw0ADw8PDw8PDw8PDw8PDwoCCAcBDAYMAQ4ACQcHBwcHBwQJAg8PCAAKAg8DDAYPCQIIBwcHBwcHBwcHAg8NAA8PDwEIAQ8PDwwGDw8PDw8IAgkDCAQMBwsBDQcHBwcHBwcGDwwACAEKBA0DDQUPCQcHBwcHBwcHBwcPDAAPDw8FDw8PCwcPDw8PDgQIAwgGCAcCDgcHBwcHBwcHAgkBDgcFCAAMAggACgYKBAgHBwcHBwcHBwcHAQ8LAAoADw0ACgcPDw8LBw8PDwwADwUIAwgHBwIMBwcHBwcHBwYJAwkDCAcHBAgACgEIAQkHCQcHBwcHBwcHBwcHDw4BDw0ACAcBDw8PCwcADwwADgAMBAkBCAcHBwYLBwcHBwcHBwcHAQgACAcHBgkHBwkHBwcHBwcHBwcHBwIPCgIPDAEIBwIPAQ8PCAcBDQELAQ0BCgUJAQgHBwcHCgcHBwcHBwcHBwcHBwQIBwcJBwcHBwcHBwcHBwcCCAEPAw8LAQgHAg4CDAAMAggHBAwBDAcHBQgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAA8EDwQIBwIJAQoDCAMLBwcCCwELBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCDQUOBAgHAgkHBQkHBwUKAgoHBwYIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwIMBgwGCQcHBwEJBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAgsGCwcACAcHBwcHBwIIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCCwUMBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEKBQ4HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHCAYOBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcACAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==";
@@ -0,0 +1,7 @@
1
+ // Written by scripts/make-milky-way-data.py: do not edit by hand.
2
+ // The Milky Way's brightness in galactic coordinates. SAO star counts (NASA HEASARC), the IRAS 100 micron dust map and COBE DIRBE (NASA), and a bulge of our own; see NOTICE.md.
3
+ export const MILKY_WAY_COLUMNS = 360;
4
+ export const MILKY_WAY_ROWS = 120;
5
+ export const MILKY_WAY_LATITUDE = 30.0;
6
+ export const MILKY_WAY_LEVELS = 31;
7
+ export const MILKY_WAY_PACKED = "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECQcHCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMLBAgCCgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEIBAwCDwcHBwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcJAw0CDwsHBwIKAQkHBwcHAwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECwINAQ8NBwQIAgsBCQMJBgkHBwQJAAkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcMAg0ADw8HAw8BCQMKAwsECQcJAQ4CCAMIBggHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcEDwEPDw8HAg8IAAkCCwINAQwGDwgACQEKAAoFCAcHBwcCCAcHBwcHBwcHBwcDCAcHBwcIBwcHBwcHBwcHBwcBDw8PDwsHAQ8MAQ8MAQwCCQIPDwsECAcHBwcCCQcHBwcHBwcHBwkHAQoHBAkHBQkHBwcHBwcHBwcHBwAPDw8PDgUPCgALAA8PDAEJAg8PDQEJBwUJAgkHBAoCCAcHBwcHBwUJBwILBwAPAgkACAAJBwUJBwcHBwcHBwcHBwcADw8PDw4DDwsBDw8PDQIPDw4ACQMJBQwBCQcDCwEKBwcHBwcHBAoHAQsCCQAIAQ8BDAAJAQkFCAMIBwcHBwcHBwcHBwcPDw8PDwgBDwwADw8PDwAPDw8ACQILBAwCCQAIAA0BCwEKBwcHBwcHAA8PDQIIAAkADwEPAAoECgIJAQsHBwcHBwcHBwcHAA8PDw8PDw8PDw8PCAAPDw8KAQ4BDw8PCQAOBwIJBwcHBwAPDwgHAQkCDw8KBAsCCgEKBwcHBwcHBwcHBw8PDBIPDw8PDw8PDw8PDw8PDw8PDwsHAQkHAQgHBwQPDwgHAQoBDw8LAg0BDAAKBwcHBwcHBwcHBg8PDRMPDw8PDw8PDw8PDw8PDw8PDwsBCAQKBwEIBwcDDw8KBwAPDw8IAg0ADwoHBwcHBwcHBwcEDw8NFQ8PDw8PDw8PDw8PDw8PDw8PDgMLBwcHBA8PCwYPDw8PDw8BCgcHBwcHBwcHBw8PEQsVDw8PDw8PDw8PDw8PDw8PDw8PAgwBCQcHBg8PDQEPDw8PDw8PCQcHBwcHBwcHBQ8PEwkWDxAPDw8PDw8PDw8PDw8PDw8PDwAOAAoHBwQPDw8PDw8PDw8PCwcHBwcHBwcHBA8NFQkXCREPDw8PDw8PDw0QDw8PDw8PDw8PDwkHBwMPDw8PDw8PDw8PCwcHBwcHBwcHAw8OFxcJEQkQCRAPDw8PDw8PDw8PDw8PDw8PDw8KBwcDDw8PDw8PDw8PDwsHBwcHBwcHBwEPCBAIEAsXEhgXFQ8PDwsQDwoQDw8PCBAPDw8PDw8PDw8PDAcACgMPDw8PDw8PDw8PCwcHBwcHBwcHDwwRCBcUGRcVDxAPDwkRCBILEw4RDw4QDhAPDw8PDw8PDw8MBwsDDw4QDAAPDw8PDw8PDQcHBwcHBwcEDw0XFxEZFxUJEAoTDhIMFxAKFAsUDRELEgwUDw8PDw8PDw8PCwUNAg8PDw8PDw8PDw8MAggHBwcHBggHCAIIAA8PFxceFxcWChUKFxcRChUNEgoSDRQJEA8PDw8PDw8PDwUNAQ8PDw8PDw8PDw8PCgcHBwcCDAcCDw8J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EA8PDw8PDw8PDxALEAkRCRAPDxEKFA8KEA8PDwcHBwQPDw8PChcTHx0TGRMKFAsXFxQKEAoQCxcVCRcRDREMEQ8PDw8PDw8PDw8PDw8PDw8NEw8PDw8KBwcHBwEPDw8OFxMfHBQYEg0TCxcXEQ8OFxUJFw8RDBAPDw8PDw8PDw8PDw8PDw8PDRAIEQ8PDw8HBwcHBg8JAwkADw4XExgRHRcRDw4XFxAPDwgVCRQJEAgSDwoRDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwcHBwcGCQEMBw8PFxUcFxIPDxcVDhAPChAJEAwSChAIEQ8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDQcHBwcHCAcHAw8KFQkWGBcUDw8OFQ8IEA8PDBEKEAgQDw8PDw8PDw8PDw8PCgEPDw8PDw8PDw8PDQAJBwcHBwcHBwUJAw0TChcXFA8PDhIPDw8PCRAPDw8PDw8PDw8PDw8LAAsDDw8PDw8PDw8PDwsHBwcHBwcHBwcOEgoSChcQDw8PDw8PDw8JEA8PDw8PDw8PDw8NAA8JBwQPDw8PDw8PCgEPDw0HBwcHBwcHBwcPEAsRCxYPDw8PDw8PDw8PDw8PDw8PDw8PCQIMBwcBDw8PDw8PDwgCDw8MBwcHBwcHBwcHAA8PCxEPDw8PDw8PDw8PDw8PDw8PDw8IAQkCDAMLBwcGDw8PDw8PDQIPDwsHBwcHBwcHBwcADw8LEA8PDw8PDw8PDw8PDw8NAAgBDw8BDwwHDAQKBwcGDw8PDw8PDQIPDwoHBwcHBwcHBwcBDw8PDw8PDw8PDw8PDw8PDgIIBA8PAQ8KBwELBggHBwcPDw8PCQEJAA8NAg8PCgcHBwcHBwcHBwEPDQAPDw8PDw8PDw8PDw8PCgIIBwEPCQEMAQ8JBwIKBwcHBwIIAAwADw8NAg8PCAIIAg8KAQkHBwcHBwcHBwcBDw0ADw8PDw8PDw8PDw8PDwoCCAcBDAYMAQ4ACQcHBwcHBwQJAg8PCAAKAg8DDAYPCQIIBwcHBwcHBwcHAg8NAA8PDwEIAQ8PDwwGDw8PDw8IAgkDCAQMBwsBDQcHBwcHBwcGDwwACAEKBA0DDQUPCQcHBwcHBwcHBwcPDAAPDw8FDw8PCwcPDw8PDgQIAwgGCAcCDgcHBwcHBwcHAgkBDgcFCAAMAggACgYKBAgHBwcHBwcHBwcHAQ8LAAoADw0ACgcPDw8LBw8PDwwADwUIAwgHBwIMBwcHBwcHBwYJAwkDCAcHBAgACgEIAQkHCQcHBwcHBwcHBwcHDw4BDw0ACAcBDw8PCwcADwwADgAMBAkBCAcHBwYLBwcHBwcHBwcHAQgACAcHBgkHBwkHBwcHBwcHBwcHBwIPCgIPDAEIBwIPAQ8PCAcBDQELAQ0BCgUJAQgHBwcHCgcHBwcHBwcHBwcHBwQIBwcJBwcHBwcHBwcHBwcCCAEPAw8LAQgHAg4CDAAMAggHBAwBDAcHBQgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAA8EDwQIBwIJAQoDCAMLBwcCCwELBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCDQUOBAgHAgkHBQkHBwUKAgoHBwYIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwIMBgwGCQcHBwEJBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAgsGCwcACAcHBwcHBwIIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCCwUMBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEKBQ4HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHCAYOBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcACAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==";
@@ -1,4 +1,4 @@
1
1
  // The Japanese names of the named stars, in katakana: the IAU Working Group on Star Names' spellings written in Japanese letters, by hand (a transliteration is not copyrightable), by Bright Star Catalogue (HR) number.
2
2
  // The spellings follow the usual Japanese forms (シリウス, ベテルギウス). A few are our own reading of an uncommon name and wait for a Japanese reviewer.
3
3
  /** The katakana name of each named star, by HR number. */
4
- export const STAR_NAMES_JA = { 15: "アルフェラッツ", 21: "カフ", 39: "アルゲニブ", 99: "アンカア", 168: "シェダル", 188: "ディフダ", 264: "ナビ", 337: "ミラク", 403: "ルクバー", 424: "ポラリス", 472: "アケルナル", 542: "セギン", 544: "モタッラー", 553: "シェラタン", 603: "アルマク", 617: "ハマル", 681: "ミラ", 897: "アカマル", 911: "メンカル", 936: "アルゴル", 1017: "ミルファク", 1457: "アルデバラン", 1708: "カペラ", 1713: "リゲル", 1790: "ベラトリックス", 1791: "エルナト", 1829: "ニハル", 1852: "ミンタカ", 1865: "アルネブ", 1903: "アルニラム", 1948: "アルニタク", 1956: "ファクト", 2004: "サイフ", 2040: "ワズン", 2061: "ベテルギウス", 2088: "メンカリナン", 2294: "ミルザム", 2326: "カノープス", 2421: "アルヘナ", 2491: "シリウス", 2618: "アダラ", 2693: "ウェズン", 2891: "カストル", 2943: "プロキオン", 2990: "ポルックス", 3165: "ナオス", 3307: "アビオール", 3569: "タリタ", 3634: "スハイル", 3685: "ミアプラキドゥス", 3699: "アスピディスケ", 3748: "アルファルド", 3982: "レグルス", 4033: "タニア・ボレアリス", 4057: "アルギエバ", 4069: "タニア・アウストラリス", 4287: "アルケス", 4295: "メラク", 4301: "ドゥーベ", 4375: "アルラ・アウストラリス", 4377: "アルラ・ボレアリス", 4534: "デネボラ", 4554: "フェクダ", 4623: "アルキバ", 4660: "メグレズ", 4662: "ギエナー", 4757: "アルゴラブ", 4763: "ガクルックス", 4786: "クラズ", 4825: "ポリマ", 4853: "ミモザ", 4905: "アリオト", 4932: "ビンデミアトリックス", 5054: "ミザール", 5056: "スピカ", 5191: "アルカイド", 5235: "ムフリッド", 5267: "ハダル", 5288: "メンケント", 5291: "トゥバン", 5340: "アークトゥルス", 5435: "セギヌス", 5459: "リギル・ケンタウルス", 5469: "メン", 5506: "イザール", 5531: "ズベンエルゲヌビ", 5563: "コカブ", 5602: "ネッカル", 5685: "ズベンエスカマリ", 5793: "アルフェッカ", 5854: "ウヌクアルハイ", 5953: "ジュバ", 5984: "アクラブ", 6132: "アテビネ", 6134: "アンタレス", 6148: "コルネフォロス", 6212: "ルティリクス", 6217: "アトリア", 6241: "ララワグ", 6378: "サビク", 6406: "ラスアルゲティ", 6527: "シャウラ", 6553: "サルガス", 6556: "ラスアルハゲ", 6603: "ケバルライ", 6705: "エルタニン", 6859: "カウス・メディア", 6879: "カウス・アウストラリス", 6913: "カウス・ボレアリス", 7001: "ベガ", 7106: "シェリアク", 7121: "ヌンキ", 7178: "スラファト", 7194: "アスケラ", 7235: "オカブ", 7417: "アルビレオ", 7525: "タラゼド", 7528: "ファワリス", 7557: "アルタイル", 7602: "アルシャイン", 7776: "ダビー", 7790: "ピーコック", 7796: "サドル", 7882: "ロタネブ", 7906: "スアロキン", 7924: "デネブ", 7949: "アルジャナー", 8162: "アルデラミン", 8232: "サダルスウド", 8308: "エニフ", 8414: "サダルメリク", 8425: "アルナイル", 8728: "フォーマルハウト", 8775: "シェアト", 8781: "マルカブ", 8974: "エライ" };
4
+ export const STAR_NAMES_JA = { 15: "アルフェラッツ", 21: "カフ", 39: "アルゲニブ", 99: "アンカア", 153: "フル", 168: "シェダル", 188: "ディフダ", 219: "アキルド", 264: "ナビ", 265: "カストゥラ", 337: "ミラク", 338: "ウレン", 361: "レヴァティ", 390: "アディル", 403: "ルクバー", 424: "ポラリス", 437: "アルフェルグ", 458: "ティタウィン", 464: "ネンブス", 472: "アケルナル", 510: "トルクラル", 539: "バテン・カイトス", 542: "セギン", 544: "モタッラー", 546: "メサルティム", 553: "シェラタン", 596: "アルレシャ", 603: "アルマク", 617: "ハマル", 681: "ミラ", 804: "カファルジドマ", 824: "リリイ・ボレア", 834: "ミラム", 838: "バラニ", 850: "アンゲテナル", 874: "アズハ", 897: "アカマル", 911: "メンカル", 936: "アルゴル", 941: "ミサム", 951: "ボテイン", 963: "ダリム", 984: "ジバル", 1017: "ミルファク", 1084: "ラン", 1131: "アティク", 1136: "ラナ", 1140: "ケライノ", 1142: "エレクトラ", 1145: "タイゲタ", 1149: "マイア", 1151: "アステロペ", 1156: "メロペ", 1165: "アルキオネ", 1178: "アトラス", 1180: "プレイオネ", 1228: "メンキブ", 1231: "ザウラク", 1298: "ベイド", 1325: "ケイド", 1346: "プリマ・ヒュアドゥム", 1373: "セクンダ・ヒュアドゥム", 1393: "ビーミム", 1409: "アイン", 1412: "チャムクイ", 1457: "アルデバラン", 1464: "テーミン", 1481: "セプトルム", 1543: "タビト", 1577: "ハッサレ", 1605: "アルマーズ", 1612: "サクラテニ", 1641: "ハエドゥス", 1666: "クルサ", 1708: "カペラ", 1713: "リゲル", 1790: "ベラトリックス", 1791: "エルナト", 1829: "ニハル", 1852: "ミンタカ", 1865: "アルネブ", 1879: "メイサ", 1899: "ハティサ", 1903: "アルニラム", 1910: "ティエングアン", 1948: "アルニタク", 1956: "ファクト", 2004: "サイフ", 2040: "ワズン", 2061: "ベテルギウス", 2088: "メンカリナン", 2095: "マハシム", 2177: "エルクルド", 2216: "プロプス", 2282: "フルド", 2286: "テヤト", 2294: "ミルザム", 2326: "カノープス", 2421: "アルヘナ", 2473: "メブスタ", 2484: "アルジル", 2491: "シリウス", 2618: "アダーラ", 2646: "ンガヌルガニティ", 2650: "メクブダ", 2657: "ムリフェイン", 2693: "ウェズン", 2777: "ワサト", 2827: "アルドラ", 2845: "ゴメイサ", 2891: "カストル", 2930: "ジシュイ", 2943: "プロキオン", 2990: "ポルックス", 3045: "アズミディ", 3165: "ナオス", 3185: "トゥレイス", 3208: "テグミネ", 3249: "タルフ", 3268: "ピアウトス", 3275: "アルシアウカト", 3307: "アビオール", 3323: "ムスシダ", 3418: "ミンキル", 3449: "アセルス・ボレアリス", 3461: "アセルス・アウストラリス", 3482: "アシュレーシャ", 3485: "アルセフィナ", 3522: "コペルニクス", 3569: "タリタ", 3572: "アクベンス", 3594: "アルカフラ", 3627: "ナーン", 3634: "スハイル", 3685: "ミアプラキドゥス", 3699: "アスピディスケ", 3734: "マルケブ", 3743: "インテルクルス", 3748: "アルファルド", 3773: "アルテルフ", 3845: "ウクダ", 3852: "スブラ", 3903: "ジャン", 3905: "ラスアラス", 3923: "フェリス", 3982: "レグルス", 4031: "アドハフェラ", 4033: "タニア・ボレアリス", 4057: "アルギエバ", 4069: "タニア・アウストラリス", 4247: "プラエキプア", 4277: "チャラワン", 4287: "アルケス", 4295: "メラク", 4301: "ドゥーベ", 4357: "ゾスマ", 4359: "ケルタン", 4375: "アルラ・アウストラリス", 4377: "アルラ・ボレアリス", 4434: "ギアウサル", 4518: "タイヤンショウ", 4534: "デネボラ", 4540: "ザヴィジャヴァ", 4554: "フェクダ", 4609: "トナティウ", 4623: "アルキバ", 4656: "イマイ", 4660: "メグレズ", 4662: "ギエナー", 4689: "ザニア", 4700: "ギナン", 4730: "アクルックス", 4757: "アルゴラブ", 4763: "ガクルックス", 4785: "カラ", 4786: "クラズ", 4825: "ポリマ", 4846: "ラ・スペルバ", 4853: "ミモザ", 4863: "ティエンイー", 4905: "アリオト", 4910: "ミネラウバ", 4915: "コル・カロリ", 4916: "タイイー", 4932: "ビンデミアトリックス", 4968: "ダイアデム", 5054: "ミザール", 5056: "スピカ", 5062: "アルコル", 5107: "ヘゼ", 5191: "アルカイド", 5235: "ムフリッド", 5267: "ハダル", 5288: "メンケント", 5291: "トゥバン", 5315: "カン", 5338: "シルマ", 5340: "アークトゥルス", 5351: "シュアンゲ", 5359: "カンバリア", 5409: "エルガファル", 5435: "セギヌス", 5459: "リギル・ケンタウルス", 5460: "トリマン", 5469: "メン", 5506: "イザール", 5531: "ズベンエルゲヌビ", 5533: "メルガ", 5563: "コカブ", 5602: "ネッカル", 5603: "ブラキウム", 5685: "ズベンエスカマリ", 5733: "アルカルロプス", 5735: "フェルカド", 5744: "エダシク", 5747: "ヌサカン", 5787: "ズベンエルハクラビ", 5793: "アルフェッカ", 5854: "ウヌクアルハイ", 5879: "グジャ", 5928: "イクリル", 5944: "ファン", 5953: "ジュバ", 5984: "アクラブ", 6008: "マルシク", 6027: "ジャッバ", 6056: "イェド・プリオル", 6075: "イェド・ポステリオル", 6084: "アルニヤト", 6117: "クジャム", 6132: "アテビネ", 6134: "アンタレス", 6148: "コルネフォロス", 6149: "マルフィク", 6165: "パイカウハレ", 6212: "ルティリクス", 6217: "アトリア", 6241: "ララワグ", 6247: "シャミディムラ", 6252: "ピピリマ", 6370: "アルラキス", 6378: "サビク", 6396: "アルディバ", 6402: "グニーブー", 6406: "ラスアルゲティ", 6410: "サリン", 6508: "レサト", 6526: "マーシム", 6527: "シャウラ", 6536: "ラスタバン", 6553: "サルガス", 6556: "ラスアルハゲ", 6585: "セルバンテス", 6603: "ケバルライ", 6618: "アルルバ", 6630: "フーユエ", 6636: "ジバン", 6688: "グルミウム", 6705: "エルタニン", 6746: "アルナスル", 6789: "ユルドゥン", 6812: "ポリス", 6859: "カウス・メディア", 6879: "カウス・アウストラリス", 6913: "カウス・ボレアリス", 6945: "ファフニール", 7001: "ベガ", 7106: "シェリアク", 7116: "アイナルラミ", 7121: "ヌンキ", 7141: "アリヤ", 7178: "スラファト", 7194: "アスケラ", 7228: "ポラリス・アウストラリス", 7235: "オカブ", 7254: "メリディアナ", 7264: "アルバルダ", 7298: "アルアドファル", 7310: "アルタイス", 7337: "アルカブ・プリオル", 7343: "アルカブ・ポステリオル", 7348: "ルクバト", 7405: "アンセル", 7417: "アルビレオ", 7462: "アルサフィ", 7479: "シャム", 7525: "タラゼド", 7528: "ファワリス", 7557: "アルタイル", 7595: "リベルタス", 7597: "テレベルム", 7602: "アルシャイン", 7754: "アルゲディ", 7773: "アルシャト", 7776: "ダビー", 7790: "ピーコック", 7796: "サドル", 7852: "アルドゥルフィン", 7882: "ロタネブ", 7906: "スアロキン", 7924: "デネブ", 7949: "アルジャナー", 7950: "アルバリ", 8030: "ムシカ", 8131: "キタルファ", 8162: "アルデラミン", 8232: "サダルスウド", 8238: "アルフィルク", 8264: "ブンダ", 8278: "ナシラ", 8301: "アゼルファファゲ", 8308: "エニフ", 8322: "デネブ・アルゲディ", 8353: "アルダナブ", 8414: "サダルメリク", 8417: "クルハ", 8425: "アルナイル", 8450: "ビハム", 8499: "アンチャ", 8518: "サダクビア", 8610: "シトゥラ", 8634: "ホマム", 8636: "ティアキ", 8650: "マタル", 8684: "サダルバリ", 8709: "スカト", 8728: "フォーマルハウト", 8729: "ヘルウェティオス", 8773: "フマルサマカ", 8775: "シェアト", 8781: "マルカブ", 8880: "サルム", 8905: "アルカラブ", 8930: "ウェリターテ", 8974: "エライ" };
@@ -1,6 +1,6 @@
1
1
  // GENERATED by scripts/make-star-data.py. Do not edit by hand.
2
2
  // The stars of visual magnitude 6.0 and brighter from the Yale Bright Star Catalogue (Hoffleit and Warren 1991, 5th revised edition, preliminary; ADC V/50, from NASA HEASARC):
3
- // 5080 stars, brightest first. One row a star: HR number | Bayer letter | Flamsteed number | constellation (empty here for a star with neither; scripts/set-star-constellations.ts fills it) | RA J2000 in tenths of a second of time |
3
+ // 5080 stars, brightest first. One row a star: HR number | Bayer letter | Flamsteed number | constellation (the catalogue's for a star with a Bayer letter or a Flamsteed number, else the boundaries': scripts/set-star-constellations.ts fills it in) | RA J2000 in tenths of a second of time |
4
4
  // Dec J2000 in arc-seconds (both the catalogue's own resolution) | proper motion in RA (times cos Dec) and in Dec, milliarcseconds a year | V magnitude times 100 |
5
5
  // B-V times 100 | spectral class and subclass | parallax in milliarcseconds.
6
6
  /** The star rows, one per line. */
@@ -5085,4 +5085,4 @@ export const STAR_ROWS = `2491|α|9|CMa|243089|-60178|-553|-1205|-146|0|A1|375
5085
5085
  9052|||Cas|861337|206684|-8|-3|600|21|B0|29
5086
5086
  9053|||And|861336|170481|0|-5|600|116|G8|0`;
5087
5087
  /** Common names by HR number: our own list, after the IAU Working Group on Star Names. */
5088
- export const STAR_NAMES = { 15: "Alpheratz", 21: "Caph", 39: "Algenib", 99: "Ankaa", 168: "Schedar", 188: "Diphda", 264: "Navi", 337: "Mirach", 403: "Ruchbah", 424: "Polaris", 472: "Achernar", 542: "Segin", 544: "Mothallah", 553: "Sheratan", 603: "Almach", 617: "Hamal", 681: "Mira", 897: "Acamar", 911: "Menkar", 936: "Algol", 1017: "Mirfak", 1457: "Aldebaran", 1708: "Capella", 1713: "Rigel", 1790: "Bellatrix", 1791: "Elnath", 1829: "Nihal", 1852: "Mintaka", 1865: "Arneb", 1903: "Alnilam", 1948: "Alnitak", 1956: "Phact", 2004: "Saiph", 2040: "Wazn", 2061: "Betelgeuse", 2088: "Menkalinan", 2294: "Mirzam", 2326: "Canopus", 2421: "Alhena", 2491: "Sirius", 2618: "Adhara", 2693: "Wezen", 2891: "Castor", 2943: "Procyon", 2990: "Pollux", 3165: "Naos", 3307: "Avior", 3569: "Talitha", 3634: "Suhail", 3685: "Miaplacidus", 3699: "Aspidiske", 3748: "Alphard", 3982: "Regulus", 4033: "Tania Borealis", 4057: "Algieba", 4069: "Tania Australis", 4287: "Alkes", 4295: "Merak", 4301: "Dubhe", 4375: "Alula Australis", 4377: "Alula Borealis", 4534: "Denebola", 4554: "Phecda", 4623: "Alchiba", 4660: "Megrez", 4662: "Gienah", 4757: "Algorab", 4763: "Gacrux", 4786: "Kraz", 4825: "Porrima", 4853: "Mimosa", 4905: "Alioth", 4932: "Vindemiatrix", 5054: "Mizar", 5056: "Spica", 5191: "Alkaid", 5235: "Muphrid", 5267: "Hadar", 5288: "Menkent", 5291: "Thuban", 5340: "Arcturus", 5435: "Seginus", 5459: "Rigil Kentaurus", 5469: "Men", 5506: "Izar", 5531: "Zubenelgenubi", 5563: "Kochab", 5602: "Nekkar", 5685: "Zubeneschamali", 5793: "Alphecca", 5854: "Unukalhai", 5953: "Dschubba", 5984: "Acrab", 6132: "Athebyne", 6134: "Antares", 6148: "Kornephoros", 6212: "Rutilicus", 6217: "Atria", 6241: "Larawag", 6378: "Sabik", 6406: "Rasalgethi", 6527: "Shaula", 6553: "Sargas", 6556: "Rasalhague", 6603: "Cebalrai", 6705: "Eltanin", 6859: "Kaus Media", 6879: "Kaus Australis", 6913: "Kaus Borealis", 7001: "Vega", 7106: "Sheliak", 7121: "Nunki", 7178: "Sulafat", 7194: "Ascella", 7235: "Okab", 7417: "Albireo", 7525: "Tarazed", 7528: "Fawaris", 7557: "Altair", 7602: "Alshain", 7776: "Dabih", 7790: "Peacock", 7796: "Sadr", 7882: "Rotanev", 7906: "Sualocin", 7924: "Deneb", 7949: "Aljanah", 8162: "Alderamin", 8232: "Sadalsuud", 8308: "Enif", 8414: "Sadalmelik", 8425: "Alnair", 8728: "Fomalhaut", 8775: "Scheat", 8781: "Markab", 8974: "Errai" };
5088
+ export const STAR_NAMES = { 15: "Alpheratz", 21: "Caph", 39: "Algenib", 99: "Ankaa", 153: "Fulu", 168: "Schedar", 188: "Diphda", 219: "Achird", 264: "Navi", 265: "Castula", 337: "Mirach", 338: "Wurren", 361: "Revati", 390: "Adhil", 403: "Ruchbah", 424: "Polaris", 437: "Alpherg", 458: "Titawin", 464: "Nembus", 472: "Achernar", 510: "Torcular", 539: "Baten Kaitos", 542: "Segin", 544: "Mothallah", 546: "Mesarthim", 553: "Sheratan", 596: "Alrescha", 603: "Almach", 617: "Hamal", 681: "Mira", 804: "Kaffaljidhma", 824: "Lilii Borea", 834: "Miram", 838: "Bharani", 850: "Angetenar", 874: "Azha", 897: "Acamar", 911: "Menkar", 936: "Algol", 941: "Misam", 951: "Botein", 963: "Dalim", 984: "Zibal", 1017: "Mirfak", 1084: "Ran", 1131: "Atik", 1136: "Rana", 1140: "Celaeno", 1142: "Electra", 1145: "Taygeta", 1149: "Maia", 1151: "Asterope", 1156: "Merope", 1165: "Alcyone", 1178: "Atlas", 1180: "Pleione", 1228: "Menkib", 1231: "Zaurak", 1298: "Beid", 1325: "Keid", 1346: "Prima Hyadum", 1373: "Secunda Hyadum", 1393: "Beemim", 1409: "Ain", 1412: "Chamukuy", 1457: "Aldebaran", 1464: "Theemin", 1481: "Sceptrum", 1543: "Tabit", 1577: "Hassaleh", 1605: "Almaaz", 1612: "Saclateni", 1641: "Haedus", 1666: "Cursa", 1708: "Capella", 1713: "Rigel", 1790: "Bellatrix", 1791: "Elnath", 1829: "Nihal", 1852: "Mintaka", 1865: "Arneb", 1879: "Meissa", 1899: "Hatysa", 1903: "Alnilam", 1910: "Tianguan", 1948: "Alnitak", 1956: "Phact", 2004: "Saiph", 2040: "Wazn", 2061: "Betelgeuse", 2088: "Menkalinan", 2095: "Mahasim", 2177: "Elkurud", 2216: "Propus", 2282: "Furud", 2286: "Tejat", 2294: "Mirzam", 2326: "Canopus", 2421: "Alhena", 2473: "Mebsuta", 2484: "Alzirr", 2491: "Sirius", 2618: "Adhara", 2646: "Nganurganity", 2650: "Mekbuda", 2657: "Muliphein", 2693: "Wezen", 2777: "Wasat", 2827: "Aludra", 2845: "Gomeisa", 2891: "Castor", 2930: "Jishui", 2943: "Procyon", 2990: "Pollux", 3045: "Azmidi", 3165: "Naos", 3185: "Tureis", 3208: "Tegmine", 3249: "Tarf", 3268: "Piautos", 3275: "Alsciaukat", 3307: "Avior", 3323: "Muscida", 3418: "Minchir", 3449: "Asellus Borealis", 3461: "Asellus Australis", 3482: "Ashlesha", 3485: "Alsephina", 3522: "Copernicus", 3569: "Talitha", 3572: "Acubens", 3594: "Alkaphrah", 3627: "Nahn", 3634: "Suhail", 3685: "Miaplacidus", 3699: "Aspidiske", 3734: "Markeb", 3743: "Intercrus", 3748: "Alphard", 3773: "Alterf", 3845: "Ukdah", 3852: "Subra", 3903: "Zhang", 3905: "Rasalas", 3923: "Felis", 3982: "Regulus", 4031: "Adhafera", 4033: "Tania Borealis", 4057: "Algieba", 4069: "Tania Australis", 4247: "Praecipua", 4277: "Chalawan", 4287: "Alkes", 4295: "Merak", 4301: "Dubhe", 4357: "Zosma", 4359: "Chertan", 4375: "Alula Australis", 4377: "Alula Borealis", 4434: "Giausar", 4518: "Taiyangshou", 4534: "Denebola", 4540: "Zavijava", 4554: "Phecda", 4609: "Tonatiuh", 4623: "Alchiba", 4656: "Imai", 4660: "Megrez", 4662: "Gienah", 4689: "Zaniah", 4700: "Ginan", 4730: "Acrux", 4757: "Algorab", 4763: "Gacrux", 4785: "Chara", 4786: "Kraz", 4825: "Porrima", 4846: "La Superba", 4853: "Mimosa", 4863: "Tianyi", 4905: "Alioth", 4910: "Minelauva", 4915: "Cor Caroli", 4916: "Taiyi", 4932: "Vindemiatrix", 4968: "Diadem", 5054: "Mizar", 5056: "Spica", 5062: "Alcor", 5107: "Heze", 5191: "Alkaid", 5235: "Muphrid", 5267: "Hadar", 5288: "Menkent", 5291: "Thuban", 5315: "Kang", 5338: "Syrma", 5340: "Arcturus", 5351: "Xuange", 5359: "Khambalia", 5409: "Elgafar", 5435: "Seginus", 5459: "Rigil Kentaurus", 5460: "Toliman", 5469: "Men", 5506: "Izar", 5531: "Zubenelgenubi", 5533: "Merga", 5563: "Kochab", 5602: "Nekkar", 5603: "Brachium", 5685: "Zubeneschamali", 5733: "Alkalurops", 5735: "Pherkad", 5744: "Edasich", 5747: "Nusakan", 5787: "Zubenelhakrabi", 5793: "Alphecca", 5854: "Unukalhai", 5879: "Gudja", 5928: "Iklil", 5944: "Fang", 5953: "Dschubba", 5984: "Acrab", 6008: "Marsic", 6027: "Jabbah", 6056: "Yed Prior", 6075: "Yed Posterior", 6084: "Alniyat", 6117: "Cujam", 6132: "Athebyne", 6134: "Antares", 6148: "Kornephoros", 6149: "Marfik", 6165: "Paikauhale", 6212: "Rutilicus", 6217: "Atria", 6241: "Larawag", 6247: "Xamidimura", 6252: "Pipirima", 6370: "Alrakis", 6378: "Sabik", 6396: "Aldhibah", 6402: "Guniibuu", 6406: "Rasalgethi", 6410: "Sarin", 6508: "Lesath", 6526: "Maasym", 6527: "Shaula", 6536: "Rastaban", 6553: "Sargas", 6556: "Rasalhague", 6585: "Cervantes", 6603: "Cebalrai", 6618: "Alruba", 6630: "Fuyue", 6636: "Dziban", 6688: "Grumium", 6705: "Eltanin", 6746: "Alnasl", 6789: "Yildun", 6812: "Polis", 6859: "Kaus Media", 6879: "Kaus Australis", 6913: "Kaus Borealis", 6945: "Fafnir", 7001: "Vega", 7106: "Sheliak", 7116: "Ainalrami", 7121: "Nunki", 7141: "Alya", 7178: "Sulafat", 7194: "Ascella", 7228: "Polaris Australis", 7235: "Okab", 7254: "Meridiana", 7264: "Albaldah", 7298: "Aladfar", 7310: "Altais", 7337: "Arkab Prior", 7343: "Arkab Posterior", 7348: "Rukbat", 7405: "Anser", 7417: "Albireo", 7462: "Alsafi", 7479: "Sham", 7525: "Tarazed", 7528: "Fawaris", 7557: "Altair", 7595: "Libertas", 7597: "Terebellum", 7602: "Alshain", 7754: "Algedi", 7773: "Alshat", 7776: "Dabih", 7790: "Peacock", 7796: "Sadr", 7852: "Aldulfin", 7882: "Rotanev", 7906: "Sualocin", 7924: "Deneb", 7949: "Aljanah", 7950: "Albali", 8030: "Musica", 8131: "Kitalpha", 8162: "Alderamin", 8232: "Sadalsuud", 8238: "Alfirk", 8264: "Bunda", 8278: "Nashira", 8301: "Azelfafage", 8308: "Enif", 8322: "Deneb Algedi", 8353: "Aldhanab", 8414: "Sadalmelik", 8417: "Kurhah", 8425: "Alnair", 8450: "Biham", 8499: "Ancha", 8518: "Sadachbia", 8610: "Situla", 8634: "Homam", 8636: "Tiaki", 8650: "Matar", 8684: "Sadalbari", 8709: "Skat", 8728: "Fomalhaut", 8729: "Helvetios", 8773: "Fumalsamakah", 8775: "Scheat", 8781: "Markab", 8880: "Salm", 8905: "Alkarab", 8930: "Veritate", 8974: "Errai" };
@@ -0,0 +1,144 @@
1
+ import type { SkyPoint } from "./projection.ts";
2
+ export type { SkyPoint };
3
+ /**
4
+ * A point in galactic coordinates, in degrees.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import type { GalacticPoint } from "@johnmorrisdotca/hoshi-stars/milky-way";
9
+ *
10
+ * const centre: GalacticPoint = { longitude: 0, latitude: 0 };
11
+ * console.log(centre.longitude);
12
+ * ```
13
+ */
14
+ export interface GalacticPoint {
15
+ /** Galactic longitude, 0 (toward the Galactic centre in Sagittarius) up to but not including 360. */
16
+ longitude: number;
17
+ /** Galactic latitude, -90 to 90: 0 is the plane of the Milky Way. */
18
+ latitude: number;
19
+ }
20
+ /**
21
+ * A ribbon of the Milky Way at one brightness level: two chains of sky points of the same length, the upper edge and the lower, each pair at the same galactic longitude. Draw the ribbon as
22
+ * the polygon `upper` forward then `lower` backward. A strip stops where the band splits or ends (a dust lane, the end of a bright patch), so one level is several strips.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { milkyWayBands, type MilkyWayStrip } from "@johnmorrisdotca/hoshi-stars/milky-way";
27
+ *
28
+ * const strip: MilkyWayStrip = milkyWayBands()[0]!.strips[0]!;
29
+ * console.log(strip.upper.length === strip.lower.length);
30
+ * ```
31
+ */
32
+ export interface MilkyWayStrip {
33
+ /** The edge toward the galactic north, from low longitude to high. */
34
+ upper: SkyPoint[];
35
+ /** The edge toward the galactic south, at the same longitudes as `upper`. */
36
+ lower: SkyPoint[];
37
+ }
38
+ /**
39
+ * Everywhere the Milky Way is brighter than one level.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { milkyWayBands, type MilkyWayBand } from "@johnmorrisdotca/hoshi-stars/milky-way";
44
+ *
45
+ * const band: MilkyWayBand = milkyWayBands([0.5])[0]!;
46
+ * console.log(band.level, band.strips.length);
47
+ * ```
48
+ */
49
+ export interface MilkyWayBand {
50
+ /** The level, 0 (dark sky) to 1 (the brightest part of the core), as `milkyWayBrightness` gives it. */
51
+ level: number;
52
+ /** The ribbons where the brightness is above the level. */
53
+ strips: MilkyWayStrip[];
54
+ }
55
+ /**
56
+ * Where to cut the bands, and how finely.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { milkyWayBands, type MilkyWayBandsOptions } from "@johnmorrisdotca/hoshi-stars/milky-way";
61
+ *
62
+ * const options: MilkyWayBandsOptions = { step: 2 };
63
+ * console.log(milkyWayBands([0.3, 0.6], options).length);
64
+ * ```
65
+ */
66
+ export interface MilkyWayBandsOptions {
67
+ /** Degrees of galactic longitude between points along a strip; a multiple of the grid's 0.5, default 1. */
68
+ step?: number;
69
+ }
70
+ /**
71
+ * The galactic longitude and latitude of a point of the sky (J2000, the IAU's galactic frame).
72
+ *
73
+ * @param point - A right ascension and declination in degrees.
74
+ * @returns Longitude 0 up to but not including 360, latitude -90 to 90.
75
+ * @throws TypeError if the right ascension or declination is not a finite number.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * import { toGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
80
+ *
81
+ * // Sagittarius A*, the centre of the Galaxy, is at the origin
82
+ * console.log(toGalactic({ rightAscension: 266.4168, declination: -29.0078 })); // about { longitude: 0, latitude: 0 }
83
+ * ```
84
+ */
85
+ export declare function toGalactic(point: SkyPoint): GalacticPoint;
86
+ /**
87
+ * The right ascension and declination (J2000) of a point given in galactic coordinates.
88
+ *
89
+ * @param point - A galactic longitude and latitude in degrees.
90
+ * @returns Right ascension 0 up to but not including 360, declination -90 to 90.
91
+ * @throws TypeError if the longitude or latitude is not a finite number.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * import { fromGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
96
+ *
97
+ * console.log(fromGalactic({ longitude: 0, latitude: 0 })); // about { rightAscension: 266.4, declination: -28.9 }
98
+ * ```
99
+ */
100
+ export declare function fromGalactic(point: GalacticPoint): SkyPoint;
101
+ /**
102
+ * How bright the Milky Way is toward a point, as a display value from 0 (dark sky) to 1 (the brightest part of the core, in Sagittarius). It follows the band along the galactic equator, is brightest
103
+ * toward the Galactic centre, and is dimmer where the dust lanes cross it (the Great Rift, the Coalsack, the Cygnus Rift). The grid is 0.5 degrees on a side near the plane and holds thirty-two levels, so
104
+ * it is a smooth map for shading a chart or a texture, not a measurement; beyond 30 degrees of the plane it is 0. The values are already shaped for the eye (a gamma of about 0.45), so use them as a pixel's
105
+ * brightness directly.
106
+ *
107
+ * @param point - A right ascension and declination in degrees (J2000).
108
+ * @returns A number from 0 to 1.
109
+ * @throws TypeError if the right ascension or declination is not a finite number.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
114
+ *
115
+ * const sagittarius = milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 });
116
+ * const pole = milkyWayBrightness({ rightAscension: 192.9, declination: 27.1 });
117
+ * console.log(sagittarius > pole); // true
118
+ * ```
119
+ */
120
+ export declare function milkyWayBrightness(point: SkyPoint): number;
121
+ /**
122
+ * The Milky Way cut at some brightness levels, as ribbons of sky points for drawing soft bands (a polygon per strip, filled with a low opacity so the levels build up). Each strip runs along
123
+ * the galactic equator; a dust lane that splits the band ends the strips on either side of it, so the lane shows as a gap. The points are in right ascension and declination, ready for
124
+ * `project` from `@johnmorrisdotca/hoshi-stars/projection`; a strip crossing a map's seam or the far side is the caller's to cut (compare the longitudes of neighbouring points).
125
+ *
126
+ * @param levels - Levels from 0 to 1, as `milkyWayBrightness` measures them. Default `[0.2, 0.42, 0.68]`: the glow, the band and the core. Each must be a number above 0 and below 1.
127
+ * @param options - `step`: degrees of longitude between points along a strip (a multiple of 0.5, default 1).
128
+ * @returns One band per level, in the order given.
129
+ * @throws RangeError if a level is not between 0 and 1 (exclusive) or `step` is not a positive multiple of 0.5. TypeError if a level is not a number.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * import { milkyWayBands } from "@johnmorrisdotca/hoshi-stars/milky-way";
134
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
135
+ *
136
+ * for (const band of milkyWayBands()) {
137
+ * for (const strip of band.strips) {
138
+ * const polygon = [...strip.upper, ...strip.lower.slice().reverse()].map((p) => project("hammer", p, { centre: { rightAscension: 0, declination: 0 } }));
139
+ * console.log(band.level, polygon.length);
140
+ * }
141
+ * }
142
+ * ```
143
+ */
144
+ export declare function milkyWayBands(levels?: readonly number[], options?: MilkyWayBandsOptions): MilkyWayBand[];
@@ -0,0 +1,242 @@
1
+ // The Milky Way as a small brightness grid in galactic coordinates (the milky-way tier, `@johnmorrisdotca/hoshi-stars/milky-way`): about 5 kB of data, made by
2
+ // scripts/make-milky-way-data.py from SAO star counts, the IRAS 100 micron dust map and a bulge of our own (see NOTICE.md). Pure: no DOM, no clock, no state beyond the unpacked grid.
3
+ import { MILKY_WAY_COLUMNS, MILKY_WAY_LATITUDE, MILKY_WAY_LEVELS, MILKY_WAY_PACKED, MILKY_WAY_ROWS } from "./data/milky-way.js";
4
+ const RAD = Math.PI / 180;
5
+ const DEG = 180 / Math.PI;
6
+ // The J2000 galactic frame: the north galactic pole's right ascension and declination, and the galactic longitude of the north celestial pole (IAU 1958 as set in ICRS by the Hipparcos catalogue's documentation, 192.85948, 27.12825 and 122.93192 degrees).
7
+ const POLE_RA = 192.85948 * RAD;
8
+ const POLE_DEC = 27.12825 * RAD;
9
+ const POLE_L = 122.93192 * RAD;
10
+ const COLUMNS = MILKY_WAY_COLUMNS;
11
+ const ROWS = MILKY_WAY_ROWS;
12
+ const STEP_L = 360 / COLUMNS;
13
+ const STEP_B = (2 * MILKY_WAY_LATITUDE) / ROWS;
14
+ let grid;
15
+ function unpack() {
16
+ if (grid === undefined) {
17
+ const text = atob(MILKY_WAY_PACKED);
18
+ const out = new Float32Array(COLUMNS * ROWS);
19
+ let at = 0;
20
+ for (let i = 0; i < text.length; i++) {
21
+ const byte = text.charCodeAt(i);
22
+ const value = (byte >> 3) / MILKY_WAY_LEVELS;
23
+ for (let n = (byte & 7) + 1; n > 0; n--)
24
+ out[at++] = value;
25
+ }
26
+ grid = out;
27
+ }
28
+ return grid;
29
+ }
30
+ /**
31
+ * The galactic longitude and latitude of a point of the sky (J2000, the IAU's galactic frame).
32
+ *
33
+ * @param point - A right ascension and declination in degrees.
34
+ * @returns Longitude 0 up to but not including 360, latitude -90 to 90.
35
+ * @throws TypeError if the right ascension or declination is not a finite number.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { toGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
40
+ *
41
+ * // Sagittarius A*, the centre of the Galaxy, is at the origin
42
+ * console.log(toGalactic({ rightAscension: 266.4168, declination: -29.0078 })); // about { longitude: 0, latitude: 0 }
43
+ * ```
44
+ */
45
+ export function toGalactic(point) {
46
+ finite("rightAscension", point?.rightAscension);
47
+ finite("declination", point?.declination);
48
+ const ra = point.rightAscension * RAD;
49
+ const dec = point.declination * RAD;
50
+ const sinB = Math.sin(dec) * Math.sin(POLE_DEC) + Math.cos(dec) * Math.cos(POLE_DEC) * Math.cos(ra - POLE_RA);
51
+ const y = Math.cos(dec) * Math.sin(ra - POLE_RA);
52
+ const x = Math.sin(dec) * Math.cos(POLE_DEC) - Math.cos(dec) * Math.sin(POLE_DEC) * Math.cos(ra - POLE_RA);
53
+ const longitude = (((POLE_L - Math.atan2(y, x)) * DEG) % 360 + 360) % 360;
54
+ return { longitude: longitude >= 360 ? 0 : longitude, latitude: Math.asin(Math.max(-1, Math.min(1, sinB))) * DEG };
55
+ }
56
+ /**
57
+ * The right ascension and declination (J2000) of a point given in galactic coordinates.
58
+ *
59
+ * @param point - A galactic longitude and latitude in degrees.
60
+ * @returns Right ascension 0 up to but not including 360, declination -90 to 90.
61
+ * @throws TypeError if the longitude or latitude is not a finite number.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * import { fromGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
66
+ *
67
+ * console.log(fromGalactic({ longitude: 0, latitude: 0 })); // about { rightAscension: 266.4, declination: -28.9 }
68
+ * ```
69
+ */
70
+ export function fromGalactic(point) {
71
+ finite("longitude", point?.longitude);
72
+ finite("latitude", point?.latitude);
73
+ const b = point.latitude * RAD;
74
+ const dl = POLE_L - point.longitude * RAD;
75
+ const sinDec = Math.sin(b) * Math.sin(POLE_DEC) + Math.cos(b) * Math.cos(POLE_DEC) * Math.cos(dl);
76
+ const y = Math.cos(b) * Math.sin(dl);
77
+ const x = Math.sin(b) * Math.cos(POLE_DEC) - Math.cos(b) * Math.sin(POLE_DEC) * Math.cos(dl);
78
+ const rightAscension = ((POLE_RA + Math.atan2(y, x)) * DEG % 360 + 360) % 360;
79
+ return { rightAscension: rightAscension >= 360 ? 0 : rightAscension, declination: Math.asin(Math.max(-1, Math.min(1, sinDec))) * DEG };
80
+ }
81
+ function finite(name, value) {
82
+ if (typeof value !== "number" || !Number.isFinite(value))
83
+ throw new TypeError(`${name} must be a finite number, got ${String(value)}`);
84
+ }
85
+ function cell(column, row) {
86
+ return unpack()[(((column % COLUMNS) + COLUMNS) % COLUMNS) + Math.max(0, Math.min(ROWS - 1, row)) * COLUMNS];
87
+ }
88
+ function brightnessAt(longitude, latitude) {
89
+ if (latitude <= -MILKY_WAY_LATITUDE || latitude >= MILKY_WAY_LATITUDE)
90
+ return 0;
91
+ const x = longitude / STEP_L - 0.5;
92
+ const y = (latitude + MILKY_WAY_LATITUDE) / STEP_B - 0.5;
93
+ const c = Math.floor(x);
94
+ const r = Math.floor(y);
95
+ const fx = x - c;
96
+ const fy = y - r;
97
+ const top = cell(c, r + 1) * (1 - fx) + cell(c + 1, r + 1) * fx;
98
+ const bottom = cell(c, r) * (1 - fx) + cell(c + 1, r) * fx;
99
+ return bottom * (1 - fy) + top * fy;
100
+ }
101
+ /**
102
+ * How bright the Milky Way is toward a point, as a display value from 0 (dark sky) to 1 (the brightest part of the core, in Sagittarius). It follows the band along the galactic equator, is brightest
103
+ * toward the Galactic centre, and is dimmer where the dust lanes cross it (the Great Rift, the Coalsack, the Cygnus Rift). The grid is 0.5 degrees on a side near the plane and holds thirty-two levels, so
104
+ * it is a smooth map for shading a chart or a texture, not a measurement; beyond 30 degrees of the plane it is 0. The values are already shaped for the eye (a gamma of about 0.45), so use them as a pixel's
105
+ * brightness directly.
106
+ *
107
+ * @param point - A right ascension and declination in degrees (J2000).
108
+ * @returns A number from 0 to 1.
109
+ * @throws TypeError if the right ascension or declination is not a finite number.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
114
+ *
115
+ * const sagittarius = milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 });
116
+ * const pole = milkyWayBrightness({ rightAscension: 192.9, declination: 27.1 });
117
+ * console.log(sagittarius > pole); // true
118
+ * ```
119
+ */
120
+ export function milkyWayBrightness(point) {
121
+ const g = toGalactic(point);
122
+ return brightnessAt(g.longitude, g.latitude);
123
+ }
124
+ /** The latitudes where one column of the grid is above a level, as spans, with the crossing between two rows found by a straight line. */
125
+ function spans(column, level) {
126
+ const out = [];
127
+ let start;
128
+ const latitude = (row) => -MILKY_WAY_LATITUDE + (row + 0.5) * STEP_B;
129
+ for (let row = 0; row < ROWS; row++) {
130
+ const v = cell(column, row);
131
+ const above = v > level;
132
+ if (above && start === undefined) {
133
+ if (row === 0)
134
+ start = -MILKY_WAY_LATITUDE;
135
+ else {
136
+ const u = cell(column, row - 1);
137
+ start = latitude(row - 1) + ((level - u) / (v - u)) * STEP_B;
138
+ }
139
+ }
140
+ else if (!above && start !== undefined) {
141
+ const u = cell(column, row - 1);
142
+ out.push({ low: start, high: latitude(row - 1) + ((u - level) / (u - v)) * STEP_B });
143
+ start = undefined;
144
+ }
145
+ }
146
+ if (start !== undefined)
147
+ out.push({ low: start, high: MILKY_WAY_LATITUDE });
148
+ return out;
149
+ }
150
+ const overlaps = (a, b) => a.low < b.high && b.low < a.high;
151
+ /**
152
+ * The Milky Way cut at some brightness levels, as ribbons of sky points for drawing soft bands (a polygon per strip, filled with a low opacity so the levels build up). Each strip runs along
153
+ * the galactic equator; a dust lane that splits the band ends the strips on either side of it, so the lane shows as a gap. The points are in right ascension and declination, ready for
154
+ * `project` from `@johnmorrisdotca/hoshi-stars/projection`; a strip crossing a map's seam or the far side is the caller's to cut (compare the longitudes of neighbouring points).
155
+ *
156
+ * @param levels - Levels from 0 to 1, as `milkyWayBrightness` measures them. Default `[0.2, 0.42, 0.68]`: the glow, the band and the core. Each must be a number above 0 and below 1.
157
+ * @param options - `step`: degrees of longitude between points along a strip (a multiple of 0.5, default 1).
158
+ * @returns One band per level, in the order given.
159
+ * @throws RangeError if a level is not between 0 and 1 (exclusive) or `step` is not a positive multiple of 0.5. TypeError if a level is not a number.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * import { milkyWayBands } from "@johnmorrisdotca/hoshi-stars/milky-way";
164
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
165
+ *
166
+ * for (const band of milkyWayBands()) {
167
+ * for (const strip of band.strips) {
168
+ * const polygon = [...strip.upper, ...strip.lower.slice().reverse()].map((p) => project("hammer", p, { centre: { rightAscension: 0, declination: 0 } }));
169
+ * console.log(band.level, polygon.length);
170
+ * }
171
+ * }
172
+ * ```
173
+ */
174
+ export function milkyWayBands(levels = [0.2, 0.42, 0.68], options = {}) {
175
+ const step = options.step ?? 1;
176
+ if (typeof step !== "number" || !(step >= STEP_L) || Math.abs(step / STEP_L - Math.round(step / STEP_L)) > 1e-9)
177
+ throw new RangeError(`step must be a positive multiple of ${STEP_L}, got ${String(step)}`);
178
+ const stride = Math.round(step / STEP_L);
179
+ for (const level of levels) {
180
+ finite("level", level);
181
+ if (!(level > 0 && level < 1))
182
+ throw new RangeError(`a level must be above 0 and below 1, got ${level}`);
183
+ }
184
+ return levels.map((level) => ({ level, strips: stripsAt(level, stride) }));
185
+ }
186
+ function stripsAt(level, stride) {
187
+ const count = COLUMNS / stride;
188
+ const longitude = (k) => (k * stride + 0.5) * STEP_L;
189
+ // columns 0 to count: the last is the first again, so that the band is cut once, at longitude 0
190
+ const columns = Array.from({ length: count + 1 }, (_, k) => spans((k % count) * stride, level));
191
+ const forward = columns.map((c, k) => c.map((a) => (k < count ? columns[k + 1].flatMap((b, i) => (overlaps(a, b) ? [i] : [])) : [])));
192
+ const backward = columns.map((c, k) => c.map((b) => (k > 0 ? columns[k - 1].flatMap((a, i) => (overlaps(a, b) ? [i] : [])) : [])));
193
+ const joined = (k, a) => {
194
+ const next = forward[k][a];
195
+ return next.length === 1 && backward[k + 1][next[0]].length === 1 ? next[0] : undefined;
196
+ };
197
+ const strips = [];
198
+ const make = (members, pinchStart, pinchEnd) => {
199
+ const upper = [];
200
+ const lower = [];
201
+ const half = (stride * STEP_L) / 2;
202
+ const first = members[0];
203
+ const last = members[members.length - 1];
204
+ const mid = (s) => (s.low + s.high) / 2;
205
+ if (pinchStart) {
206
+ const p = fromGalactic({ longitude: longitude(first[0]) - half, latitude: mid(first[1]) });
207
+ upper.push(p);
208
+ lower.push(p);
209
+ }
210
+ for (const [k, s] of members) {
211
+ upper.push(fromGalactic({ longitude: longitude(k), latitude: s.high }));
212
+ lower.push(fromGalactic({ longitude: longitude(k), latitude: s.low }));
213
+ }
214
+ if (pinchEnd) {
215
+ const p = fromGalactic({ longitude: longitude(last[0]) + half, latitude: mid(last[1]) });
216
+ upper.push(p);
217
+ lower.push(p);
218
+ }
219
+ strips.push({ upper, lower });
220
+ };
221
+ for (let k = 0; k <= count; k++) {
222
+ for (let a = 0; a < columns[k].length; a++) {
223
+ const before = backward[k][a];
224
+ if (k > 0 && before.length === 1 && joined(k - 1, before[0]) === a)
225
+ continue;
226
+ const members = [[k, columns[k][a]]];
227
+ let ci = k;
228
+ let ai = a;
229
+ for (let next = joined(ci, ai); next !== undefined; next = joined(ci, ai)) {
230
+ ci += 1;
231
+ ai = next;
232
+ members.push([ci, columns[ci][ai]]);
233
+ }
234
+ make(members, k > 0 && before.length === 0, ci < count && forward[ci][ai].length === 0);
235
+ // where the band branches or merges, the pairs that are not joined get a strip of their own
236
+ for (const d of forward[ci][ai])
237
+ if (joined(ci, ai) !== d)
238
+ make([[ci, columns[ci][ai]], [ci + 1, columns[ci + 1][d]]], false, false);
239
+ }
240
+ }
241
+ return strips;
242
+ }
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@johnmorrisdotca/hoshi-stars",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Hoshi 星: stars you can see without a telescope, as data and as sky charts. 5,080 stars with names, distance and colour, the 88 constellations with lines and boundaries, the Messier objects and seven map projections. Typed, no dependencies.",
5
5
  "keywords": [
6
6
  "stars",
7
+ "milky-way",
7
8
  "star-catalog",
8
9
  "bright-star-catalogue",
9
10
  "yale",
@@ -17,7 +18,40 @@
17
18
  "javascript",
18
19
  "typescript",
19
20
  "zero-dependencies",
20
- "itsutsu"
21
+ "itsutsu",
22
+ "spaceprogramx",
23
+ "spx",
24
+ "space",
25
+ "star",
26
+ "star-chart",
27
+ "star-map",
28
+ "starmap",
29
+ "sky-chart",
30
+ "sky-map",
31
+ "night-sky",
32
+ "sky",
33
+ "planetarium",
34
+ "celestial",
35
+ "celestial-sphere",
36
+ "astrometry",
37
+ "cartography",
38
+ "visualization",
39
+ "map-projection",
40
+ "stereographic",
41
+ "svg",
42
+ "constellation",
43
+ "star-names",
44
+ "galaxies",
45
+ "nebulae",
46
+ "star-clusters",
47
+ "observer",
48
+ "altitude",
49
+ "azimuth",
50
+ "horizon",
51
+ "sidereal-time",
52
+ "precession",
53
+ "japanese",
54
+ "katakana"
21
55
  ],
22
56
  "homepage": "https://johnmorrisdotca.github.io/hoshi-stars/",
23
57
  "repository": {
@@ -70,6 +104,11 @@
70
104
  "import": "./dist/projection.js",
71
105
  "default": "./dist/projection.js"
72
106
  },
107
+ "./milky-way": {
108
+ "types": "./dist/milky-way.d.ts",
109
+ "import": "./dist/milky-way.js",
110
+ "default": "./dist/milky-way.js"
111
+ },
73
112
  "./sky": {
74
113
  "types": "./dist/sky.d.ts",
75
114
  "import": "./dist/sky.js",