packdb.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:10k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // packdb.cpp
  2. //
  3. // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #define SPECTRAL_O 0
  13. #define SPECTRAL_B 1
  14. #define SPECTRAL_A 2
  15. #define SPECTRAL_F 3
  16. #define SPECTRAL_G 4
  17. #define SPECTRAL_K 5
  18. #define SPECTRAL_M 6
  19. #define SPECTRAL_R 7
  20. #define SPECTRAL_S 8
  21. #define SPECTRAL_N 9
  22. #define SPECTRAL_WC 10
  23. #define SPECTRAL_WN 11
  24. // Stellar remnants
  25. #define SPECTRAL_WHITE_DWARF  16
  26. #define SPECTRAL_NEUTRON_STAR 32
  27. #define SPECTRAL_UNKNOWN  255
  28. #define LUM_Ia0    0
  29. #define LUM_Ia     1
  30. #define LUM_Ib     2
  31. #define LUM_II     3
  32. #define LUM_III    4
  33. #define LUM_IV     5
  34. #define LUM_V      6
  35. #define LUM_VI     7
  36. #define ID_NONE -1
  37. #define HD_CATALOG          0x00000000
  38. #define HIPPARCOS_CATALOG   0x10000000
  39. #define BINWRITE(fp, n) fwrite(&(n), sizeof(n), 1, (fp))
  40. typedef struct {
  41.     char colorType;
  42.     char subType;
  43.     char luminosity;
  44.     float colorIndex;
  45. } SpectralType;
  46. typedef struct {
  47.     int HIP;          /* HIPPARCOS catalogue number */
  48.     int HD;           /* HD catalogue number */
  49.     float appMag;     /* Apparent magnitude  */
  50.     float RA;         /* 0 -- 24 hours       */
  51.     float dec;        /* -90 -- +90 degrees  */
  52.     float parallax;   /* in milliarcseconds  */
  53.     char spectral[13];
  54.     unsigned char parallaxError;
  55. } Star;
  56. typedef struct {
  57.     int HD;
  58.     char *commonName;
  59.     char *altName;
  60. } HDNameEnt;
  61. /* Hardcoded file names */
  62. #define HIPPARCOS_MAIN_DB "hip_main.dat"
  63. #define COMMON_NAMES_DB   "hdnames.dat"
  64. HDNameEnt *hdNames;
  65. int nHDNames;
  66. Star *Stars;
  67. int nStars;
  68. int CompareHDNameEnt(const void *a, const void *b)
  69. {
  70.     int hda = ((HDNameEnt *) a)->HD;
  71.     int hdb = ((HDNameEnt *) b)->HD;
  72.     if (hda <  hdb)
  73. return -1;
  74.     else if (hda > hdb)
  75. return 1;
  76.     else
  77. return 0;
  78. }
  79. unsigned short PackSpectralType(char *spectralType)
  80. {
  81.     unsigned short packed = 0;
  82.     unsigned short letter;
  83.     unsigned short number;
  84.     unsigned short luminosity = LUM_V;
  85.     int i = 0;
  86.     // Subdwarves (luminosity class VI) are prefixed with sd
  87.     if (spectralType[i] == 's' && spectralType[i + 1] == 'd')
  88.     {
  89.         luminosity = LUM_VI;
  90.         i += 2;
  91.     }
  92.     switch (spectralType[i])
  93.     {
  94.       case 'O':
  95.         letter = SPECTRAL_O;
  96.         break;
  97.       case 'B':
  98.         letter = SPECTRAL_B;
  99.         break;
  100.       case 'A':
  101.         letter = SPECTRAL_A;
  102.         break;
  103.       case 'F':
  104.         letter = SPECTRAL_F;
  105.         break;
  106.       case 'G':
  107.         letter = SPECTRAL_G;
  108.         break;
  109.       case 'K':
  110.         letter = SPECTRAL_K;
  111.         break;
  112.       case 'M':      
  113.         letter = SPECTRAL_M;
  114.         break;
  115.       case 'R':
  116.         letter = SPECTRAL_R;
  117.         break;
  118.       case 'N':
  119.         letter = SPECTRAL_N;
  120.         break;
  121.       case 'S':
  122.         letter = SPECTRAL_S;
  123.         break;
  124.       case 'W':
  125. i++;
  126. if (spectralType[i] == 'C')
  127.       letter = SPECTRAL_WC;
  128. else if (spectralType[i] == 'N')
  129.     letter = SPECTRAL_WN;
  130. else
  131.     i--;
  132. break;
  133.       case 'D':
  134.         letter = SPECTRAL_WHITE_DWARF;
  135. break;
  136.       default:
  137.         letter = SPECTRAL_UNKNOWN;
  138.         break;
  139.     }
  140.     if (letter == SPECTRAL_WHITE_DWARF)
  141.         return letter << 8;
  142.     i++;
  143.     if (spectralType[i] >= '0' && spectralType[i] <= '9')
  144.         number = spectralType[i] - '0';
  145.     else
  146.         number = 0;
  147.     if (luminosity != LUM_VI)
  148.     {
  149.         i++;
  150.         luminosity = LUM_V;
  151.         while (i < 13 && spectralType[i] != '') {
  152.             if (spectralType[i] == 'I') {
  153.                 if (spectralType[i + 1] == 'I') {
  154.                     if (spectralType[i + 2] == 'I') {
  155.                         luminosity = LUM_III;
  156.                     } else {
  157.                         luminosity = LUM_II;
  158.                     }
  159.                 } else if (spectralType[i + 1] == 'V') {
  160.                     luminosity = LUM_IV;
  161.                 } else if (spectralType[i + 1] == 'a') {
  162.                     if (spectralType[i + 2] == '0')
  163.                         luminosity = LUM_Ia0;
  164.                     else
  165.                         luminosity = LUM_Ia;
  166.                 } else if (spectralType[i + 1] == 'b') {
  167.                     luminosity = LUM_Ib;
  168.                 } else {
  169.                     luminosity = LUM_Ib;
  170.                 }
  171.                 break;
  172.             } else if (spectralType[i] == 'V') {
  173.                 if (spectralType[i + 1] == 'I')
  174.                     luminosity = LUM_VI;
  175.                 else
  176.                     luminosity = LUM_V;
  177.                 break;
  178.             }
  179.             i++;
  180.         }
  181.     }
  182.     return (letter << 8) | (number << 4) | luminosity;
  183. }
  184. HDNameEnt *ReadCommonNames(FILE *fp)
  185. {
  186.     char buf[256];
  187.     int i;
  188.     hdNames = (HDNameEnt *) malloc(sizeof(HDNameEnt) * 3000);
  189.     if (hdNames == NULL)
  190. return NULL;
  191.     for (i = 0; ; i++) {
  192. char *name1, *name2, len;
  193. if (fgets(buf, 256, fp) == NULL)
  194.     break;
  195. /* Strip trailing newline */
  196. len = strlen(buf);
  197. if (len > 0 && buf[len - 1] == 'n')
  198.     buf[len - 1] = '';
  199. name1 = index(buf, ':');
  200. if (name1 == NULL)
  201.     break;
  202. name1[0] = '';
  203. name1++;
  204. name2 = index(name1, ':');
  205. if (name2 == NULL)
  206.     break;
  207. name2[0] = '';
  208. name2++;
  209. {
  210.     int hd;
  211.     if (sscanf(buf, "%d", &hd) != 1)
  212. break;
  213.     hdNames[i].HD = hd;
  214.     if (name1[0] != '') {
  215.         hdNames[i].commonName = (char *) malloc(strlen(name1) + 1);
  216. strcpy(hdNames[i].commonName, name1);
  217.     } else if (name2[0] != '') {
  218. hdNames[i].commonName = (char *) malloc(strlen(name2) + 1);
  219. strcpy(hdNames[i].commonName, name2);
  220.     }
  221. }
  222.     }
  223.     nHDNames = i;
  224.     qsort(hdNames, nHDNames, sizeof(HDNameEnt), CompareHDNameEnt);
  225.     return hdNames;
  226. }
  227. char *LookupName(int HD)
  228. {
  229.     HDNameEnt key;
  230.     HDNameEnt *found;
  231.     key.HD = HD;
  232.     found = (HDNameEnt *) bsearch((void *) &key, (void *) hdNames,
  233.   nHDNames, sizeof(HDNameEnt),
  234.   CompareHDNameEnt);
  235.     if (found == NULL)
  236. return NULL;
  237.     else
  238. return found->commonName;
  239. }
  240. void WriteStar(FILE *fp, Star *star)
  241. {
  242.     unsigned short spectralType = PackSpectralType(star->spectral);
  243.     short appMag = (short) (star->appMag * 256);
  244.     unsigned int catalog_no;
  245.     if (star->HD != ID_NONE)
  246.         catalog_no = star->HD | HD_CATALOG;
  247.     else
  248.         catalog_no = star->HIP | HIPPARCOS_CATALOG;
  249.     BINWRITE(fp, catalog_no);
  250.     BINWRITE(fp, star->RA);
  251.     BINWRITE(fp, star->dec);
  252.     BINWRITE(fp, star->parallax);
  253.     BINWRITE(fp, appMag);
  254.     BINWRITE(fp, spectralType);
  255.     BINWRITE(fp, star->parallaxError);
  256. }
  257. #define HIPPARCOS_RECORD_LENGTH 512
  258. Star *ReadHipparcosCatalog(FILE *fp)
  259. {
  260.     char buf[HIPPARCOS_RECORD_LENGTH];
  261.     int i;
  262.     int maxStars = 120000;
  263.     Star *stars;
  264.     int nBright = 0, nGood = 0;
  265.     char nameBuf[20];
  266.     fprintf(stderr, "Attempting to allocate %d bytesn", maxStars * sizeof(Star));
  267.     stars = (Star *) malloc(maxStars * sizeof(Star));
  268.     if (stars == NULL) {
  269.         fprintf(stderr, "Unable to allocate memory for stars.n");
  270. return NULL;
  271.     }
  272.     for (i = 0; ; i++) {
  273. int hh, mm, deg;
  274. float seconds;
  275. float parallaxError;
  276. char degSign;
  277. if (fgets(buf, HIPPARCOS_RECORD_LENGTH, fp) == NULL)
  278.     break;
  279. sscanf(buf + 2, "%d", &stars[i].HIP);
  280. if (sscanf(buf + 390, "%d", &stars[i].HD) != 1)
  281.     stars[i].HD = ID_NONE;
  282. sscanf(buf + 41, "%f", &stars[i].appMag);
  283. sscanf(buf + 79, "%f", &stars[i].parallax);
  284. sscanf(buf + 17, "%d %d %f", &hh, &mm, &seconds);
  285. stars[i].RA = hh + (float) mm / 60.0f + (float) seconds / 3600.0f;
  286. sscanf(buf + 29, "%c%d %d %f", &degSign, &deg, &mm, &seconds);
  287. stars[i].dec = deg + (float) mm / 60.0f + (float) seconds / 3600.0f;
  288. if (degSign == '-')
  289.     stars[i].dec = -stars[i].dec;
  290. sscanf(buf + 435, "%12s", &stars[i].spectral);
  291. sscanf(buf + 119, "%f", &parallaxError);
  292. if (stars[i].parallax <= 0 || parallaxError / stars[i].parallax > 1)
  293.         {
  294.     stars[i].parallaxError = (unsigned char) 255;
  295. }
  296. else
  297.         {
  298.     stars[i].parallaxError =
  299. (unsigned char) (parallaxError / stars[i].parallax * 200);
  300. }
  301. if (/* stars[i].appMag < 4.0f */
  302.             stars[i].parallax > 0 && 3260 / stars[i].parallax < 20) {
  303.     nBright++;
  304. #if 0
  305.     if (parallaxError / stars[i].parallax > 0.25f ||
  306. parallaxError / stars[i].parallax < 0.0f) {
  307. #endif
  308.     if (0) {
  309. char *name = LookupName(stars[i].HD);
  310. if (name == NULL) {
  311.     if (stars[i].HD != ID_NONE) {
  312. sprintf(nameBuf, "HD%d", stars[i].HD);
  313. name = nameBuf;
  314.     } else {
  315. sprintf(nameBuf, "HIP%d", stars[i].HIP);
  316. name = nameBuf;
  317.     }
  318. }
  319. printf("%-20s %5.2f %6.2f %3d%% %12s %5.2f %5.2fn",
  320.        name,
  321.        stars[i].appMag,
  322.        3260.0f / stars[i].parallax,
  323.        (int) (100.0f * parallaxError / stars[i].parallax),
  324.        stars[i].spectral,
  325.        stars[i].RA, stars[i].dec);
  326.     } else {
  327. nGood++;
  328.     }
  329. }
  330.     }
  331.     nStars = i;
  332.     printf("Stars: %d, Bright: %d, Good: %dn", nStars, nBright, nGood);
  333.     return stars;
  334. }
  335. int main(int argc, char *argv[])
  336. {
  337.     FILE *fp;
  338.     fp = fopen(COMMON_NAMES_DB, "r");
  339.     if (fp == NULL) {
  340. fprintf(stderr, "Error opening %sn", COMMON_NAMES_DB);
  341. return 1;
  342.     }
  343.     hdNames = ReadCommonNames(fp);
  344.     fclose(fp);
  345.     fp = NULL;
  346.     if (hdNames == NULL) {
  347. fprintf(stderr, "Error reading names file.n");
  348. return 1;
  349.     }
  350.     fp = fopen(HIPPARCOS_MAIN_DB, "r");
  351.     if (fp == NULL) {
  352. fprintf(stderr, "Error opening %sn", HIPPARCOS_MAIN_DB);
  353. return 1;
  354.     }
  355.     Stars = ReadHipparcosCatalog(fp);
  356.     fclose(fp);
  357.     if (Stars == NULL) {
  358. fprintf(stderr, "Error reading HIPPARCOS database.");
  359. return 1;
  360.     }
  361. #if 0
  362.     {
  363. int i;
  364. for (i = 0; i < nStars; i++) {
  365.     if (Stars[i].spectral[0] == 'O') {
  366. char *name = LookupName(Stars[i].HD);
  367. if (name != NULL)
  368.     printf("%s ", name);
  369. printf("%6d %6.3f %6.3f %sn",
  370.        Stars[i].HD, Stars[i].RA, Stars[i].dec, Stars[i].spectral);
  371.     }
  372. }
  373.     }
  374. #endif
  375.     {
  376.         int i;
  377.         FILE *fp = fopen("out", "wb");
  378.         if (fp == NULL) {
  379.    fprintf(stderr, "Error opening output file.n");
  380.            exit(1);
  381.         }
  382. BINWRITE(fp, nStars);
  383.         for (i = 0; i < nStars; i++)
  384.            WriteStar(fp, &Stars[i]);
  385.         
  386.         fclose(fp);
  387.     }
  388.     printf("Stars in catalog = %dn", nStars);
  389. }