src/data/constellations.js
// ————————————————————————————————————————————————
// The 88 IAU constellation stick figures (#120).
//
// CONSTELLATIONS — every IAU constellation as { id, names: { fr, en },
// color, zodiac, strokes }, where each `stroke` is an ordered polyline
// of Hipparcos catalogue numbers (HIP) that all resolve in
// `src/data/stars.js` (the bright-star catalogue trimmed to magnitude
// ≤ 6.5). `id` is the lowercased IAU 3-letter abbreviation. `color` is
// the line colour — the 12 ecliptic ("zodiac") constellations keep
// distinct hues; the other 76 share NEUTRAL_FIGURE_COLOR so the zodiac
// stand out in the sky. `zodiac` is true for exactly those 12.
//
// ZODIAC — the derived 12-entry view (CONSTELLATIONS.filter(c => c.zodiac)).
//
// validateConstellations(hipSet) is the defensive runtime pruner: it
// drops any HIP not in the supplied set, collapses sub-2-star strokes,
// drops figures left with no strokes, and returns { figures, warnings }
// without ever throwing. On the shipped catalogue it is a no-op (the
// data below is already pruned to mag ≤ 6.5 at build time).
//
// Names are FR/EN, resolved via objectName() at render time — same
// shape as src/data/planets.js / locations.js.
//
// SOURCE: generated by scripts/build-constellations.js from Stellarium's
// "western_SnT" sky culture (Sky & Telescope figures); the HIP-to-HIP
// connections are treated as public-domain astronomical data (see
// README). To regenerate: pin SKYCULTURE_COMMIT in that script, then
// node scripts/build-constellations.js
// (it rewrites this file). No Three / no Vite imports — Node-testable.
// ————————————————————————————————————————————————
export const NEUTRAL_FIGURE_COLOR = 0x6a7a93;
// Each entry: { id, names: { fr, en }, color, zodiac, strokes: number[][] }.
// Zodiac first (ecliptic order), then the remaining constellations.
export const CONSTELLATIONS = [
{
id: 'ari',
names: { fr: 'Bélier', en: 'Aries' },
color: 0xff6b6b,
zodiac: true,
strokes: [[8832, 8903, 9884, 13209]],
},
{
id: 'tau',
names: { fr: 'Taureau', en: 'Taurus' },
color: 0xff9f43,
zodiac: true,
strokes: [
[26451, 21421, 20894, 20205, 20455, 20889, 25428],
[16083, 18907],
[15900, 16852],
[20205, 18724, 16083],
],
},
{
id: 'gem',
names: { fr: 'Gémeaux', en: 'Gemini' },
color: 0xffd166,
zodiac: true,
strokes: [
[32362, 35350, 35550, 34088, 31681],
[35550, 36962, 37740],
[36962, 37826],
[36962, 36046, 34693, 36850],
[34693, 33018],
[34693, 32246, 30883],
[32246, 30343, 29655, 28734],
],
},
{
id: 'cnc',
names: { fr: 'Cancer', en: 'Cancer' },
color: 0xc9e265,
zodiac: true,
strokes: [
[44066, 42911, 40526],
[42911, 42806, 43103],
],
},
{
id: 'leo',
names: { fr: 'Lion', en: 'Leo' },
color: 0x6bc16b,
zodiac: true,
strokes: [
[49669, 49583, 50583, 50335, 48455, 47908],
[50583, 54872, 57632, 54879, 54872],
[54879, 49583],
[48455, 46146, 46750, 47908, 49583],
[54879, 55642, 55434],
],
},
{
id: 'vir',
names: { fr: 'Vierge', en: 'Virgo' },
color: 0x4ecdc4,
zodiac: true,
strokes: [
[60129, 58948, 57380, 57757, 60129, 61941, 63090, 63608],
[61941, 64238, 65474],
[61941, 66249, 68520, 72220],
[66249, 69701, 71957],
],
},
{
id: 'lib',
names: { fr: 'Balance', en: 'Libra' },
color: 0x4dabf7,
zodiac: true,
strokes: [
[72622, 74785],
[72622, 73714],
[74785, 76333, 72622],
[76333, 76470, 76600],
],
},
{
id: 'sco',
names: { fr: 'Scorpion', en: 'Scorpius' },
color: 0x5c7cfa,
zodiac: true,
strokes: [
[78820, 78401, 78265],
[
78401, 80112, 80763, 81266, 82396, 82514, 82729, 84143, 86228, 87073, 86670, 85696, 85927,
87261,
],
[78820, 79374],
[78265, 78104],
],
},
{
id: 'sgr',
names: { fr: 'Sagittaire', en: 'Sagittarius' },
color: 0x9775fa,
zodiac: true,
strokes: [
[90185, 88635, 89931, 90185],
[89931, 90496, 92041, 89931],
[92041, 92855, 93864, 93506, 92041],
[93506, 90185, 89642],
[90496, 89341],
[95168, 94141, 93683, 93085, 94141],
],
},
{
id: 'cap',
names: { fr: 'Capricorne', en: 'Capricornus' },
color: 0xc77dff,
zodiac: true,
strokes: [[100064, 100345, 102485, 102978, 105881, 106723, 107556, 106985, 104139, 100064]],
},
{
id: 'aqr',
names: { fr: 'Verseau', en: 'Aquarius' },
color: 0xf368e0,
zodiac: true,
strokes: [
[102618, 106278, 109074, 110395, 110960, 111497],
[110960, 110672, 109074],
[109139, 106278],
[109074, 110003, 112961, 114724, 115033, 115438],
[115033, 114341],
[115033, 113136, 112716, 112961],
],
},
{
id: 'psc',
names: { fr: 'Poissons', en: 'Pisces' },
color: 0xff8fab,
zodiac: true,
strokes: [
[
5742, 6193, 5586, 5742, 7097, 8198, 9487, 7884, 4906, 3786, 118268, 116771, 115830, 114971,
115738, 116928, 116771,
],
],
},
{
id: 'and',
names: { fr: 'Andromède', en: 'Andromeda' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[677, 3092, 5447, 9640],
[113726, 116631, 116805, 116584],
[116631, 1473, 2912, 3092],
[2912, 5447, 4436, 3881, 5434, 7607],
[3092, 3031, 3693, 4463],
],
},
{
id: 'ant',
names: { fr: 'Machine pneumatique', en: 'Antlia' },
color: 0x6a7a93,
zodiac: false,
strokes: [[53502, 51172, 46515]],
},
{
id: 'aps',
names: { fr: 'Oiseau de paradis', en: 'Apus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[72370, 81065],
[80047, 81852, 81065],
],
},
{
id: 'aql',
names: { fr: 'Aigle', en: 'Aquila' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[98036, 97649, 97278, 95501, 93805],
[95501, 93747],
[95501, 97804, 99473],
[93244, 93747],
[93805, 93429],
[99473, 96468, 93805, 93747],
],
},
{
id: 'ara',
names: { fr: 'Autel', en: 'Ara' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[85267, 85727, 82363, 83081, 83153, 85792, 88714],
[85792, 85258],
],
},
{
id: 'aur',
names: { fr: 'Cocher', en: 'Auriga' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[25428, 23015, 23767, 24608, 28360, 28380, 25428],
[23767, 23453, 23416, 24608, 28358, 28360],
],
},
{
id: 'boo',
names: { fr: 'Bouvier', en: 'Bootes' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[69673, 72105, 74666, 73555, 71075, 71053, 69673, 67927, 67275],
[69673, 71795],
[71075, 69732, 70497, 69483, 69732],
],
},
{
id: 'cae',
names: { fr: 'Burin', en: 'Caelum' },
color: 0x6a7a93,
zodiac: false,
strokes: [[23595, 21861, 21770, 21060]],
},
{
id: 'cam',
names: { fr: 'Girafe', en: 'Camelopardalis' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[23040, 23522, 22783, 29997, 33694],
[22783, 17959, 17884, 16228],
],
},
{
id: 'cvn',
names: { fr: 'Chiens de chasse', en: 'Canes Venatici' },
color: 0x6a7a93,
zodiac: false,
strokes: [[63125, 61317]],
},
{
id: 'cma',
names: { fr: 'Grand Chien', en: 'Canis Major' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[30324, 32349, 34444, 33579],
[34444, 35904],
[30324, 31592, 33152, 33579],
[32349, 33347, 34045, 33160, 33347],
],
},
{
id: 'cmi',
names: { fr: 'Petit Chien', en: 'Canis Minor' },
color: 0x6a7a93,
zodiac: false,
strokes: [[37279, 36188]],
},
{
id: 'car',
names: { fr: 'Carène', en: 'Carina' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[30438, 45238, 50099, 52419, 51576, 50371, 45556, 42913],
[51576, 53253],
[52419, 54301, 54751, 54463, 53253],
[45556, 41037, 38827, 39953],
],
},
{
id: 'cas',
names: { fr: 'Cassiopée', en: 'Cassiopeia' },
color: 0x6a7a93,
zodiac: false,
strokes: [[746, 3179, 4427, 6686, 8886]],
},
{
id: 'cen',
names: { fr: 'Centaure', en: 'Centaurus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[61932, 66657, 68702, 71683],
[66657, 68002, 61932],
[68002, 68282, 68245, 71352],
[68245, 68862, 70090, 68933, 67464, 68002],
[55425, 59196, 60823, 61932],
[60823, 59449, 56243],
[67464, 65936, 65109, 61789],
[71352, 73334],
],
},
{
id: 'cep',
names: { fr: 'Céphée', en: 'Cepheus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[102422, 105199, 106032, 112724],
[106032, 116727, 112724, 110991, 109492, 109857, 107259, 105199],
[101093, 102422],
],
},
{
id: 'cet',
names: { fr: 'Baleine', en: 'Cetus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[
12706, 14135, 13954, 12828, 11484, 12706, 12387, 10826, 8645, 8102, 3419, 1562, 5364, 6537,
8645,
],
],
},
{
id: 'cha',
names: { fr: 'Caméléon', en: 'Chamaeleon' },
color: 0x6a7a93,
zodiac: false,
strokes: [[40702, 51839, 52633, 60000, 58484, 51839]],
},
{
id: 'cir',
names: { fr: 'Compas', en: 'Circinus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[74824, 71908, 75323]],
},
{
id: 'col',
names: { fr: 'Colombe', en: 'Columba' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[26634, 27628],
[25859, 26634],
[28328, 27628, 28199, 30277],
],
},
{
id: 'com',
names: { fr: 'Chevelure de Bérénice', en: 'Coma Berenices' },
color: 0x6a7a93,
zodiac: false,
strokes: [[64241, 64394, 60742]],
},
{
id: 'cra',
names: { fr: 'Couronne australe', en: 'Corona Australis' },
color: 0x6a7a93,
zodiac: false,
strokes: [[93825, 94114, 94160, 94005, 90982]],
},
{
id: 'crb',
names: { fr: 'Couronne boréale', en: 'Corona Borealis' },
color: 0x6a7a93,
zodiac: false,
strokes: [[76127, 75695, 76267, 76952, 77512, 78159, 78493]],
},
{
id: 'crv',
names: { fr: 'Corbeau', en: 'Corvus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[60965, 59803, 59316, 61359, 60965],
[59316, 59199],
],
},
{
id: 'crt',
names: { fr: 'Coupe', en: 'Crater' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[53740, 54682, 55705, 57283, 58188],
[55705, 55282, 55687, 56633],
[55282, 53740],
],
},
{
id: 'cru',
names: { fr: 'Croix du Sud', en: 'Crux' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[60718, 61084],
[62434, 59747],
],
},
{
id: 'cyg',
names: { fr: 'Cygne', en: 'Cygnus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[102098, 100453, 102488],
[100453, 95947],
[100453, 97165, 95853, 94779],
[95853, 99848, 102098, 103413, 104732, 102488],
],
},
{
id: 'del',
names: { fr: 'Dauphin', en: 'Delphinus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[101421, 101769, 101958, 102532, 102281, 101769]],
},
{
id: 'dor',
names: { fr: 'Dorade', en: 'Dorado' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[19893, 21281, 23693, 26069, 21281],
[26069, 27100, 27890, 26069],
],
},
{
id: 'dra',
names: { fr: 'Dragon', en: 'Draco' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[56211, 61281, 68756, 75458, 78527, 80331, 83895, 89908, 89937],
[89908, 94376, 97433],
[94376, 87585, 85829, 85670, 87833, 87585],
],
},
{
id: 'equ',
names: { fr: 'Petit Cheval', en: 'Equuleus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[104987, 104858, 104521]],
},
{
id: 'eri',
names: { fr: 'Éridan', en: 'Eridanus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[
23875, 22109, 21444, 19587, 18543, 17593, 17378, 16537, 13701, 12770, 12843, 14146, 15474,
16611, 17651, 18216, 18673, 21248, 21393, 20535, 20042, 17874, 16870, 15510, 13847, 12486,
12413, 11407, 9007, 7588,
],
],
},
{
id: 'for',
names: { fr: 'Fourneau', en: 'Fornax' },
color: 0x6a7a93,
zodiac: false,
strokes: [[14879, 13147, 9677]],
},
{
id: 'gru',
names: { fr: 'Grue', en: 'Grus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[108085, 109111, 110997, 109268, 112122, 110997],
[112122, 112623, 113638],
],
},
{
id: 'her',
names: { fr: 'Hercule', en: 'Hercules' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[84379, 84345, 80816, 80170],
[80816, 81693, 83207],
[81693, 81833, 81126, 79992],
[81833, 84380, 85112, 87808, 86414],
[84380, 83207, 84379, 85693, 86974, 87933, 88794],
[77760, 79101, 79992],
[80170, 80463, 81008],
],
},
{
id: 'hor',
names: { fr: 'Horloge', en: 'Horologium' },
color: 0x6a7a93,
zodiac: false,
strokes: [[19747, 12653, 12225, 12484, 14240, 13884]],
},
{
id: 'hya',
names: { fr: 'Hydre', en: 'Hydra' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[
43234, 42799, 42402, 42313, 43109, 43813, 45336, 47431, 46390, 48356, 49402, 49841, 51069,
52943, 53740,
],
[54682, 56343, 57936, 64962, 68895, 72571],
],
},
{
id: 'hyi',
names: { fr: 'Hydre mâle', en: 'Hydrus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[2021, 17678, 11001, 9236, 2021]],
},
{
id: 'ind',
names: { fr: 'Indien', en: 'Indus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[103227, 102333, 101772, 105319, 108431, 103227]],
},
{
id: 'lac',
names: { fr: 'Lézard', en: 'Lacerta' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[111022, 111169, 110538, 110609, 111022, 110351, 111104, 111944, 111022],
[111104, 109754, 109937],
],
},
{
id: 'lmi',
names: { fr: 'Petit Lion', en: 'Leo Minor' },
color: 0x6a7a93,
zodiac: false,
strokes: [[46952, 49593, 51233, 53229, 51056, 49593]],
},
{
id: 'lep',
names: { fr: 'Lièvre', en: 'Lepus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[23685, 24305, 25985, 25606, 23685],
[24845, 24305, 24327],
[25606, 27072, 27654, 28910, 28103, 27288, 25985],
],
},
{
id: 'lup',
names: { fr: 'Loup', en: 'Lupus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[71860, 74395, 75264, 76297, 75141, 73273],
[76297, 78384, 75177, 77634, 78384, 74395],
],
},
{
id: 'lyn',
names: { fr: 'Lynx', en: 'Lynx' },
color: 0x6a7a93,
zodiac: false,
strokes: [[45860, 45688, 44700, 44248, 41075, 36145, 33449, 30060]],
},
{
id: 'lyr',
names: { fr: 'Lyre', en: 'Lyra' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[91262, 91919, 91971, 91262],
[91971, 92791, 93194, 92420, 91971],
],
},
{
id: 'men',
names: { fr: 'Table', en: 'Mensa' },
color: 0x6a7a93,
zodiac: false,
strokes: [[29271, 23467]],
},
{
id: 'mic',
names: { fr: 'Microscope', en: 'Microscopium' },
color: 0x6a7a93,
zodiac: false,
strokes: [[102831, 102989]],
},
{
id: 'mon',
names: { fr: 'Licorne', en: 'Monoceros' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[31978, 31216, 30419, 32578, 31216],
[32578, 34769, 30867, 29651],
[34769, 39863, 37447],
],
},
{
id: 'mus',
names: { fr: 'Mouche', en: 'Musca' },
color: 0x6a7a93,
zodiac: false,
strokes: [[57363, 59929, 61585, 62322, 63613, 61199, 61585]],
},
{
id: 'nor',
names: { fr: 'Règle', en: 'Norma' },
color: 0x6a7a93,
zodiac: false,
strokes: [[78639, 80000, 80582, 78914, 78639]],
},
{
id: 'oct',
names: { fr: 'Octant', en: 'Octans' },
color: 0x6a7a93,
zodiac: false,
strokes: [[70638, 107089, 112405, 70638]],
},
{
id: 'oph',
names: { fr: 'Serpentaire', en: 'Ophiuchus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[86032, 83000, 80883, 79593, 79882, 80628, 81377, 83000],
[81377, 84012, 86742, 87108, 88048],
[86742, 86032],
[84012, 84970, 85423],
[81377, 80894, 80569, 80343, 80473],
],
},
{
id: 'ori',
names: { fr: 'Orion', en: 'Orion' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[27989, 26727, 27366],
[26727, 26311, 25930, 25336],
[25930, 25281, 24436],
[27989, 25336, 26207, 27989],
[23607, 22957, 22845, 22509, 22449, 25336],
[22449, 22549, 22797, 23123],
[27989, 28614, 29038],
[29426, 28716, 27913, 29038],
],
},
{
id: 'pav',
names: { fr: 'Paon', en: 'Pavo' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[100751, 99240, 102395],
[100751, 105858, 102395],
[91792, 99240, 98495],
[99240, 93015, 88866, 86929],
[88866, 90098, 92609, 99240],
],
},
{
id: 'peg',
names: { fr: 'Pégase', en: 'Pegasus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[109410, 112158, 113881, 112748, 112440, 109176, 107354],
[677, 113881, 113963, 1067, 677],
[107315, 109427, 112029, 113963],
],
},
{
id: 'per',
names: { fr: 'Persée', en: 'Perseus' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[17448, 18246, 18614, 18532, 17358, 15863, 14328, 13268, 13531, 14328],
[13531, 14632, 15863],
[14632, 14668, 14576, 18532],
[14576, 14354],
[17358, 19343, 19812, 20070, 19167],
[14632, 12777, 8068],
],
},
{
id: 'phe',
names: { fr: 'Phénix', en: 'Phoenix' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[2081, 5165, 6867],
[2081, 765, 5165, 5348, 7083, 6867],
],
},
{
id: 'pic',
names: { fr: 'Peintre', en: 'Pictor' },
color: 0x6a7a93,
zodiac: false,
strokes: [[32607, 27530, 27321]],
},
{
id: 'psa',
names: { fr: 'Poisson austral', en: 'Piscis Austrinus' },
color: 0x6a7a93,
zodiac: false,
strokes: [[113368, 113246, 112948, 111188, 109285, 107380, 107608, 109285, 111954, 113368]],
},
{
id: 'pup',
names: { fr: 'Poupe', en: 'Puppis' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[39953, 39429, 39757, 38170, 37229, 36917, 35264, 31685, 30438],
[36917, 37677, 38070, 38170],
],
},
{
id: 'pyx',
names: { fr: 'Boussole', en: 'Pyxis' },
color: 0x6a7a93,
zodiac: false,
strokes: [[39429, 42515, 42828, 43409]],
},
{
id: 'ret',
names: { fr: 'Réticule', en: 'Reticulum' },
color: 0x6a7a93,
zodiac: false,
strokes: [[19780, 17440, 18597, 19921, 19780]],
},
{
id: 'sge',
names: { fr: 'Flèche', en: 'Sagitta' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[98337, 97365, 96757],
[97365, 96837],
],
},
{
id: 'scl',
names: { fr: 'Sculpteur', en: 'Sculptor' },
color: 0x6a7a93,
zodiac: false,
strokes: [[4577, 117452, 115102, 116231]],
},
{
id: 'sct',
names: { fr: 'Écu de Sobieski', en: 'Scutum' },
color: 0x6a7a93,
zodiac: false,
strokes: [[92175, 91117, 90595, 91726, 92175]],
},
{
id: 'ser',
names: { fr: 'Serpent', en: 'Serpens' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[77233, 78072, 77450, 76852, 77233, 76276, 77070, 77622, 77516, 79593],
[84012, 86263, 88048, 89962, 92946],
],
},
{
id: 'sex',
names: { fr: 'Sextant', en: 'Sextans' },
color: 0x6a7a93,
zodiac: false,
strokes: [[48437, 49641, 51437, 51362]],
},
{
id: 'tel',
names: { fr: 'Télescope', en: 'Telescopium' },
color: 0x6a7a93,
zodiac: false,
strokes: [[89112, 90422, 90568]],
},
{
id: 'tri',
names: { fr: 'Triangle', en: 'Triangulum' },
color: 0x6a7a93,
zodiac: false,
strokes: [[8796, 10064, 10670, 8796]],
},
{
id: 'tra',
names: { fr: 'Triangle austral', en: 'Triangulum Australe' },
color: 0x6a7a93,
zodiac: false,
strokes: [[82273, 77952, 76440, 74946, 82273]],
},
{
id: 'tuc',
names: { fr: 'Toucan', en: 'Tucana' },
color: 0x6a7a93,
zodiac: false,
strokes: [[2484, 1599, 118322, 110838, 110130, 114996, 2484]],
},
{
id: 'uma',
names: { fr: 'Grande Ourse', en: 'Ursa Major' },
color: 0x6a7a93,
zodiac: false,
strokes: [
[58001, 57399, 54539, 50801, 50372],
[57399, 55219],
[59774, 54061, 53910, 58001, 59774, 62956, 65378, 67301],
[54061, 46733, 48319],
[46733, 41704, 48319, 53910],
[48319, 46853, 44471, 44127],
],
},
{
id: 'umi',
names: { fr: 'Petite Ourse', en: 'Ursa Minor' },
color: 0x6a7a93,
zodiac: false,
strokes: [[11767, 85822, 82080, 77055, 79822, 75097, 72607, 77055]],
},
{
id: 'vel',
names: { fr: 'Voiles', en: 'Vela' },
color: 0x6a7a93,
zodiac: false,
strokes: [[42913, 39953, 44816, 46651, 50191, 52727, 48774, 45941, 42913]],
},
{
id: 'vol',
names: { fr: 'Poisson volant', en: 'Volans' },
color: 0x6a7a93,
zodiac: false,
strokes: [[44382, 41312, 39794, 35228, 34481, 39794, 44382]],
},
{
id: 'vul',
names: { fr: 'Petit Renard', en: 'Vulpecula' },
color: 0x6a7a93,
zodiac: false,
strokes: [[95771, 97886]],
},
];
// Derived: the 12 ecliptic constellations.
export const ZODIAC = CONSTELLATIONS.filter((c) => c.zodiac);
// Prune a copy of CONSTELLATIONS against `hipSet` (a Set<number> of
// available HIP ids). Drops unknown HIPs, collapses consecutive
// duplicates a drop may introduce, drops strokes that fall below two
// stars, and drops figures left with no drawable strokes. Returns
// { figures, warnings }; `figures` keeps the entry shape (incl. `zodiac`);
// `warnings` is an array of human-readable strings. Never throws.
export function validateConstellations(hipSet) {
const warnings = [];
const figures = [];
for (const c of CONSTELLATIONS) {
const strokes = [];
for (const stroke of c.strokes) {
const kept = [];
for (const hip of stroke) {
if (hipSet.has(hip)) kept.push(hip);
else warnings.push(`${c.id}: HIP ${hip} not in star catalog — dropped`);
}
const cleaned = kept.filter((hip, i) => i === 0 || hip !== kept[i - 1]);
if (cleaned.length >= 2) strokes.push(cleaned);
else if (stroke.length >= 2)
warnings.push(`${c.id}: a stroke collapsed below 2 stars after pruning — dropped`);
}
if (strokes.length > 0)
figures.push({ id: c.id, names: c.names, color: c.color, zodiac: c.zodiac, strokes });
else warnings.push(`${c.id}: no drawable strokes after pruning — constellation dropped`);
}
return { figures, warnings };
}
← Astrarium