vsoptrunc-rect.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. // max error in AU
  17. static double maxError[6] = {
  18.     1e-6, 5e-7, 1e-7, 5e-8, 1e-8, 5e-9
  19. };
  20. // Command line args:
  21. //    vsoptrunc-rect <body name> <error multiplier>
  22. int main(int argc, char* argv[])
  23. {
  24.     char buf[512];
  25.     int degree = 0;
  26.     int xyz = 0;
  27.     char* planet = "earth";
  28.     int term = 0;
  29.     int truncSeries = 0;
  30.     double a0 = 1.0;
  31.     if (argc > 1)
  32.         planet = argv[1];
  33.     if (argc > 2)
  34.         a0 = atof(argv[2]);
  35.     while (fgets(buf, LINE_LENGTH + 1, stdin))
  36.     {
  37.         if (!strncmp(buf, " VSOP87", 7))
  38.         {
  39.             int d = (int) buf[59] - (int) '0';
  40.             if (d < 0 || d > 5)
  41.             {
  42.                 fprintf(stderr, "Bad degree in VSOP data filen");
  43.                 exit(1);
  44.             }
  45.             if (d < degree)
  46.                 xyz++;
  47.             if (xyz > 2)
  48.             {
  49.                 fprintf(stderr, "More than three variables in VSOP file?n");
  50.                 exit(1);
  51.             }
  52.             degree = d;
  53.             if (degree != 0 || xyz != 0)
  54.                 printf("};nn");
  55.             printf("static VSOPTerm %s_%c%d[] = {n",
  56.                    planet, "XYZ"[xyz], degree);
  57.             term = 0;
  58.             truncSeries = 0;
  59.                    
  60.         }
  61.         else
  62.         {
  63.             double a, b, c;
  64.             double maxerr;
  65.             if (sscanf(buf + 80, " %lf %lf %lf", &a, &b, &c) != 3)
  66.             {
  67.                 fprintf(stderr, "Bad numbers in VSOP filen");
  68.                 exit(1);
  69.             }
  70.             term++;
  71.             maxerr = 2 * sqrt(term) * a;
  72.             if (!truncSeries)
  73.             {
  74.                 if (maxerr < maxError[degree] * a0)
  75.                 {
  76.                     truncSeries = 1;
  77.                     if (term == 1)
  78.                         printf("    { 0, 0, 0 },n");
  79.                     printf("    // %d terms retainedn", term - 1);
  80.                 }
  81.             }
  82.             // printf("%.12lf   ", maxerr);
  83.             if (!truncSeries)
  84.                 printf("    { %.12g, %.12g, %.12g },n", a, b, c);
  85.         }
  86.     }
  87.     printf("};nn");
  88.     return 0;
  89. }