vsoptrunc-sph.c
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // Copyright (C) 2004, Chris Laurel <claurel@shatters.net>
  2. //
  3. // This program is free software; you can redistribute it and/or
  4. // modify it under the terms of the GNU General Public License
  5. // as published by the Free Software Foundation; either version 2
  6. // of the License, or (at your option) any later version.
  7. //
  8. // vsoptruct-rect.c
  9. // Truncate VSOP87 series for rectangular variables to a specified error and
  10. // generate C source code
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <math.h>
  15. #define LINE_LENGTH 134
  16. static double angleError[6] = {
  17.     5e-6, 5e-7, 1e-7, 5e-8, 5e-8, 1e-8
  18. };
  19. // max error in AU
  20. static double distError[6] = {
  21.     1e-6, 5e-7, 1e-7, 5e-8, 1e-8, 5e-9
  22. };
  23. // Command line args:
  24. //    vsoptrunc-sph <body name> <error multiplier>
  25. int main(int argc, char* argv[])
  26. {
  27.     char buf[512];
  28.     int degree = 0;
  29.     int lbr = 0;
  30.     char* planet = "earth";
  31.     int term = 0;
  32.     int truncSeries = 0;
  33.     double a0 = 1.0;
  34.     if (argc > 1)
  35.         planet = argv[1];
  36.     if (argc > 2)
  37.         a0 = atof(argv[2]);
  38.     while (fgets(buf, LINE_LENGTH + 1, stdin))
  39.     {
  40.         if (!strncmp(buf, " VSOP87", 7))
  41.         {
  42.             int d = (int) buf[59] - (int) '0';
  43.             if (d < 0 || d > 5)
  44.             {
  45.                 fprintf(stderr, "Bad degree in VSOP data filen");
  46.                 exit(1);
  47.             }
  48.             if (d < degree)
  49.                 lbr++;
  50.             if (lbr > 2)
  51.             {
  52.                 fprintf(stderr, "More than three variables in VSOP file?n");
  53.                 exit(1);
  54.             }
  55.             degree = d;
  56.             if (degree != 0 || lbr != 0)
  57.                 printf("};nn");
  58.             printf("static VSOPTerm %s_%c%d[] = {n",
  59.                    planet, "LBR"[lbr], degree);
  60.             term = 0;
  61.             truncSeries = 0;
  62.                    
  63.         }
  64.         else
  65.         {
  66.             double a, b, c;
  67.             double maxerr;
  68.             if (sscanf(buf + 80, " %lf %lf %lf", &a, &b, &c) != 3)
  69.             {
  70.                 fprintf(stderr, "Bad numbers in VSOP filen");
  71.                 exit(1);
  72.             }
  73.             term++;
  74.             maxerr = 2 * sqrt(term) * a;
  75.             if (!truncSeries)
  76.             {
  77.                 if (lbr == 2)
  78.                 {
  79.                     if (maxerr < distError[degree] * a0)
  80.                     {
  81.                         truncSeries = 1;
  82.                         if (term == 1)
  83.                             printf("    { 0, 0, 0 },n");
  84.                         printf("    // %d terms retainedn", term - 1);
  85.                     }
  86.                 }
  87.                 else
  88.                 {
  89.                     if (maxerr < angleError[degree])
  90.                     {
  91.                         truncSeries = 1;
  92.                         if (term == 1)
  93.                             printf("    { 0, 0, 0 },n");
  94.                         printf("    // %d terms retainedn", term - 1);
  95.                     }
  96.                 }
  97.             }
  98.             // printf("%.12g   ", maxerr);
  99.             if (!truncSeries)
  100.                 printf("    { %.12g, %.12g, %.12g },n", a, b, c);
  101.         }
  102.     }
  103.     printf("};nn");
  104.     return 0;
  105. }