util.c (4833B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "sky.h" 5 6 double PI_180 = 0.0174532925199432957692369; 7 double TWOPI = 6.2831853071795864769252867665590057683943387987502; 8 double LN2 = 0.69314718055994530941723212145817656807550013436025; 9 static double angledangle=(180./PI)*MILLIARCSEC; 10 11 #define rint scatrint 12 13 int 14 rint(char *p, int n) 15 { 16 int i=0; 17 18 while(*p==' ' && n) 19 p++, --n; 20 while(n--) 21 i=i*10+*p++-'0'; 22 return i; 23 } 24 25 DAngle 26 dangle(Angle angle) 27 { 28 return angle*angledangle; 29 } 30 31 Angle 32 angle(DAngle dangle) 33 { 34 return dangle/angledangle; 35 } 36 37 double 38 rfloat(char *p, int n) 39 { 40 double i, d=0; 41 42 while(*p==' ' && n) 43 p++, --n; 44 if(*p == '+') 45 return rfloat(p+1, n-1); 46 if(*p == '-') 47 return -rfloat(p+1, n-1); 48 while(*p == ' ' && n) 49 p++, --n; 50 if(n == 0) 51 return 0.0; 52 while(n-- && *p!='.') 53 d = d*10+*p++-'0'; 54 if(n <= 0) 55 return d; 56 p++; 57 i = 1; 58 while(n--) 59 d+=(*p++-'0')/(i*=10.); 60 return d; 61 } 62 63 int 64 sign(int c) 65 { 66 if(c=='-') 67 return -1; 68 return 1; 69 } 70 71 char* 72 hms(Angle a) 73 { 74 static char buf[20]; 75 double x; 76 int h, m, s, ts; 77 78 x=DEG(a)/15; 79 x += 0.5/36000.; /* round up half of 0.1 sec */ 80 h = floor(x); 81 x -= h; 82 x *= 60; 83 m = floor(x); 84 x -= m; 85 x *= 60; 86 s = floor(x); 87 x -= s; 88 ts = 10*x; 89 sprint(buf, "%dh%.2dm%.2d.%ds", h, m, s, ts); 90 return buf; 91 } 92 93 char* 94 dms(Angle a) 95 { 96 static char buf[20]; 97 double x; 98 int sign, d, m, s, ts; 99 100 x = DEG(a); 101 sign='+'; 102 if(a<0){ 103 sign='-'; 104 x=-x; 105 } 106 x += 0.5/36000.; /* round up half of 0.1 arcsecond */ 107 d = floor(x); 108 x -= d; 109 x *= 60; 110 m = floor(x); 111 x -= m; 112 x *= 60; 113 s = floor(x); 114 x -= s; 115 ts = floor(10*x); 116 sprint(buf, "%c%d°%.2d'%.2d.%d\"", sign, d, m, s, ts); 117 return buf; 118 } 119 120 char* 121 ms(Angle a) 122 { 123 static char buf[20]; 124 double x; 125 int d, m, s, ts; 126 127 x = DEG(a); 128 x += 0.5/36000.; /* round up half of 0.1 arcsecond */ 129 d = floor(x); 130 x -= d; 131 x *= 60; 132 m = floor(x); 133 x -= m; 134 x *= 60; 135 s = floor(x); 136 x -= s; 137 ts = floor(10*x); 138 if(d != 0) 139 sprint(buf, "%d°%.2d'%.2d.%d\"", d, m, s, ts); 140 else 141 sprint(buf, "%.2d'%.2d.%d\"", m, s, ts); 142 return buf; 143 } 144 145 char* 146 hm(Angle a) 147 { 148 static char buf[20]; 149 double x; 150 int h, m, n; 151 152 x = DEG(a)/15; 153 x += 0.5/600.; /* round up half of tenth of minute */ 154 h = floor(x); 155 x -= h; 156 x *= 60; 157 m = floor(x); 158 x -= m; 159 x *= 10; 160 n = floor(x); 161 sprint(buf, "%dh%.2d.%1dm", h, m, n); 162 return buf; 163 } 164 165 char* 166 hm5(Angle a) 167 { 168 static char buf[20]; 169 double x; 170 int h, m; 171 172 x = DEG(a)/15; 173 x += 2.5/60.; /* round up 2.5m */ 174 h = floor(x); 175 x -= h; 176 x *= 60; 177 m = floor(x); 178 m -= m % 5; 179 sprint(buf, "%dh%.2dm", h, m); 180 return buf; 181 } 182 183 char* 184 dm(Angle a) 185 { 186 static char buf[20]; 187 double x; 188 int sign, d, m, n; 189 190 x = DEG(a); 191 sign='+'; 192 if(a<0){ 193 sign='-'; 194 x=-x; 195 } 196 x += 0.5/600.; /* round up half of tenth of arcminute */ 197 d = floor(x); 198 x -= d; 199 x *= 60; 200 m = floor(x); 201 x -= m; 202 x *= 10; 203 n = floor(x); 204 sprint(buf, "%c%d°%.2d.%.1d'", sign, d, m, n); 205 return buf; 206 } 207 208 char* 209 deg(Angle a) 210 { 211 static char buf[20]; 212 double x; 213 int sign, d; 214 215 x = DEG(a); 216 sign='+'; 217 if(a<0){ 218 sign='-'; 219 x=-x; 220 } 221 x += 0.5; /* round up half degree */ 222 d = floor(x); 223 sprint(buf, "%c%d°", sign, d); 224 return buf; 225 } 226 227 char* 228 getword(char *ou, char *in) 229 { 230 int c; 231 232 for(;;) { 233 c = *in++; 234 if(c == ' ' || c == '\t') 235 continue; 236 if(c == 0) 237 return 0; 238 break; 239 } 240 241 if(c == '\'') 242 for(;;) { 243 if(c >= 'A' && c <= 'Z') 244 c += 'a' - 'A'; 245 *ou++ = c; 246 c = *in++; 247 if(c == 0) 248 return 0; 249 if(c == '\'') { 250 *ou = 0; 251 return in-1; 252 } 253 } 254 for(;;) { 255 if(c >= 'A' && c <= 'Z') 256 c += 'a' - 'A'; 257 *ou++ = c; 258 c = *in++; 259 if(c == ' ' || c == '\t' || c == 0) { 260 *ou = 0; 261 return in-1; 262 } 263 } 264 } 265 266 /* 267 * Read formatted angle. Must contain no embedded blanks 268 */ 269 Angle 270 getra(char *p) 271 { 272 Rune r; 273 char *q; 274 Angle f, d; 275 int neg; 276 277 neg = 0; 278 d = 0; 279 while(*p == ' ') 280 p++; 281 for(;;) { 282 if(*p == ' ' || *p=='\0') 283 goto Return; 284 if(*p == '-') { 285 neg = 1; 286 p++; 287 } 288 if(*p == '+') { 289 neg = 0; 290 p++; 291 } 292 q = p; 293 f = strtod(p, &q); 294 if(q > p) { 295 p = q; 296 } 297 p += chartorune(&r, p); 298 switch(r) { 299 default: 300 Return: 301 if(neg) 302 d = -d; 303 return RAD(d); 304 case 'h': 305 d += f*15; 306 break; 307 case 'm': 308 d += f/4; 309 break; 310 case 's': 311 d += f/240; 312 break; 313 case 0xB0: /* ° */ 314 d += f; 315 break; 316 case '\'': 317 d += f/60; 318 break; 319 case '\"': 320 d += f/3600; 321 break; 322 } 323 } 324 return 0; 325 } 326 327 double 328 xsqrt(double a) 329 { 330 331 if(a < 0) 332 return 0; 333 return sqrt(a); 334 } 335 336 Angle 337 dist(Angle ra1, Angle dec1, Angle ra2, Angle dec2) 338 { 339 double a; 340 341 a = sin(dec1) * sin(dec2) + 342 cos(dec1) * cos(dec2) * 343 cos(ra1 - ra2); 344 a = atan2(xsqrt(1 - a*a), a); 345 if(a < 0) 346 a = -a; 347 return a; 348 } 349 350 int 351 dogamma(Pix c) 352 { 353 float f; 354 355 f = c - gam.min; 356 if(f < 1) 357 f = 1; 358 359 if(gam.absgamma == 1) 360 c = f * gam.mult2; 361 else 362 c = exp(log(f*gam.mult1) * gam.absgamma) * 255; 363 if(c > 255) 364 c = 255; 365 if(gam.neg) 366 c = 255-c; 367 return c; 368 }