@johnmorrisdotca/hoshi-stars 0.0.0-stage → 0.2.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +146 -0
  4. package/README.md +337 -2
  5. package/dist/boundaries.d.ts +95 -0
  6. package/dist/boundaries.js +195 -0
  7. package/dist/constellations.d.ts +72 -0
  8. package/dist/constellations.js +105 -0
  9. package/dist/data/boundaries.d.ts +4 -0
  10. package/dist/data/boundaries.js +449 -0
  11. package/dist/data/constellations.d.ts +1 -0
  12. package/dist/data/constellations.js +91 -0
  13. package/dist/data/lines.d.ts +2 -0
  14. package/dist/data/lines.js +92 -0
  15. package/dist/data/messier.d.ts +2 -0
  16. package/dist/data/messier.js +116 -0
  17. package/dist/data/milky-way.d.ts +5 -0
  18. package/dist/data/milky-way.js +7 -0
  19. package/dist/data/ngc-ic.d.ts +2 -0
  20. package/dist/data/ngc-ic.js +11794 -0
  21. package/dist/data/star-names-ja.d.ts +2 -0
  22. package/dist/data/star-names-ja.js +4 -0
  23. package/dist/data/stars.d.ts +4 -0
  24. package/dist/data/stars.js +5088 -0
  25. package/dist/deep-sky-core.d.ts +123 -0
  26. package/dist/deep-sky-core.js +139 -0
  27. package/dist/deep-sky-ngc-ic.d.ts +34 -0
  28. package/dist/deep-sky-ngc-ic.js +43 -0
  29. package/dist/deep-sky.d.ts +49 -0
  30. package/dist/deep-sky.js +59 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +2 -0
  33. package/dist/lines.d.ts +49 -0
  34. package/dist/lines.js +64 -0
  35. package/dist/milky-way.d.ts +144 -0
  36. package/dist/milky-way.js +242 -0
  37. package/dist/projection.d.ts +127 -0
  38. package/dist/projection.js +284 -0
  39. package/dist/sky.d.ts +202 -0
  40. package/dist/sky.js +283 -0
  41. package/dist/stars.d.ts +162 -0
  42. package/dist/stars.js +195 -0
  43. package/dist/time-scale.d.ts +14 -0
  44. package/dist/time-scale.js +71 -0
  45. package/dist/when.d.ts +16 -0
  46. package/dist/when.js +18 -0
  47. package/package.json +184 -4
