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