1 /*
2  # This file is part of the Astrometry.net suite.
3  # Licensed under a 3-clause BSD style license - see LICENSE
4  */
5 
6 #include <assert.h>
7 #include <string.h>
8 
9 #include "constellations.h"
10 
11 #include "stellarium-constellations.c"
12 
13 struct shortlong {
14     char* shortname;
15     char* longname;
16 };
17 typedef struct shortlong shortlong_t;
18 
19 /*
20  lynx -dump -nolist \
21  http://www.astro.wisc.edu/~dolan/constellations/abbrevs.html \
22  | awk '{L=""; for (i=3;i<=NF;i++) L=L (i>3?" ":"") $i;
23  print "{ \"" $2 "\", \"" L "\"},"}'
24  */
25 
26 /*
27  Note, these are in alphabetical order, while the Stellarium
28  constellations are listed in some other order.
29  */
30 shortlong_t shortlongmap[] = {
31     { "And", "Andromeda"},
32     { "Ant", "Antlia"},
33     { "Aps", "Apus"},
34     { "Aqr", "Aquarius"},
35     { "Aql", "Aquila"},
36     { "Ara", "Ara"},
37     { "Ari", "Aries"},
38     { "Aur", "Auriga"},
39     { "Boo", "Bootes"},
40     { "Cae", "Caelum"},
41     { "Cam", "Camelopardalis"},
42     { "Cnc", "Cancer"},
43     { "CVn", "Canes Venatici"},
44     { "CMa", "Canis Major"},
45     { "CMi", "Canis Minor"},
46     { "Cap", "Capricornus"},
47     { "Car", "Carina"},
48     { "Cas", "Cassiopeia"},
49     { "Cen", "Centaurus"},
50     { "Cep", "Cepheus"},
51     { "Cet", "Cetus"},
52     { "Cha", "Chamaeleon"},
53     { "Cir", "Circinus"},
54     { "Col", "Columba"},
55     { "Com", "Coma Berenices"},
56     { "CrA", "Corona Austrina"},
57     { "CrB", "Corona Borealis"},
58     { "Crv", "Corvus"},
59     { "Crt", "Crater"},
60     { "Cru", "Crux"},
61     { "Cyg", "Cygnus"},
62     { "Del", "Delphinus"},
63     { "Dor", "Dorado"},
64     { "Dra", "Draco"},
65     { "Equ", "Equuleus"},
66     { "Eri", "Eridanus"},
67     { "For", "Fornax"},
68     { "Gem", "Gemini"},
69     { "Gru", "Grus"},
70     { "Her", "Hercules"},
71     { "Hor", "Horologium"},
72     { "Hya", "Hydra"},
73     { "Hyi", "Hydrus"},
74     { "Ind", "Indus"},
75     { "Lac", "Lacerta"},
76     { "Leo", "Leo"},
77     { "LMi", "Leo Minor"},
78     { "Lep", "Lepus"},
79     { "Lib", "Libra"},
80     { "Lup", "Lupus"},
81     { "Lyn", "Lynx"},
82     { "Lyr", "Lyra"},
83     { "Men", "Mensa"},
84     { "Mic", "Microscopium"},
85     { "Mon", "Monoceros"},
86     { "Mus", "Musca"},
87     { "Nor", "Norma"},
88     { "Oct", "Octans"},
89     { "Oph", "Ophiuchus"},
90     { "Ori", "Orion"},
91     { "Pav", "Pavo"},
92     { "Peg", "Pegasus"},
93     { "Per", "Perseus"},
94     { "Phe", "Phoenix"},
95     { "Pic", "Pictor"},
96     { "Psc", "Pisces"},
97     { "PsA", "Piscis Austrinus"},
98     { "Pup", "Puppis"},
99     { "Pyx", "Pyxis"},
100     { "Ret", "Reticulum"},
101     { "Sge", "Sagitta"},
102     { "Sgr", "Sagittarius"},
103     { "Sco", "Scorpius"},
104     { "Scl", "Sculptor"},
105     { "Sct", "Scutum"},
106     { "Ser", "Serpens"},
107     { "Sex", "Sextans"},
108     { "Tau", "Taurus"},
109     { "Tel", "Telescopium"},
110     { "Tri", "Triangulum"},
111     { "TrA", "Triangulum Australe"},
112     { "Tuc", "Tucana"},
113     { "UMa", "Ursa Major"},
114     { "UMi", "Ursa Minor"},
115     { "Vel", "Vela"},
116     { "Vir", "Virgo"},
117     { "Vol", "Volans"},
118     { "Vul", "Vulpecula"},
119 };
120 
constellations_n()121 int constellations_n() {
122     return constellations_N;
123 }
124 
check_const_num(int i)125 static void check_const_num(int i) {
126     assert(i >= 0);
127     assert(i < constellations_N);
128 }
129 
check_star_num(int i)130 static void check_star_num(int i) {
131     assert(i >= 0);
132     assert(i < stars_N);
133 }
134 
constellations_short_to_longname(const char * shortname)135 const char* constellations_short_to_longname(const char* shortname) {
136     int i;
137     int NL = sizeof(shortlongmap) / sizeof(shortlong_t);
138     for (i=0; i<NL; i++)
139         if (!strcasecmp(shortname, shortlongmap[i].shortname))
140             return shortlongmap[i].longname;
141     return NULL;
142 }
143 
constellations_get_longname(int c)144 const char* constellations_get_longname(int c) {
145     check_const_num(c);
146     return constellations_short_to_longname(shortnames[c]);
147 }
148 
constellations_get_shortname(int c)149 const char* constellations_get_shortname(int c) {
150     check_const_num(c);
151     return shortnames[c];
152 }
153 
constellations_get_nlines(int c)154 int constellations_get_nlines(int c) {
155     check_const_num(c);
156     return constellation_nlines[c];
157 }
158 
constellations_get_lines(int c)159 il* constellations_get_lines(int c) {
160     il* list;
161     const int* lines;
162     int i;
163     check_const_num(c);
164     list = il_new(16);
165     lines = constellation_lines[c];
166     for (i=0; i<2*constellation_nlines[c]; i++) {
167         il_append(list, lines[i]);
168     }
169     return list;
170 }
171 
constellations_get_unique_stars(int c)172 il* constellations_get_unique_stars(int c) {
173     il* uniq;
174     const int* lines;
175     int i;
176     check_const_num(c);
177     uniq = il_new(16);
178     lines = constellation_lines[c];
179     for (i=0; i<2*constellation_nlines[c]; i++) {
180         il_insert_unique_ascending(uniq, lines[i]);
181     }
182     return uniq;
183 }
184 
constellations_get_line(int c,int i,int * ep1,int * ep2)185 void constellations_get_line(int c, int i, int* ep1, int* ep2) {
186     const int* lines;
187     check_const_num(c);
188     assert(i >= 0);
189     assert(i < constellation_nlines[c]);
190     lines = constellation_lines[c];
191     *ep1 = lines[2*i];
192     *ep2 = lines[2*i+1];
193 }
194 
constellations_get_lines_radec(int c)195 dl* constellations_get_lines_radec(int c) {
196     dl* list;
197     const int* lines;
198     int i;
199     check_const_num(c);
200     list = dl_new(16);
201     lines = constellation_lines[c];
202     for (i=0; i<constellation_nlines[c]*2; i++) {
203         int star = lines[i];
204         const double* radec = star_positions + star*2;
205         dl_append(list, radec[0]);
206         dl_append(list, radec[1]);
207     }
208     return list;
209 }
210 
constellations_get_star_radec(int s,double * ra,double * dec)211 void constellations_get_star_radec(int s, double* ra, double* dec) {
212     const double* radec;
213     check_star_num(s);
214     radec = star_positions + s*2;
215     *ra = radec[0];
216     *dec = radec[1];
217 }
218 
219