@@ -0,0 +1,95 @@
1
+ import { type Constellation } from "./constellations.ts";
2
+ import { type When } from "./when.ts";
3
+ /**
4
+ * The boundary of one constellation, as lines to draw.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { boundaryOf, type Boundary } from "@johnmorrisdotca/hoshi-stars/boundaries";
9
+ *
10
+ * const crux: Boundary = boundaryOf("Cru");
11
+ * console.log(crux.constellation.name, crux.outlines.length, crux.outlines[0]!.length);
12
+ * ```
13
+ */
14
+ export interface Boundary {
15
+ /** The constellation the boundary encloses. */
16
+ constellation: Constellation;
17
+ /** The closed outlines, each a list of points (degrees, J2000) with the first point repeated as the last. Most constellations have one; Serpens has two, its head and its tail. */
18
+ outlines: Array<Array<{
19
+ rightAscension: number;
20
+ declination: number;
21
+ }>>;
22
+ }
23
+ /**
24
+ * The constellation a point on the sky is in. The position is precessed to the equator and equinox of B1875.0, where the IAU's boundaries (Delporte 1930) are defined, and looked up in
25
+ * N. G. Roman's table of them (1987, PASP 99, 695). Coordinates are J2000, the frame of this package's stars, unless `when` says the position is of date. The constellations tile the
26
+ * sky, so every point is in exactly one; Serpens is one constellation (`Ser`) although it is in two pieces.
27
+ *
28
+ * A point within a few arc-seconds of a boundary can fall either side of it: Roman's table has the boundaries to a hundredth of a second of time and the precession here is IAU 1976, not the
29
+ * Newcomb-based one of 1930.
30
+ *
31
+ * @param position - `rightAscension` in degrees (any real number, taken modulo 360) and `declination` in degrees, -90 to 90.
32
+ * @param when - The equinox the coordinates are on: a `Date` or milliseconds since 1970 (UTC), for a position of date such as a telescope's. J2000 when left out.
33
+ * @returns The shared, frozen constellation.
34
+ * @throws TypeError if `position` is not an object with numeric `rightAscension` and `declination`, or `when` is not a `Date` or number. RangeError if a coordinate is not finite or the
35
+ * declination is outside -90 to 90, or `when` is not a valid moment.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { starByName } from "@johnmorrisdotca/hoshi-stars";
40
+ * import { constellationAt } from "@johnmorrisdotca/hoshi-stars/boundaries";
41
+ *
42
+ * console.log(constellationAt(starByName("Betelgeuse")!).name); // Orion
43
+ * console.log(constellationAt({ rightAscension: 0, declination: 90 }).abbreviation); // UMi
44
+ * console.log(constellationAt({ rightAscension: 83.8, declination: -5.4 }, Date.UTC(2026, 10, 8)).english);
45
+ * ```
46
+ */
47
+ export declare function constellationAt(position: {
48
+ rightAscension: number;
49
+ declination: number;
50
+ }, when?: When): Constellation;
51
+ /**
52
+ * The boundary of one constellation as closed outlines in J2000 degrees, ready to draw. The edges of the IAU boundaries run along lines of constant right ascension and constant declination
53
+ * on B1875.0; after precession those lines are slightly tilted curves, so each edge is cut into pieces no longer than `step` (1 degree of arc by default, measured along the edge: a
54
+ * parallel of declination is shorter than its span in right ascension by cos(declination)) and every piece end is precessed. Joining the points with straight lines then follows the
55
+ * curve to well under a pixel on a chart a few hundred pixels across. A constellation that holds a celestial pole (Ursa Minor, Octans) has one outline that goes round the pole.
56
+ *
57
+ * A point's `rightAscension` runs from 0 up to 360, so an outline that crosses 0 jumps from near 360 to near 0: project each point, then draw, rather than drawing degrees directly.
58
+ *
59
+ * @param text - The constellation, as the IAU abbreviation (`Ori`) or any other name `constellation` accepts.
60
+ * @param options - `step`: the longest piece of an edge, in degrees from 0.01 to 90 (default 1).
61
+ * @returns A new boundary; its points are new objects each call.
62
+ * @throws TypeError if `text` is not a string or `step` not a number. RangeError if `text` is not one of the 88 constellations or `step` is out of range.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { boundaryOf } from "@johnmorrisdotca/hoshi-stars/boundaries";
67
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
68
+ *
69
+ * const orion = boundaryOf("Orion");
70
+ * const path = orion.outlines[0]!.map((p) => project("stereographic", p, { centre: { rightAscension: 83.8, declination: 0 }, scale: 300 })!);
71
+ * console.log(path.length, "points");
72
+ * ```
73
+ */
74
+ export declare function boundaryOf(text: string, options?: {
75
+ step?: number;
76
+ }): Boundary;
77
+ /**
78
+ * The boundaries of all 88 constellations, alphabetical by Latin name like `constellations()`. Together the outlines tile the sky: each edge is shared by two constellations, and both
79
+ * give the same points along it (to the arc-second the points are the same place).
80
+ *
81
+ * @param options - `step`: the longest piece of an edge, in degrees from 0.01 to 90 (default 1). At 1 degree the whole sky is about 9,000 points.
82
+ * @returns New boundaries.
83
+ * @throws TypeError if `step` is not a number. RangeError if it is out of range.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * import { boundaries } from "@johnmorrisdotca/hoshi-stars/boundaries";
88
+ *
89
+ * const all = boundaries();
90
+ * console.log(all.length, all.reduce((n, b) => n + b.outlines.reduce((m, o) => m + o.length, 0), 0), "points");
91
+ * ```
92
+ */
93
+ export declare function boundaries(options?: {
94
+ step?: number;
95
+ }): Boundary[];
@@ -0,0 +1,195 @@
1
+ // Which of the 88 constellations a point on the sky is in, and the boundary lines for drawing them.
2
+ // The boundaries tier (`@johnmorrisdotca/hoshi-stars/boundaries`): about 7 kB of data gzipped, apart from the constellations table (about 2 kB) and nothing else. Pure: no DOM, no clock, no state beyond the parsed table.
3
+ // The boundaries are the IAU's, Delporte (1930) as N. G. Roman (1987, PASP 99, 695) put them into a table on the equator and equinox of B1875.0, so a position is first precessed to B1875.0
4
+ // with the rigorous angles of the IAU 1976 system as J. Meeus gives them (Astronomical Algorithms, 2nd ed., chapter 21), then looked up in Roman's table.
5
+ import { BOUNDARY_RINGS, BOUNDARY_ROWS } from "./data/boundaries.js";
6
+ import { constellation, constellations } from "./constellations.js";
7
+ import { J2000_MS, moment } from "./when.js";
8
+ const DEGREES = Math.PI / 180;
9
+ const ARCSECOND = DEGREES / 3600;
10
+ const JULIAN_CENTURY_MS = 36_525 * 86_400_000;
11
+ // Julian centuries from J2000.0 to B1875.0, which is JD 2405889.25855 (Meeus chapter 21: JD = 2415020.3135 + 365.242198781 (B - 1900)).
12
+ const B1875_CENTURIES = (2405889.25855 - 2451545) / 36_525;
13
+ function multiply(a, b) {
14
+ const out = [];
15
+ for (let row = 0; row < 3; row++)
16
+ for (let col = 0; col < 3; col++)
17
+ out.push(a[row * 3] * b[col] + a[row * 3 + 1] * b[3 + col] + a[row * 3 + 2] * b[6 + col]);
18
+ return out;
19
+ }
20
+ /** The rotation that takes a direction on the equator and equinox at one epoch to the equator and equinox at another (both in Julian centuries from J2000.0): Meeus's rigorous precession, IAU 1976. */
21
+ function precession(from, to) {
22
+ const t = to - from;
23
+ const base = (2306.2181 + 1.39656 * from - 0.000139 * from * from) * t;
24
+ const zeta = (base + (0.30188 - 0.000344 * from) * t * t + 0.017998 * t ** 3) * ARCSECOND;
25
+ const z = (base + (1.09468 + 0.000066 * from) * t * t + 0.018203 * t ** 3) * ARCSECOND;
26
+ const theta = ((2004.3109 - 0.8533 * from - 0.000217 * from * from) * t - (0.42665 + 0.000217 * from) * t * t - 0.041833 * t ** 3) * ARCSECOND;
27
+ const [cz, sz, cd, sd, ct, st] = [Math.cos(zeta), Math.sin(zeta), Math.cos(z), Math.sin(z), Math.cos(theta), Math.sin(theta)];
28
+ return multiply([cd, -sd, 0, sd, cd, 0, 0, 0, 1], multiply([ct, 0, -st, 0, 1, 0, st, 0, ct], [cz, -sz, 0, sz, cz, 0, 0, 0, 1]));
29
+ }
30
+ function rotate(m, rightAscension, declination) {
31
+ const ra = rightAscension * DEGREES;
32
+ const dec = declination * DEGREES;
33
+ const cosine = Math.cos(dec);
34
+ const x = cosine * Math.cos(ra);
35
+ const y = cosine * Math.sin(ra);
36
+ const z = Math.sin(dec);
37
+ const nx = m[0] * x + m[1] * y + m[2] * z;
38
+ const ny = m[3] * x + m[4] * y + m[5] * z;
39
+ const nz = m[6] * x + m[7] * y + m[8] * z;
40
+ const angle = Math.atan2(ny, nx) / DEGREES;
41
+ return [angle < 0 ? angle + 360 : angle, Math.asin(Math.max(-1, Math.min(1, nz))) / DEGREES];
42
+ }
43
+ let lows = new Float64Array(0);
44
+ let highs = new Float64Array(0);
45
+ let souths = new Float64Array(0);
46
+ let owners = [];
47
+ const rings = new Map();
48
+ let toB1875 = [];
49
+ let fromB1875 = [];
50
+ function load() {
51
+ if (owners.length > 0)
52
+ return;
53
+ const byAbbreviation = new Map(constellations().map((c) => [c.abbreviation, c]));
54
+ const rows = BOUNDARY_ROWS.split("\n");
55
+ lows = new Float64Array(rows.length);
56
+ highs = new Float64Array(rows.length);
57
+ souths = new Float64Array(rows.length);
58
+ const found = [];
59
+ rows.forEach((row, index) => {
60
+ const [low, high, south, abbreviation] = row.split(" ");
61
+ lows[index] = Number(low);
62
+ highs[index] = Number(high);
63
+ souths[index] = Number(south);
64
+ found.push(byAbbreviation.get(abbreviation));
65
+ });
66
+ for (const line of BOUNDARY_RINGS.split("\n")) {
67
+ const [abbreviation, text] = line.split("|");
68
+ rings.set(abbreviation, text.split("/").map((ring) => ring.split(" ").map((corner) => corner.split(",").map(Number))));
69
+ }
70
+ toB1875 = precession(0, B1875_CENTURIES);
71
+ fromB1875 = [toB1875[0], toB1875[3], toB1875[6], toB1875[1], toB1875[4], toB1875[7], toB1875[2], toB1875[5], toB1875[8]];
72
+ owners = found;
73
+ }
74
+ /**
75
+ * The constellation a point on the sky is in. The position is precessed to the equator and equinox of B1875.0, where the IAU's boundaries (Delporte 1930) are defined, and looked up in
76
+ * N. G. Roman's table of them (1987, PASP 99, 695). Coordinates are J2000, the frame of this package's stars, unless `when` says the position is of date. The constellations tile the
77
+ * sky, so every point is in exactly one; Serpens is one constellation (`Ser`) although it is in two pieces.
78
+ *
79
+ * A point within a few arc-seconds of a boundary can fall either side of it: Roman's table has the boundaries to a hundredth of a second of time and the precession here is IAU 1976, not the
80
+ * Newcomb-based one of 1930.
81
+ *
82
+ * @param position - `rightAscension` in degrees (any real number, taken modulo 360) and `declination` in degrees, -90 to 90.
83
+ * @param when - The equinox the coordinates are on: a `Date` or milliseconds since 1970 (UTC), for a position of date such as a telescope's. J2000 when left out.
84
+ * @returns The shared, frozen constellation.
85
+ * @throws TypeError if `position` is not an object with numeric `rightAscension` and `declination`, or `when` is not a `Date` or number. RangeError if a coordinate is not finite or the
86
+ * declination is outside -90 to 90, or `when` is not a valid moment.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * import { starByName } from "@johnmorrisdotca/hoshi-stars";
91
+ * import { constellationAt } from "@johnmorrisdotca/hoshi-stars/boundaries";
92
+ *
93
+ * console.log(constellationAt(starByName("Betelgeuse")!).name); // Orion
94
+ * console.log(constellationAt({ rightAscension: 0, declination: 90 }).abbreviation); // UMi
95
+ * console.log(constellationAt({ rightAscension: 83.8, declination: -5.4 }, Date.UTC(2026, 10, 8)).english);
96
+ * ```
97
+ */
98
+ export function constellationAt(position, when) {
99
+ const { rightAscension, declination } = (position ?? {});
100
+ if (typeof rightAscension !== "number" || typeof declination !== "number")
101
+ throw new TypeError("position must be { rightAscension, declination } in degrees");
102
+ if (!Number.isFinite(rightAscension))
103
+ throw new RangeError(`rightAscension must be a finite number of degrees, got ${rightAscension}`);
104
+ if (!Number.isFinite(declination) || declination < -90 || declination > 90)
105
+ throw new RangeError(`declination must be from -90 to 90 degrees, got ${declination}`);
106
+ load();
107
+ const [ra, dec] = rotate(when === undefined ? toB1875 : precession((moment(when) - J2000_MS) / JULIAN_CENTURY_MS, B1875_CENTURIES), rightAscension, declination);
108
+ const hours = (ra / 15) % 24;
109
+ for (let row = 0; row < lows.length; row++)
110
+ if (dec >= souths[row] && hours >= lows[row] && hours < highs[row])
111
+ return owners[row];
112
+ throw new RangeError(`no constellation found for ${rightAscension}, ${declination}`);
113
+ }
114
+ function outline(abbreviation, step) {
115
+ return rings.get(abbreviation).map((corners) => {
116
+ const points = [];
117
+ const add = (hours, degrees) => {
118
+ const [rightAscension, declination] = rotate(fromB1875, hours * 15, degrees);
119
+ points.push({ rightAscension, declination });
120
+ };
121
+ corners.forEach(([hours, degrees], index) => {
122
+ const [nextHours, nextDegrees] = corners[(index + 1) % corners.length];
123
+ if (hours % 24 === nextHours % 24 && degrees === nextDegrees)
124
+ return;
125
+ const along = degrees === nextDegrees ? Math.abs(nextHours - hours) * 15 * Math.cos(degrees * DEGREES) : Math.abs(nextDegrees - degrees);
126
+ const pieces = Math.max(1, Math.ceil(along / step));
127
+ for (let piece = 0; piece < pieces; piece++) {
128
+ const part = piece / pieces;
129
+ add(hours + (nextHours - hours) * part, degrees + (nextDegrees - degrees) * part);
130
+ }
131
+ });
132
+ points.push({ ...points[0] });
133
+ return points;
134
+ });
135
+ }
136
+ function checkStep(options) {
137
+ const step = options?.step ?? 1;
138
+ if (typeof step !== "number")
139
+ throw new TypeError(`step must be a number of degrees, got ${typeof step}`);
140
+ if (!(step >= 0.01 && step <= 90))
141
+ throw new RangeError(`step must be from 0.01 to 90 degrees, got ${step}`);
142
+ return step;
143
+ }
144
+ /**
145
+ * The boundary of one constellation as closed outlines in J2000 degrees, ready to draw. The edges of the IAU boundaries run along lines of constant right ascension and constant declination
146
+ * on B1875.0; after precession those lines are slightly tilted curves, so each edge is cut into pieces no longer than `step` (1 degree of arc by default, measured along the edge: a
147
+ * parallel of declination is shorter than its span in right ascension by cos(declination)) and every piece end is precessed. Joining the points with straight lines then follows the
148
+ * curve to well under a pixel on a chart a few hundred pixels across. A constellation that holds a celestial pole (Ursa Minor, Octans) has one outline that goes round the pole.
149
+ *
150
+ * A point's `rightAscension` runs from 0 up to 360, so an outline that crosses 0 jumps from near 360 to near 0: project each point, then draw, rather than drawing degrees directly.
151
+ *
152
+ * @param text - The constellation, as the IAU abbreviation (`Ori`) or any other name `constellation` accepts.
153
+ * @param options - `step`: the longest piece of an edge, in degrees from 0.01 to 90 (default 1).
154
+ * @returns A new boundary; its points are new objects each call.
155
+ * @throws TypeError if `text` is not a string or `step` not a number. RangeError if `text` is not one of the 88 constellations or `step` is out of range.
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * import { boundaryOf } from "@johnmorrisdotca/hoshi-stars/boundaries";
160
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
161
+ *
162
+ * const orion = boundaryOf("Orion");
163
+ * const path = orion.outlines[0]!.map((p) => project("stereographic", p, { centre: { rightAscension: 83.8, declination: 0 }, scale: 300 })!);
164
+ * console.log(path.length, "points");
165
+ * ```
166
+ */
167
+ export function boundaryOf(text, options = {}) {
168
+ const found = constellation(text);
169
+ if (found === undefined)
170
+ throw new RangeError(`"${text}" is not one of the 88 constellations (use the IAU abbreviation such as "Ori")`);
171
+ const step = checkStep(options);
172
+ load();
173
+ return { constellation: found, outlines: outline(found.abbreviation, step) };
174
+ }
175
+ /**
176
+ * The boundaries of all 88 constellations, alphabetical by Latin name like `constellations()`. Together the outlines tile the sky: each edge is shared by two constellations, and both
177
+ * give the same points along it (to the arc-second the points are the same place).
178
+ *
179
+ * @param options - `step`: the longest piece of an edge, in degrees from 0.01 to 90 (default 1). At 1 degree the whole sky is about 9,000 points.
180
+ * @returns New boundaries.
181
+ * @throws TypeError if `step` is not a number. RangeError if it is out of range.
182
+ *
183
+ * @example
184
+ * ```ts
185
+ * import { boundaries } from "@johnmorrisdotca/hoshi-stars/boundaries";
186
+ *
187
+ * const all = boundaries();
188
+ * console.log(all.length, all.reduce((n, b) => n + b.outlines.reduce((m, o) => m + o.length, 0), 0), "points");
189
+ * ```
190
+ */
191
+ export function boundaries(options = {}) {
192
+ const step = checkStep(options);
193
+ load();
194
+ return constellations().map((found) => ({ constellation: found, outlines: outline(found.abbreviation, step) }));
195
+ }
@@ -0,0 +1,72 @@
1
+ import { type Star } from "./stars.ts";
2
+ /**
3
+ * One of the 88 constellations.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { constellation, type Constellation } from "@johnmorrisdotca/hoshi-stars/constellations";
8
+ *
9
+ * const orion: Constellation = constellation("Ori")!;
10
+ * console.log(orion.name, orion.english, orion.japanese);
11
+ * ```
12
+ */
13
+ export interface Constellation {
14
+ /** The IAU three-letter abbreviation, with its real capitals (`CMa`, `CVn`, `PsA`). It is the same text as `Star.constellation`. */
15
+ abbreviation: string;
16
+ /** The Latin name (`Canis Major`, `Boötes`). */
17
+ name: string;
18
+ /** The Latin genitive, the form used in star names (`Canis Majoris` for α Canis Majoris). */
19
+ genitive: string;
20
+ /** The English name without an article (`Great Dog`, `Hunter`). */
21
+ english: string;
22
+ /** The Japanese name in the kana form the National Astronomical Observatory of Japan uses, ending in 座 (`おおいぬ座`, `オリオン座`). */
23
+ japanese: string;
24
+ /** The Japanese name written wholly in hiragana, 座 read as ざ (`おおいぬざ`, `おりおんざ`). The long-vowel mark ー stays. */
25
+ reading: string;
26
+ }
27
+ /**
28
+ * All 88 constellations, alphabetical by Latin name (Andromeda first, Vulpecula last).
29
+ *
30
+ * @returns A fresh array of the shared, frozen constellations.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { constellations } from "@johnmorrisdotca/hoshi-stars/constellations";
35
+ *
36
+ * console.log(constellations().length, constellations().map((c) => c.japanese).slice(0, 3));
37
+ * ```
38
+ */
39
+ export declare function constellations(): Constellation[];
40
+ /**
41
+ * A constellation by any of its names, ignoring case and the accent on Boötes: the IAU abbreviation (`CMa`), the Latin name (`Canis Major`), the genitive (`Canis Majoris`), the English name
42
+ * (`Great Dog`), the Japanese name with or without 座 (`おおいぬ座`, `おおいぬ`) in katakana or hiragana, or its hiragana reading (`おおいぬざ`). A text that would name two constellations finds
43
+ * neither.
44
+ *
45
+ * @param text - The name, in any of those forms.
46
+ * @returns The constellation, or `undefined` if the text is none of them.
47
+ * @throws TypeError if `text` is not a string.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * import { constellation } from "@johnmorrisdotca/hoshi-stars/constellations";
52
+ *
53
+ * console.log(constellation("cma")?.english, constellation("オリオン座")?.abbreviation, constellation("おおぐま座")?.name);
54
+ * ```
55
+ */
56
+ export declare function constellation(text: string): Constellation | undefined;
57
+ /**
58
+ * The bright stars that lie in a constellation, brightest first: every star of the Yale Bright Star Catalogue (to magnitude 6.0) whose `constellation` is that abbreviation, with a Bayer
59
+ * letter or a Flamsteed number or without one.
60
+ *
61
+ * @param text - The constellation, as the IAU abbreviation (`Ori`) or any other name `constellation` accepts.
62
+ * @returns A fresh array of the shared, frozen stars.
63
+ * @throws TypeError if `text` is not a string. RangeError if it is not one of the 88 constellations.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { starsIn } from "@johnmorrisdotca/hoshi-stars/constellations";
68
+ *
69
+ * console.log(starsIn("Ori").slice(0, 3).map((s) => s.name ?? s.designation));
70
+ * ```
71
+ */
72
+ export declare function starsIn(text: string): Star[];
@@ -0,0 +1,105 @@
1
+ // The 88 constellations the IAU recognises, with their names in Latin, English and Japanese.
2
+ // The constellations tier (`@johnmorrisdotca/hoshi-stars/constellations`): a table of about 2 kB gzipped. Only `starsIn` reaches the bright-star table. Pure: no DOM, no state beyond the parsed table.
3
+ import { CONSTELLATION_ROWS } from "./data/constellations.js";
4
+ import { stars } from "./stars.js";
5
+ const KATAKANA_FIRST = 0x30a1;
6
+ const KATAKANA_LAST = 0x30f6;
7
+ const KATAKANA_TO_HIRAGANA = 0x60;
8
+ function hiragana(text) {
9
+ let out = "";
10
+ for (const ch of text) {
11
+ const code = ch.codePointAt(0);
12
+ out += code >= KATAKANA_FIRST && code <= KATAKANA_LAST ? String.fromCodePoint(code - KATAKANA_TO_HIRAGANA) : ch;
13
+ }
14
+ return out;
15
+ }
16
+ function key(text) {
17
+ return hiragana(text.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\s+/g, " ").trim().toLowerCase());
18
+ }
19
+ const stored = [];
20
+ const byText = new Map();
21
+ const ambiguous = new Set();
22
+ function load() {
23
+ if (stored.length > 0)
24
+ return;
25
+ for (const row of CONSTELLATION_ROWS.split("\n")) {
26
+ const [abbreviation, name, genitive, english, stem] = row.split("|");
27
+ const item = Object.freeze({
28
+ abbreviation,
29
+ name,
30
+ genitive,
31
+ english,
32
+ japanese: `${stem}座`,
33
+ reading: `${hiragana(stem)}ざ`,
34
+ });
35
+ stored.push(item);
36
+ for (const text of [abbreviation, name, genitive, english, item.japanese, stem, item.reading]) {
37
+ const k = key(text);
38
+ const other = byText.get(k);
39
+ if (other !== undefined && other !== item)
40
+ ambiguous.add(k);
41
+ byText.set(k, item);
42
+ }
43
+ }
44
+ for (const k of ambiguous)
45
+ byText.delete(k);
46
+ }
47
+ /**
48
+ * All 88 constellations, alphabetical by Latin name (Andromeda first, Vulpecula last).
49
+ *
50
+ * @returns A fresh array of the shared, frozen constellations.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { constellations } from "@johnmorrisdotca/hoshi-stars/constellations";
55
+ *
56
+ * console.log(constellations().length, constellations().map((c) => c.japanese).slice(0, 3));
57
+ * ```
58
+ */
59
+ export function constellations() {
60
+ load();
61
+ return [...stored];
62
+ }
63
+ /**
64
+ * A constellation by any of its names, ignoring case and the accent on Boötes: the IAU abbreviation (`CMa`), the Latin name (`Canis Major`), the genitive (`Canis Majoris`), the English name
65
+ * (`Great Dog`), the Japanese name with or without 座 (`おおいぬ座`, `おおいぬ`) in katakana or hiragana, or its hiragana reading (`おおいぬざ`). A text that would name two constellations finds
66
+ * neither.
67
+ *
68
+ * @param text - The name, in any of those forms.
69
+ * @returns The constellation, or `undefined` if the text is none of them.
70
+ * @throws TypeError if `text` is not a string.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * import { constellation } from "@johnmorrisdotca/hoshi-stars/constellations";
75
+ *
76
+ * console.log(constellation("cma")?.english, constellation("オリオン座")?.abbreviation, constellation("おおぐま座")?.name);
77
+ * ```
78
+ */
79
+ export function constellation(text) {
80
+ if (typeof text !== "string")
81
+ throw new TypeError(`text must be a string, got ${typeof text}`);
82
+ load();
83
+ return byText.get(key(text));
84
+ }
85
+ /**
86
+ * The bright stars that lie in a constellation, brightest first: every star of the Yale Bright Star Catalogue (to magnitude 6.0) whose `constellation` is that abbreviation, with a Bayer
87
+ * letter or a Flamsteed number or without one.
88
+ *
89
+ * @param text - The constellation, as the IAU abbreviation (`Ori`) or any other name `constellation` accepts.
90
+ * @returns A fresh array of the shared, frozen stars.
91
+ * @throws TypeError if `text` is not a string. RangeError if it is not one of the 88 constellations.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * import { starsIn } from "@johnmorrisdotca/hoshi-stars/constellations";
96
+ *
97
+ * console.log(starsIn("Ori").slice(0, 3).map((s) => s.name ?? s.designation));
98
+ * ```
99
+ */
100
+ export function starsIn(text) {
101
+ const found = constellation(text);
102
+ if (found === undefined)
103
+ throw new RangeError(`"${text}" is not one of the 88 constellations (use the IAU abbreviation such as "Ori")`);
104
+ return stars().filter((star) => star.constellation === found.abbreviation);
105
+ }
@@ -0,0 +1,4 @@
1
+ /** The 357 rows of Roman's table, in her order. One row: lower right ascension | upper right ascension (hours) | lower (southern) declination (degrees) | constellation. A position is in the first row whose right ascension range holds it and whose declination is at or above the lower one. */
2
+ export declare const BOUNDARY_ROWS = "0 24 88 UMi\n8 14.5 86.5 UMi\n21 23 86.1667 UMi\n18 21 86 UMi\n0 8 85 Cep\n9.1667 10.6667 82 Cam\n0 5 80 Cep\n10.6667 14.5 80 Cam\n17.5 18 80 UMi\n20.1667 21 80 Dra\n0 3.5083 77 Cep\n11.5 13.5833 77 Cam\n16.5333 17.5 75 UMi\n20.1667 20.6667 75 Cep\n7.9667 9.1667 73.5 Cam\n9.1667 11.3333 73.5 Dra\n13 16.5333 70 UMi\n3.1 3.4167 68 Cas\n20.4167 20.6667 67 Dra\n11.3333 12 66.5 Dra\n0 0.3333 66 Cep\n14 15.6667 66 UMi\n23.5833 24 66 Cep\n12 13.5 64 Dra\n13.5 14.4167 63 Dra\n23.1667 23.5833 63 Cep\n6.1 7 62 Cam\n20 20.4167 61.5 Dra\n20.5367 20.6 60.9167 Cep\n7 7.9667 60 Cam\n7.9667 8.4167 60 UMa\n19.7667 20 59.5 Dra\n20 20.5367 59.5 Cep\n22.8667 23.1667 59.0833 Cep\n0 2.4333 58.5 Cas\n19.4167 19.7667 58 Dra\n1.7 1.9083 57.5 Cas\n2.4333 3.1 57 Cas\n3.1 3.1667 57 Cam\n22.3167 22.8667 56.25 Cep\n5 6.1 56 Cam\n14.0333 14.4167 55.5 UMa\n14.4167 19.4167 55.5 Dra\n3.1667 3.3333 55 Cam\n22.1333 22.3167 55 Cep\n20.6 21.9667 54.8333 Cep\n0 1.7 54 Cas\n6.1 6.5 54 Lyn\n12.0833 13.5 53 UMa\n15.25 15.75 53 Dra\n21.9667 22.1333 52.75 Cep\n3.3333 5 52.5 Cam\n22.8667 23.3333 52.5 Cas\n15.75 17 51.5 Dra\n2.0417 2.5167 50.5 Per\n17 18.2333 50.5 Dra\n0 1.3667 50 Cas\n1.3667 1.6667 50 Per\n6.5 6.8 50 Lyn\n23.3333 24 50 Cas\n13.5 14.0333 48.5 UMa\n0 1.1167 48 Cas\n23.5833 24 48 Cas\n18.175 18.2333 47.5 Her\n18.2333 19.0833 47.5 Dra\n19.0833 19.1667 47.5 Cyg\n1.6667 2.0417 47 Per\n8.4167 9.1667 47 UMa\n0.1667 0.8667 46 Cas\n12 12.0833 45 UMa\n6.8 7.3667 44.5 Lyn\n21.9083 21.9667 44 Cyg\n21.875 21.9083 43.75 Cyg\n19.1667 19.4 43.5 Cyg\n9.1667 10.1667 42 UMa\n10.1667 10.7833 40 UMa\n15.4333 15.75 40 Boo\n15.75 16.3333 40 Her\n9.25 9.5833 39.75 Lyn\n0 2.5167 36.75 And\n2.5167 2.5667 36.75 Per\n19.3583 19.4 36.5 Lyr\n4.5 4.6917 36 Per\n21.7333 21.875 36 Cyg\n21.875 22 36 Lac\n6.5333 7.3667 35.5 Aur\n7.3667 7.75 35.5 Lyn\n0 2 35 And\n22 22.8167 35 Lac\n22.8167 22.8667 34.5 Lac\n22.8667 23.5 34.5 And\n2.5667 2.7167 34 Per\n10.7833 11 34 UMa\n12 12.3333 34 CVn\n7.75 9.25 33.5 Lyn\n9.25 9.8833 33.5 LMi\n0.7167 1.4083 33 And\n15.1833 15.4333 33 Boo\n23.5 23.75 32.0833 And\n12.3333 13.25 32 CVn\n23.75 24 31.3333 And\n13.9583 14.0333 30.75 CVn\n2.4167 2.7167 30.6667 Tri\n2.7167 4.5 30.6667 Per\n4.5 4.75 30 Aur\n18.175 19.3583 30 Lyr\n11 12 29 UMa\n19.6667 20.9167 29 Cyg\n4.75 5.8833 28.5 Aur\n9.8833 10.5 28.5 LMi\n13.25 13.9583 28.5 CVn\n0 0.0667 28 And\n1.4083 1.6667 28 Tri\n5.8833 6.5333 28 Aur\n7.8833 8 28 Gem\n20.9167 21.7333 28 Cyg\n19.2583 19.6667 27.5 Cyg\n1.9167 2.4167 27.25 Tri\n16.1667 16.3333 27 CrB\n15.0833 15.1833 26 Boo\n15.1833 16.1667 26 CrB\n18.3667 18.8667 26 Lyr\n10.75 11 25.5 LMi\n18.8667 19.2583 25.5 Lyr\n1.6667 1.9167 25 Tri\n0.7167 0.85 23.75 Psc\n10.5 10.75 23.5 LMi\n21.25 21.4167 23.5 Vul\n5.7 5.8833 22.8333 Tau\n0.0667 0.1417 22 And\n15.9167 16.0333 22 Ser\n5.8833 6.2167 21.5 Gem\n19.8333 20.25 21.25 Vul\n18.8667 19.25 21.0833 Vul\n0.1417 0.85 21 And\n20.25 20.5667 20.5 Vul\n7.8083 7.8833 20 Gem\n20.5667 21.25 19.5 Vul\n19.25 19.8333 19.1667 Vul\n3.2833 3.3667 19 Ari\n18.8667 19 18.5 Sge\n5.7 5.7667 18 Ori\n6.2167 6.3083 17.5 Gem\n19 19.8333 16.1667 Sge\n4.9667 5.3333 16 Tau\n15.9167 16.0833 16 Her\n19.8333 20.25 15.75 Sge\n4.6167 4.9667 15.5 Tau\n5.3333 5.6 15.5 Tau\n12.8333 13.5 15 Com\n17.25 18.25 14.3333 Her\n11.8667 12.8333 14 Com\n7.5 7.8083 13.5 Gem\n16.75 17.25 12.8333 Her\n0 0.1417 12.5 Peg\n5.6 5.7667 12.5 Tau\n7 7.5 12.5 Gem\n21.1167 21.3333 12.5 Peg\n6.3083 6.9333 12 Gem\n18.25 18.8667 12 Her\n20.875 21.05 11.8333 Del\n21.05 21.1167 11.8333 Peg\n11.5167 11.8667 11 Leo\n6.2417 6.3083 10 Ori\n6.9333 7 10 Gem\n7.8083 7.925 10 Cnc\n23.8333 24 10 Peg\n1.6667 3.2833 9.9167 Ari\n20.1417 20.3 8.5 Del\n13.5 15.0833 8 Boo\n22.75 23.8333 7.5 Peg\n7.925 9.25 7 Cnc\n9.25 10.75 7 Leo\n18.25 18.6622 6.25 Oph\n18.6622 18.8667 6.25 Aql\n20.8333 20.875 6 Del\n7 7.0167 5.5 CMi\n18.25 18.425 4.5 Ser\n16.0833 16.75 4 Her\n18.25 18.425 3 Oph\n21.4667 21.6667 2.75 Peg\n0 2 2 Psc\n18.5833 18.8667 2 Ser\n20.3 20.8333 2 Del\n20.8333 21.3333 2 Equ\n21.3333 21.4667 2 Peg\n22 22.75 2 Peg\n21.6667 22 1.75 Peg\n7.0167 7.2 1.5 CMi\n3.5833 4.6167 0 Tau\n4.6167 4.6667 0 Ori\n7.2 8.0833 0 CMi\n14.6667 15.0833 0 Vir\n17.8333 18.25 0 Oph\n2.65 3.2833 -1.75 Cet\n3.2833 3.5833 -1.75 Tau\n15.0833 16.2667 -3.25 Ser\n4.6667 5.0833 -4 Ori\n5.8333 6.2417 -4 Ori\n17.8333 17.9667 -4 Ser\n18.25 18.5833 -4 Ser\n18.5833 18.8667 -4 Aql\n22.75 23.8333 -4 Psc\n10.75 11.5167 -6 Leo\n11.5167 11.8333 -6 Vir\n0 0.3333 -7 Psc\n23.8333 24 -7 Psc\n14.25 14.6667 -8 Vir\n15.9167 16.2667 -8 Oph\n20 20.5333 -9 Aql\n21.3333 21.8667 -9 Aqr\n17.1667 17.9667 -10 Oph\n5.8333 8.0833 -11 Mon\n4.9167 5.0833 -11 Eri\n5.0833 5.8333 -11 Ori\n8.0833 8.3667 -11 Hya\n9.5833 10.75 -11 Sex\n11.8333 12.8333 -11 Vir\n17.5833 17.6667 -11.6667 Oph\n18.8667 20 -12.0333 Aql\n4.8333 4.9167 -14.5 Eri\n20.5333 21.3333 -15 Aqr\n17.1667 18.25 -16 Ser\n18.25 18.8667 -16 Sct\n8.3667 8.5833 -17 Hya\n16.2667 16.375 -18.25 Oph\n8.5833 9.0833 -19 Hya\n10.75 10.8333 -19 Crt\n16.2667 16.375 -19.25 Sco\n15.6667 15.9167 -20 Lib\n12.5833 12.8333 -22 Crv\n12.8333 14.25 -22 Vir\n9.0833 9.75 -24 Hya\n1.6667 2.65 -24.3833 Cet\n2.65 3.75 -24.3833 Eri\n10.8333 11.8333 -24.5 Crt\n11.8333 12.5833 -24.5 Crv\n14.25 14.9167 -24.5 Lib\n16.2667 16.75 -24.5833 Oph\n0 1.6667 -25.5 Cet\n21.3333 21.8667 -25.5 Cap\n21.8667 23.8333 -25.5 Aqr\n23.8333 24 -25.5 Cet\n9.75 10.25 -26.5 Hya\n4.7 4.8333 -27.25 Eri\n4.8333 6.1167 -27.25 Lep\n20 21.3333 -28 Cap\n10.25 10.5833 -29.1667 Hya\n12.5833 14.9167 -29.5 Hya\n14.9167 15.6667 -29.5 Lib\n15.6667 16 -29.5 Sco\n4.5833 4.7 -30 Eri\n16.75 17.6 -30 Oph\n17.6 17.8333 -30 Sgr\n10.5833 10.8333 -31.1667 Hya\n6.1167 7.3667 -33 CMa\n12.25 12.5833 -33 Hya\n10.8333 12.25 -35 Hya\n3.5 3.75 -36 For\n8.3667 9.3667 -36.75 Pyx\n4.2667 4.5833 -37 Eri\n17.8333 19.1667 -37 Sgr\n21.3333 23 -37 PsA\n23 23.3333 -37 Scl\n3 3.5 -39.5833 For\n9.3667 11 -39.75 Ant\n0 1.6667 -40 Scl\n1.6667 3 -40 For\n3.8667 4.2667 -40 Eri\n23.3333 24 -40 Scl\n14.1667 14.9167 -42 Cen\n15.6667 16 -42 Lup\n16 16.4208 -42 Sco\n4.8333 5 -43 Cae\n5 6.5833 -43 Col\n8 8.3667 -43 Pup\n3.4167 3.8667 -44 Eri\n16.4208 17.8333 -45.5 Sco\n17.8333 19.1667 -45.5 CrA\n19.1667 20.3333 -45.5 Sgr\n20.3333 21.3333 -45.5 Mic\n3 3.4167 -46 Eri\n4.5 4.8333 -46.5 Cae\n15.3333 15.6667 -48 Lup\n0 2.3333 -48.1667 Phe\n2.6667 3 -49 Eri\n4.0833 4.2667 -49 Hor\n4.2667 4.5 -49 Cae\n21.3333 22 -50 Gru\n6 8 -50.75 Pup\n8 8.1667 -50.75 Vel\n2.4167 2.6667 -51 Eri\n3.8333 4.0833 -51 Hor\n0 1.8333 -51.5 Phe\n6 6.1667 -52.5 Car\n8.1667 8.45 -53 Vel\n3.5 3.8333 -53.1667 Hor\n3.8333 4 -53.1667 Dor\n0 1.5833 -53.5 Phe\n2.1667 2.4167 -54 Eri\n4.5 5 -54 Pic\n15.05 15.3333 -54 Lup\n8.45 8.8333 -54.5 Vel\n6.1667 6.5 -55 Car\n11.8333 12.8333 -55 Cen\n14.1667 15.05 -55 Lup\n15.05 15.3333 -55 Nor\n4 4.3333 -56.5 Dor\n8.8333 11 -56.5 Vel\n11 11.25 -56.5 Cen\n17.5 18 -57 Ara\n18 20.3333 -57 Tel\n22 23.3333 -57 Gru\n3.2 3.5 -57.5 Hor\n5 5.5 -57.5 Pic\n6.5 6.8333 -58 Car\n0 1.3333 -58.5 Phe\n1.3333 2.1667 -58.5 Eri\n23.3333 24 -58.5 Phe\n4.3333 4.5833 -59 Dor\n15.3333 16.4208 -60 Nor\n20.3333 21.3333 -60 Ind\n5.5 6 -61 Pic\n15.1667 15.3333 -61 Cir\n16.4208 16.5833 -61 Ara\n14.9167 15.1667 -63.5833 Cir\n16.5833 16.75 -63.5833 Ara\n6 6.8333 -64 Pic\n6.8333 9.0333 -64 Car\n11.25 11.8333 -64 Cen\n11.8333 12.8333 -64 Cru\n12.8333 14.5333 -64 Cen\n13.5 13.6667 -65 Cir\n16.75 16.8333 -65 Ara\n2.1667 3.2 -67.5 Hor\n3.2 4.5833 -67.5 Ret\n14.75 14.9167 -67.5 Cir\n16.8333 17.5 -67.5 Ara\n17.5 18 -67.5 Pav\n22 23.3333 -67.5 Tuc\n4.5833 6.5833 -70 Dor\n13.6667 14.75 -70 Cir\n14.75 17 -70 TrA\n0 1.3333 -75 Tuc\n3.5 4.5833 -75 Hyi\n6.5833 9.0333 -75 Vol\n9.0333 11.25 -75 Car\n11.25 13.6667 -75 Mus\n18 21.3333 -75 Pav\n21.3333 23.3333 -75 Ind\n23.3333 24 -75 Tuc\n0.75 1.3333 -76 Tuc\n0 3.5 -82.5 Hyi\n7.6667 13.6667 -82.5 Cha\n13.6667 18 -82.5 Aps\n3.5 7.6667 -85 Men\n0 24 -90 Oct";
3
+ /** The outlines, one constellation a line: abbreviation | rings separated by /. A ring is its corners, `hours,degrees` and spaces between, in order with the constellation to the left as right ascension grows; edges run along a constant right ascension or a constant declination only, and a ring that crosses 0 h goes through 24 h and 0 h as two corners. */
4
+ export declare const BOUNDARY_RINGS = "And|0.1417,21 0.85,21 0.85,23.75 0.7167,23.75 0.7167,33 1.4083,33 1.4083,35 2,35 2,36.75 2.5167,36.75 2.5167,50.5 2.0417,50.5 2.0417,47 1.6667,47 1.6667,50 1.1167,50 1.1167,48 0.8667,48 0.8667,46 0.1667,46 0.1667,48 0,48 24,48 23.5833,48 23.5833,50 23.3333,50 23.3333,52.5 22.8667,52.5 22.8667,34.5 23.5,34.5 23.5,32.0833 23.75,32.0833 23.75,31.3333 24,31.3333 0,31.3333 0,28 0.0667,28 0.0667,22 0.1417,22\nAnt|9.3667,-39.75 11,-39.75 11,-35 10.8333,-35 10.8333,-31.1667 10.5833,-31.1667 10.5833,-29.1667 10.25,-29.1667 10.25,-26.5 9.75,-26.5 9.75,-24 9.3667,-24\nAps|13.6667,-82.5 18,-82.5 18,-67.5 17,-67.5 17,-70 13.6667,-70\nAql|18.8667,-12.0333 20,-12.0333 20,-9 20.5333,-9 20.5333,2 20.3,2 20.3,8.5 20.1417,8.5 20.1417,15.75 19.8333,15.75 19.8333,16.1667 19,16.1667 19,18.5 18.8667,18.5 18.8667,12 18.6622,12 18.6622,6.25 18.8667,6.25 18.8667,2 18.5833,2 18.5833,-4 18.8667,-4\nAqr|21.8667,-25.5 23.8333,-25.5 23.8333,-4 22.75,-4 22.75,2 22,2 22,1.75 21.6667,1.75 21.6667,2.75 21.4667,2.75 21.4667,2 20.5333,2 20.5333,-15 21.3333,-15 21.3333,-9 21.8667,-9\nAra|16.8333,-67.5 17.5,-67.5 17.5,-57 18,-57 18,-45.5 16.4208,-45.5 16.4208,-61 16.5833,-61 16.5833,-63.5833 16.75,-63.5833 16.75,-65 16.8333,-65\nAri|1.6667,9.9167 3.2833,9.9167 3.2833,19 3.3667,19 3.3667,30.6667 2.4167,30.6667 2.4167,27.25 1.9167,27.25 1.9167,25 1.6667,25\nAur|5.8833,28 6.5333,28 6.5333,35.5 7.3667,35.5 7.3667,44.5 6.8,44.5 6.8,50 6.5,50 6.5,54 6.1,54 6.1,56 5,56 5,52.5 4.6917,52.5 4.6917,36 4.5,36 4.5,30 4.75,30 4.75,28.5 5.8833,28.5\nBoo|13.5,8 15.0833,8 15.0833,26 15.1833,26 15.1833,33 15.4333,33 15.4333,40 15.75,40 15.75,53 15.25,53 15.25,55.5 14.0333,55.5 14.0333,30.75 13.9583,30.75 13.9583,28.5 13.5,28.5\nCMa|6.1167,-33 7.3667,-33 7.3667,-11 6.1167,-11\nCMi|7.2,0 8.0833,0 8.0833,7 7.925,7 7.925,10 7.8083,10 7.8083,13.5 7.5,13.5 7.5,12.5 7,12.5 7,5.5 7.0167,5.5 7.0167,1.5 7.2,1.5\nCVn|13.25,28.5 13.9583,28.5 13.9583,30.75 14.0333,30.75 14.0333,48.5 13.5,48.5 13.5,53 12.0833,53 12.0833,45 12,45 12,34 12.3333,34 12.3333,32 13.25,32\nCae|4.2667,-49 4.5,-49 4.5,-46.5 4.8333,-46.5 4.8333,-43 5,-43 5,-27.25 4.7,-27.25 4.7,-30 4.5833,-30 4.5833,-37 4.2667,-37\nCam|3.3333,52.5 5,52.5 5,56 6.1,56 6.1,62 7,62 7,60 7.9667,60 7.9667,73.5 9.1667,73.5 9.1667,82 10.6667,82 10.6667,80 11.5,80 11.5,77 13.5833,77 13.5833,80 14.5,80 14.5,86.5 8,86.5 8,85 5,85 5,80 3.5083,80 3.5083,77 3.4167,77 3.4167,68 3.1,68 3.1,57 3.1667,57 3.1667,55 3.3333,55\nCap|20,-28 21.3333,-28 21.3333,-25.5 21.8667,-25.5 21.8667,-9 21.3333,-9 21.3333,-15 20.5333,-15 20.5333,-9 20,-9\nCar|9.0333,-75 11.25,-75 11.25,-56.5 8.8333,-56.5 8.8333,-54.5 8.45,-54.5 8.45,-53 8.1667,-53 8.1667,-50.75 6,-50.75 6,-52.5 6.1667,-52.5 6.1667,-55 6.5,-55 6.5,-58 6.8333,-58 6.8333,-64 9.0333,-64\nCas|0.1667,46 0.8667,46 0.8667,48 1.1167,48 1.1167,50 1.3667,50 1.3667,54 1.7,54 1.7,57.5 1.9083,57.5 1.9083,58.5 2.4333,58.5 2.4333,57 3.1,57 3.1,68 3.4167,68 3.4167,77 0.3333,77 0.3333,66 0,66 24,66 23.5833,66 23.5833,63 23.1667,63 23.1667,59.0833 22.8667,59.0833 22.8667,52.5 23.3333,52.5 23.3333,50 23.5833,50 23.5833,48 24,48 0,48 0.1667,48\nCen|11.25,-64 11.8333,-64 11.8333,-55 12.8333,-55 12.8333,-64 14.5333,-64 14.5333,-55 14.1667,-55 14.1667,-42 14.9167,-42 14.9167,-29.5 12.5833,-29.5 12.5833,-33 12.25,-33 12.25,-35 11,-35 11,-56.5 11.25,-56.5\nCep|21.9667,52.75 22.1333,52.75 22.1333,55 22.3167,55 22.3167,56.25 22.8667,56.25 22.8667,59.0833 23.1667,59.0833 23.1667,63 23.5833,63 23.5833,66 24,66 0,66 0.3333,66 0.3333,77 3.5083,77 3.5083,80 5,80 5,85 8,85 8,88 0,88 24,88 23,88 23,86.1667 21,86.1667 21,80 20.1667,80 20.1667,75 20.6667,75 20.6667,67 20.4167,67 20.4167,61.5 20,61.5 20,59.5 20.5367,59.5 20.5367,60.9167 20.6,60.9167 20.6,54.8333 21.9667,54.8333\nCet|0,-25.5 1.6667,-25.5 1.6667,-24.3833 2.65,-24.3833 2.65,-1.75 3.2833,-1.75 3.2833,9.9167 2,9.9167 2,2 0.3333,2 0.3333,-7 0,-7 24,-7 23.8333,-7 23.8333,-25.5 24,-25.5\nCha|7.6667,-82.5 13.6667,-82.5 13.6667,-75 7.6667,-75\nCir|13.6667,-70 14.75,-70 14.75,-67.5 14.9167,-67.5 14.9167,-63.5833 15.1667,-63.5833 15.1667,-61 15.3333,-61 15.3333,-55 14.5333,-55 14.5333,-64 13.5,-64 13.5,-65 13.6667,-65\nCnc|7.925,7 9.25,7 9.25,33.5 8,33.5 8,28 7.8833,28 7.8833,20 7.8083,20 7.8083,10 7.925,10\nCol|5,-43 6.5833,-43 6.5833,-33 6.1167,-33 6.1167,-27.25 5,-27.25\nCom|11.8667,14 12.8333,14 12.8333,15 13.5,15 13.5,28.5 13.25,28.5 13.25,32 12.3333,32 12.3333,34 12,34 12,29 11.8667,29\nCrA|17.8333,-45.5 19.1667,-45.5 19.1667,-37 17.8333,-37\nCrB|15.1833,26 16.1667,26 16.1667,27 16.3333,27 16.3333,40 15.4333,40 15.4333,33 15.1833,33\nCrt|10.8333,-24.5 11.8333,-24.5 11.8333,-6 10.75,-6 10.75,-19 10.8333,-19\nCru|11.8333,-64 12.8333,-64 12.8333,-55 11.8333,-55\nCrv|11.8333,-24.5 12.5833,-24.5 12.5833,-22 12.8333,-22 12.8333,-11 11.8333,-11\nCyg|19.2583,27.5 19.6667,27.5 19.6667,29 20.9167,29 20.9167,28 21.7333,28 21.7333,36 21.875,36 21.875,43.75 21.9083,43.75 21.9083,44 21.9667,44 21.9667,54.8333 20.6,54.8333 20.6,60.9167 20.5367,60.9167 20.5367,59.5 19.7667,59.5 19.7667,58 19.4167,58 19.4167,55.5 19.0833,55.5 19.0833,47.5 19.1667,47.5 19.1667,43.5 19.4,43.5 19.4,36.5 19.3583,36.5 19.3583,30 19.2583,30\nDel|20.3,2 20.8333,2 20.8333,6 20.875,6 20.875,11.8333 21.05,11.8333 21.05,19.5 20.5667,19.5 20.5667,20.5 20.25,20.5 20.25,15.75 20.1417,15.75 20.1417,8.5 20.3,8.5\nDor|4.5833,-70 6.5833,-70 6.5833,-64 6,-64 6,-61 5.5,-61 5.5,-57.5 5,-57.5 5,-54 4.5,-54 4.5,-49 4.0833,-49 4.0833,-51 3.8333,-51 3.8333,-53.1667 4,-53.1667 4,-56.5 4.3333,-56.5 4.3333,-59 4.5833,-59\nDra|18.2333,47.5 19.0833,47.5 19.0833,55.5 19.4167,55.5 19.4167,58 19.7667,58 19.7667,59.5 20,59.5 20,61.5 20.4167,61.5 20.4167,67 20.6667,67 20.6667,75 20.1667,75 20.1667,80 21,80 21,86 18,86 18,80 17.5,80 17.5,75 16.5333,75 16.5333,70 15.6667,70 15.6667,66 14,66 14,70 13,70 13,77 11.5,77 11.5,80 10.6667,80 10.6667,82 9.1667,82 9.1667,73.5 11.3333,73.5 11.3333,66.5 12,66.5 12,64 13.5,64 13.5,63 14.4167,63 14.4167,55.5 15.25,55.5 15.25,53 15.75,53 15.75,51.5 17,51.5 17,50.5 18.2333,50.5\nEqu|20.8333,2 21.3333,2 21.3333,12.5 21.1167,12.5 21.1167,11.8333 20.875,11.8333 20.875,6 20.8333,6\nEri|1.3333,-58.5 2.1667,-58.5 2.1667,-54 2.4167,-54 2.4167,-51 2.6667,-51 2.6667,-49 3,-49 3,-46 3.4167,-46 3.4167,-44 3.8667,-44 3.8667,-40 4.2667,-40 4.2667,-37 4.5833,-37 4.5833,-30 4.7,-30 4.7,-27.25 4.8333,-27.25 4.8333,-14.5 4.9167,-14.5 4.9167,-11 5.0833,-11 5.0833,-4 4.6667,-4 4.6667,0 3.5833,0 3.5833,-1.75 2.65,-1.75 2.65,-24.3833 3.75,-24.3833 3.75,-36 3.5,-36 3.5,-39.5833 3,-39.5833 3,-40 2.3333,-40 2.3333,-48.1667 1.8333,-48.1667 1.8333,-51.5 1.5833,-51.5 1.5833,-53.5 1.3333,-53.5\nFor|1.6667,-40 3,-40 3,-39.5833 3.5,-39.5833 3.5,-36 3.75,-36 3.75,-24.3833 1.6667,-24.3833\nGem|6.9333,10 7,10 7,12.5 7.5,12.5 7.5,13.5 7.8083,13.5 7.8083,20 7.8833,20 7.8833,28 8,28 8,33.5 7.75,33.5 7.75,35.5 6.5333,35.5 6.5333,28 5.8833,28 5.8833,21.5 6.2167,21.5 6.2167,17.5 6.3083,17.5 6.3083,12 6.9333,12\nGru|22,-57 23.3333,-57 23.3333,-37 21.3333,-37 21.3333,-50 22,-50\nHer|16.0833,4 16.75,4 16.75,12.8333 17.25,12.8333 17.25,14.3333 18.25,14.3333 18.25,12 18.8667,12 18.8667,26 18.3667,26 18.3667,30 18.175,30 18.175,47.5 18.2333,47.5 18.2333,50.5 17,50.5 17,51.5 15.75,51.5 15.75,40 16.3333,40 16.3333,27 16.1667,27 16.1667,26 16.0333,26 16.0333,22 15.9167,22 15.9167,16 16.0833,16\nHor|2.1667,-67.5 3.2,-67.5 3.2,-57.5 3.5,-57.5 3.5,-53.1667 3.8333,-53.1667 3.8333,-51 4.0833,-51 4.0833,-49 4.2667,-49 4.2667,-40 3.8667,-40 3.8667,-44 3.4167,-44 3.4167,-46 3,-46 3,-49 2.6667,-49 2.6667,-51 2.4167,-51 2.4167,-54 2.1667,-54\nHya|10.8333,-35 12.25,-35 12.25,-33 12.5833,-33 12.5833,-29.5 14.9167,-29.5 14.9167,-24.5 14.25,-24.5 14.25,-22 12.5833,-22 12.5833,-24.5 10.8333,-24.5 10.8333,-19 10.75,-19 10.75,-11 9.5833,-11 9.5833,7 8.0833,7 8.0833,-11 8.3667,-11 8.3667,-17 8.5833,-17 8.5833,-19 9.0833,-19 9.0833,-24 9.75,-24 9.75,-26.5 10.25,-26.5 10.25,-29.1667 10.5833,-29.1667 10.5833,-31.1667 10.8333,-31.1667\nHyi|0,-82.5 3.5,-82.5 3.5,-75 4.5833,-75 4.5833,-67.5 2.1667,-67.5 2.1667,-58.5 1.3333,-58.5 1.3333,-76 0.75,-76 0.75,-75 0,-75\nInd|21.3333,-75 23.3333,-75 23.3333,-67.5 22,-67.5 22,-50 21.3333,-50 21.3333,-45.5 20.3333,-45.5 20.3333,-60 21.3333,-60\nLMi|10.5,23.5 10.75,23.5 10.75,25.5 11,25.5 11,34 10.7833,34 10.7833,40 10.1667,40 10.1667,42 9.5833,42 9.5833,39.75 9.25,39.75 9.25,33.5 9.8833,33.5 9.8833,28.5 10.5,28.5\nLac|22.8167,34.5 22.8667,34.5 22.8667,56.25 22.3167,56.25 22.3167,55 22.1333,55 22.1333,52.75 21.9667,52.75 21.9667,44 21.9083,44 21.9083,43.75 21.875,43.75 21.875,36 22,36 22,35 22.8167,35\nLeo|10.75,-6 11.5167,-6 11.5167,11 11.8667,11 11.8667,29 11,29 11,25.5 10.75,25.5 10.75,23.5 10.5,23.5 10.5,28.5 9.8833,28.5 9.8833,33.5 9.25,33.5 9.25,7 10.75,7\nLep|4.8333,-27.25 6.1167,-27.25 6.1167,-11 4.9167,-11 4.9167,-14.5 4.8333,-14.5\nLib|14.9167,-29.5 15.6667,-29.5 15.6667,-20 15.9167,-20 15.9167,-3.25 15.0833,-3.25 15.0833,0 14.6667,0 14.6667,-8 14.25,-8 14.25,-24.5 14.9167,-24.5\nLup|14.1667,-55 15.05,-55 15.05,-54 15.3333,-54 15.3333,-48 15.6667,-48 15.6667,-42 16,-42 16,-29.5 14.9167,-29.5 14.9167,-42 14.1667,-42\nLyn|7.75,33.5 9.25,33.5 9.25,39.75 9.5833,39.75 9.5833,42 9.1667,42 9.1667,47 8.4167,47 8.4167,60 7,60 7,62 6.1,62 6.1,54 6.5,54 6.5,50 6.8,50 6.8,44.5 7.3667,44.5 7.3667,35.5 7.75,35.5\nLyr|18.8667,25.5 19.2583,25.5 19.2583,30 19.3583,30 19.3583,36.5 19.4,36.5 19.4,43.5 19.1667,43.5 19.1667,47.5 18.175,47.5 18.175,30 18.3667,30 18.3667,26 18.8667,26\nMen|3.5,-85 7.6667,-85 7.6667,-75 6.5833,-75 6.5833,-70 4.5833,-70 4.5833,-75 3.5,-75\nMic|20.3333,-45.5 21.3333,-45.5 21.3333,-28 20.3333,-28\nMon|5.8333,-11 8.0833,-11 8.0833,0 7.2,0 7.2,1.5 7.0167,1.5 7.0167,5.5 7,5.5 7,10 6.9333,10 6.9333,12 6.3083,12 6.3083,10 6.2417,10 6.2417,-4 5.8333,-4\nMus|11.25,-75 13.6667,-75 13.6667,-65 13.5,-65 13.5,-64 11.25,-64\nNor|15.3333,-60 16.4208,-60 16.4208,-42 15.6667,-42 15.6667,-48 15.3333,-48 15.3333,-54 15.05,-54 15.05,-55 15.3333,-55\nOct|3.5,-85 3.5,-82.5 0,-82.5 24,-82.5 24,-75 18,-75 18,-82.5 7.6667,-82.5 7.6667,-85\nOph|16.75,-30 17.6,-30 17.6,-16 17.1667,-16 17.1667,-10 17.5833,-10 17.5833,-11.6667 17.6667,-11.6667 17.6667,-10 17.9667,-10 17.9667,-4 17.8333,-4 17.8333,0 18.25,0 18.25,3 18.425,3 18.425,4.5 18.25,4.5 18.25,6.25 18.6622,6.25 18.6622,12 18.25,12 18.25,14.3333 17.25,14.3333 17.25,12.8333 16.75,12.8333 16.75,4 16.2667,4 16.2667,-3.25 15.9167,-3.25 15.9167,-8 16.2667,-8 16.2667,-18.25 16.375,-18.25 16.375,-19.25 16.2667,-19.25 16.2667,-24.5833 16.75,-24.5833\nOri|5.0833,-11 5.8333,-11 5.8333,-4 6.2417,-4 6.2417,10 6.3083,10 6.3083,17.5 6.2167,17.5 6.2167,21.5 5.8833,21.5 5.8833,22.8333 5.7,22.8333 5.7,18 5.7667,18 5.7667,12.5 5.6,12.5 5.6,15.5 5.3333,15.5 5.3333,16 4.9667,16 4.9667,15.5 4.6167,15.5 4.6167,0 4.6667,0 4.6667,-4 5.0833,-4\nPav|18,-75 21.3333,-75 21.3333,-60 20.3333,-60 20.3333,-57 17.5,-57 17.5,-67.5 18,-67.5\nPeg|21.6667,1.75 22,1.75 22,2 22.75,2 22.75,7.5 23.8333,7.5 23.8333,10 24,10 24,12.5 0,12.5 0.1417,12.5 0.1417,22 0.0667,22 0.0667,28 0,28 24,28 24,31.3333 23.75,31.3333 23.75,32.0833 23.5,32.0833 23.5,34.5 22.8167,34.5 22.8167,35 22,35 22,36 21.7333,36 21.7333,28 21.4167,28 21.4167,23.5 21.25,23.5 21.25,19.5 21.05,19.5 21.05,11.8333 21.1167,11.8333 21.1167,12.5 21.3333,12.5 21.3333,2 21.4667,2 21.4667,2.75 21.6667,2.75\nPer|2.7167,30.6667 4.5,30.6667 4.5,36 4.6917,36 4.6917,52.5 3.3333,52.5 3.3333,55 3.1667,55 3.1667,57 2.4333,57 2.4333,58.5 1.9083,58.5 1.9083,57.5 1.7,57.5 1.7,54 1.3667,54 1.3667,50 1.6667,50 1.6667,47 2.0417,47 2.0417,50.5 2.5167,50.5 2.5167,36.75 2.5667,36.75 2.5667,34 2.7167,34\nPhe|0,-58.5 1.3333,-58.5 1.3333,-53.5 1.5833,-53.5 1.5833,-51.5 1.8333,-51.5 1.8333,-48.1667 2.3333,-48.1667 2.3333,-40 0,-40 24,-40 23.3333,-40 23.3333,-58.5 24,-58.5\nPic|6,-64 6.8333,-64 6.8333,-58 6.5,-58 6.5,-55 6.1667,-55 6.1667,-52.5 6,-52.5 6,-43 4.8333,-43 4.8333,-46.5 4.5,-46.5 4.5,-54 5,-54 5,-57.5 5.5,-57.5 5.5,-61 6,-61\nPsA|21.3333,-37 23,-37 23,-25.5 21.3333,-25.5\nPsc|0,-7 0.3333,-7 0.3333,2 2,2 2,9.9167 1.6667,9.9167 1.6667,28 1.4083,28 1.4083,33 0.7167,33 0.7167,23.75 0.85,23.75 0.85,21 0.1417,21 0.1417,12.5 0,12.5 0,10 24,10 23.8333,10 23.8333,7.5 22.75,7.5 22.75,-4 23.8333,-4 23.8333,-7 24,-7\nPup|6,-50.75 8,-50.75 8,-43 8.3667,-43 8.3667,-11 7.3667,-11 7.3667,-33 6.5833,-33 6.5833,-43 6,-43\nPyx|8.3667,-36.75 9.3667,-36.75 9.3667,-24 9.0833,-24 9.0833,-19 8.5833,-19 8.5833,-17 8.3667,-17\nRet|3.2,-67.5 4.5833,-67.5 4.5833,-59 4.3333,-59 4.3333,-56.5 4,-56.5 4,-53.1667 3.5,-53.1667 3.5,-57.5 3.2,-57.5\nScl|0,-40 1.6667,-40 1.6667,-25.5 0,-25.5 24,-25.5 23,-25.5 23,-37 23.3333,-37 23.3333,-40 24,-40\nSco|16.4208,-45.5 17.8333,-45.5 17.8333,-30 16.75,-30 16.75,-24.5833 16.2667,-24.5833 16.2667,-19.25 16.375,-19.25 16.375,-18.25 16.2667,-18.25 16.2667,-8 15.9167,-8 15.9167,-20 15.6667,-20 15.6667,-29.5 16,-29.5 16,-42 16.4208,-42\nSct|18.25,-16 18.8667,-16 18.8667,-4 18.25,-4\nSer|15.0833,-3.25 16.2667,-3.25 16.2667,4 16.0833,4 16.0833,16 15.9167,16 15.9167,22 16.0333,22 16.0333,26 15.0833,26/17.1667,-16 18.25,-16 18.25,-4 18.5833,-4 18.5833,2 18.8667,2 18.8667,6.25 18.25,6.25 18.25,4.5 18.425,4.5 18.425,3 18.25,3 18.25,0 17.8333,0 17.8333,-4 17.9667,-4 17.9667,-10 17.6667,-10 17.6667,-11.6667 17.5833,-11.6667 17.5833,-10 17.1667,-10\nSex|9.5833,-11 10.75,-11 10.75,7 9.5833,7\nSge|19.8333,15.75 20.25,15.75 20.25,21.25 19.8333,21.25 19.8333,19.1667 19.25,19.1667 19.25,21.0833 18.8667,21.0833 18.8667,18.5 19,18.5 19,16.1667 19.8333,16.1667\nSgr|19.1667,-45.5 20.3333,-45.5 20.3333,-28 20,-28 20,-12.0333 18.8667,-12.0333 18.8667,-16 17.6,-16 17.6,-30 17.8333,-30 17.8333,-37 19.1667,-37\nTau|3.2833,-1.75 3.5833,-1.75 3.5833,0 4.6167,0 4.6167,15.5 4.9667,15.5 4.9667,16 5.3333,16 5.3333,15.5 5.6,15.5 5.6,12.5 5.7667,12.5 5.7667,18 5.7,18 5.7,22.8333 5.8833,22.8333 5.8833,28.5 4.75,28.5 4.75,30 4.5,30 4.5,30.6667 3.3667,30.6667 3.3667,19 3.2833,19\nTel|18,-57 20.3333,-57 20.3333,-45.5 18,-45.5\nTrA|14.75,-70 17,-70 17,-67.5 16.8333,-67.5 16.8333,-65 16.75,-65 16.75,-63.5833 16.5833,-63.5833 16.5833,-61 16.4208,-61 16.4208,-60 15.3333,-60 15.3333,-61 15.1667,-61 15.1667,-63.5833 14.9167,-63.5833 14.9167,-67.5 14.75,-67.5\nTri|1.6667,25 1.9167,25 1.9167,27.25 2.4167,27.25 2.4167,30.6667 2.7167,30.6667 2.7167,34 2.5667,34 2.5667,36.75 2,36.75 2,35 1.4083,35 1.4083,28 1.6667,28\nTuc|0.75,-76 1.3333,-76 1.3333,-58.5 0,-58.5 24,-58.5 23.3333,-58.5 23.3333,-57 22,-57 22,-67.5 23.3333,-67.5 23.3333,-75 24,-75 0,-75 0.75,-75\nUMa|11,29 12,29 12,45 12.0833,45 12.0833,53 13.5,53 13.5,48.5 14.0333,48.5 14.0333,55.5 14.4167,55.5 14.4167,63 13.5,63 13.5,64 12,64 12,66.5 11.3333,66.5 11.3333,73.5 7.9667,73.5 7.9667,60 8.4167,60 8.4167,47 9.1667,47 9.1667,42 10.1667,42 10.1667,40 10.7833,40 10.7833,34 11,34\nUMi|14,66 15.6667,66 15.6667,70 16.5333,70 16.5333,75 17.5,75 17.5,80 18,80 18,86 21,86 21,86.1667 23,86.1667 23,88 24,88 0,88 8,88 8,86.5 14.5,86.5 14.5,80 13.5833,80 13.5833,77 13,77 13,70 14,70\nVel|8.8333,-56.5 11,-56.5 11,-39.75 9.3667,-39.75 9.3667,-36.75 8.3667,-36.75 8.3667,-43 8,-43 8,-50.75 8.1667,-50.75 8.1667,-53 8.45,-53 8.45,-54.5 8.8333,-54.5\nVir|12.8333,-22 14.25,-22 14.25,-8 14.6667,-8 14.6667,0 15.0833,0 15.0833,8 13.5,8 13.5,15 12.8333,15 12.8333,14 11.8667,14 11.8667,11 11.5167,11 11.5167,-6 11.8333,-6 11.8333,-11 12.8333,-11\nVol|6.5833,-75 9.0333,-75 9.0333,-64 6.5833,-64\nVul|19.25,19.1667 19.8333,19.1667 19.8333,21.25 20.25,21.25 20.25,20.5 20.5667,20.5 20.5667,19.5 21.25,19.5 21.25,23.5 21.4167,23.5 21.4167,28 20.9167,28 20.9167,29 19.6667,29 19.6667,27.5 19.2583,27.5 19.2583,25.5 18.8667,25.5 18.8667,21.0833 19.25,21.0833";