home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / ast40dos / charts.c < prev    next >
C/C++ Source or Header  |  1994-01-04  |  35KB  |  1,035 lines

  1. /*
  2. ** Astrolog (Version 4.00) File: charts.c
  3. **
  4. ** IMPORTANT NOTICE: the graphics database and chart display routines
  5. ** used in this program are Copyright (C) 1991-1993 by Walter D. Pullen
  6. ** (cruiser1@stein.u.washington.edu). Permission is granted to freely
  7. ** use and distribute these routines provided one doesn't sell,
  8. ** restrict, or profit from them in any way. Modification is allowed
  9. ** provided these notices remain with any altered or edited versions of
  10. ** the program.
  11. **
  12. ** The main planetary calculation routines used in this program have
  13. ** been Copyrighted and the core of this program is basically a
  14. ** conversion to C of the routines created by James Neely as listed in
  15. ** Michael Erlewine's 'Manual of Computer Programming for Astrologers',
  16. ** available from Matrix Software. The copyright gives us permission to
  17. ** use the routines for personal use but not to sell them or profit from
  18. ** them in any way.
  19. **
  20. ** The PostScript code within the core graphics routines are programmed
  21. ** and Copyright (C) 1992-1993 by Brian D. Willoughby
  22. ** (brianw@sounds.wa.com). Conditions are identical to those above.
  23. **
  24. ** The extended accurate ephemeris databases and formulas are from the
  25. ** calculation routines in the program "Placalc" and are programmed and
  26. ** Copyright (C) 1989,1991,1993 by Astrodienst AG and Alois Treindl
  27. ** (alois@azur.ch). The use of that source code is subject to
  28. ** regulations made by Astrodienst Zurich, and the code is not in the
  29. ** public domain. This copyright notice must not be changed or removed
  30. ** by any user of this program.
  31. **
  32. ** Initial programming 8/28,30, 9/10,13,16,20,23, 10/3,6,7, 11/7,10,21/1991.
  33. ** X Window graphics initially programmed 10/23-29/1991.
  34. ** PostScript graphics initially programmed 11/29-30/1992.
  35. ** Last code change made 12/31/1993.
  36. */
  37.  
  38. #include "astrolog.h"
  39.  
  40.  
  41. /*
  42. ******************************************************************************
  43. ** Single Chart Display Subprograms.
  44. ******************************************************************************
  45. */
  46.  
  47. /* Fill out tables based on the number of unrestricted planets in signs by  */
  48. /* element, signs by mode, as well as other values such as the number of    */
  49. /* objects in yang vs. yin signs, in various house hemispheres (north/south */
  50. /* and east/west), and the number in first six signs vs. second six signs.  */
  51. /* This is used by the -v chart listing and the sidebar in graphics charts. */
  52.  
  53. void CreateElemTable(elemode, elem, mo, tot, pos, abo, lef, lea)
  54. int elemode[4][3], *elem, *mo, *tot, *pos, *abo, *lef, *lea;
  55. {
  56.   int i, j;
  57.  
  58.   *tot = *pos = *abo = *lef = *lea = 0;    /* Initialize arrays     */
  59.   for (i = 0; i < 4; i++)                  /* and variables to zero */
  60.     elem[i] = 0;
  61.   for (j = 0; j < 3; j++)
  62.     mo[j] = 0;
  63.   for (i = 0; i < 4; i++)
  64.     for (j = 0; j < 3; j++)
  65.       elemode[i][j] = 0;
  66.  
  67.   /* Calculate number of objects in each element, mode, hemisphere, etc. */
  68.  
  69.   for (i = 1; i <= total; i++) if (!ignore[i]) {
  70.     (*tot)++;
  71.     j = ZTOS(planet[i]);
  72.     elemode[(j-1)&3][(j-1)%3]++;
  73.     elem[(j-1)&3]++; mo[(j-1)%3]++;
  74.     *pos += (j & 1);
  75.     *lea += (j < _LIB);
  76.     j = inhouse[i];
  77.     *abo += (j >= _LIB);
  78.     *lef += (j < _CAN || j >= _CAP);
  79.   }
  80. }
  81.  
  82.  
  83. /* Print the straight listing of planet and house positions and specified */
  84. /* by the -v switch, along with the element table, etc.                   */
  85.  
  86. void ChartLocation()
  87. {
  88.   int elemode[4][3], elem[4], mo[3], pos, abo, lef, lea;
  89.   int count, i, j, k;
  90.  
  91.   CreateElemTable(elemode, elem, mo, &count, &pos, &abo, &lef, &lea);
  92.  
  93.   /* Print header showing time and date of the chart being displayed. */
  94.  
  95.   AnsiColor(WHITE);
  96.   fprintf(S, "%s %s chart ", appname, VERSION);
  97.   if (Mon == -1)
  98.     fprintf(S, "(no time or space)\n");
  99.   else if (relation == DASHrc)
  100.     fprintf(S, "(composite)\n");
  101.   else {
  102.     i = (int) (FRACT(dabs(Tim))*100.0+ROUND);
  103.     j = (int) (FRACT(dabs(Zon))*100.0+ROUND);
  104.     fprintf(S, "for %s %s",
  105.       CharDate(Mon, Day, Yea, TRUE), CharTime((int)Tim, i));
  106.     fprintf(S, " (%c%.0f:%02d GMT) ",
  107.       Zon > 0.0 ? '-' : '+', dabs(Zon), j);
  108.     fprintf(S, "%s\n", CharLocation(Lon, Lat, 100.0));
  109.   }
  110.  
  111. #ifdef INTERPRET
  112.   if (interpret) {            /* Print an interpretation if -I in effect. */
  113.     if (relation == DASHr)
  114.       InterpretSynastry();    /* Print synastry interpretaion for -r -I.  */
  115.     else
  116.       InterpretLocation();    /* Do normal interpretation for just -v -I. */
  117.     return;
  118.   }
  119. #endif
  120.   AnsiColor(DEFAULT);
  121.   fprintf(S, "Body  Locat. Ret. Decl. Rul.      House  Rul. Veloc.    ");
  122.   fprintf(S, "%s Houses.\n\n", systemname[housesystem]);
  123.  
  124.   /* Ok, now print out each location of each object. */
  125.  
  126.   for (i = 1, j = 1; i <= BASE; i++, j++) {
  127.     if (i > OBJECTS && (i <= C_HI || ignore[i]))
  128.       continue;
  129.     while (i <= OBJECTS && j <= OBJECTS && ignore[j])
  130.       j++;
  131.     if (i <= OBJECTS && j > OBJECTS)
  132.       PrintTab(' ', 51);
  133.     else {
  134.       if (i > OBJECTS)
  135.         j = i;
  136.       AnsiColor(objectansi[j]);
  137.       fprintf(S, "%-4.4s: ", objectname[j]);
  138.       PrintZodiac(planet[j]);
  139.       fprintf(S, " %c ", ret[j] >= 0.0 ? ' ' : 'R');
  140.       if (j <= THINGS || j > OBJECTS)
  141.         PrintAltitude(planetalt[i]);
  142.       else
  143.         fprintf(S, "_______");
  144.       fprintf(S, " (%c)", Dignify(j, ZTOS(planet[i])));
  145.       k = inhouse[j];
  146.       AnsiColor(signansi(k));
  147.       fprintf(S, " [%2d%c%c house]", k, post[k][0], post[k][1]);
  148.       AnsiColor(DEFAULT);
  149.       fprintf(S, " [%c] ", Dignify(j, k));
  150.       if ((j != _MOO || placalc) && (IsObject(j) || (j == _NOD && placalc)))
  151.         fprintf(S, RTOD(dabs(ret[j])) < 10.0 ? "%c%5.3f" : "%c%5.2f",
  152.           ret[i] < 0.0 ? '-' : '+', RTOD(dabs(ret[j])));
  153.       else
  154.         fprintf(S, "______");
  155.     }
  156.  
  157.     /* For some lines, we have to append the house cusp positions. */
  158.  
  159.     if (i <= SIGNS) {
  160.       fprintf(S, "  -  ");
  161.       AnsiColor(signansi(i));
  162.       fprintf(S, "House cusp %2d: ", i);
  163.       PrintZodiac(house[i]);
  164.     }
  165.  
  166.     /* For some lines, we have to append the element table information. */
  167.  
  168.     if (i == SIGNS+2)
  169.       fprintf(S, "     Car Fix Mut TOT");
  170.     else if (i > SIGNS+2 && i < SIGNS+7) {
  171.       k = i-(SIGNS+2)-1;
  172.       AnsiColor(elemansi[k]);
  173.       fprintf(S, "  %c%c%c%3d %3d %3d %3d",
  174.         element[k][0], element[k][1], element[k][2],
  175.         elemode[k][0], elemode[k][1], elemode[k][2], elem[k]);
  176.       AnsiColor(DEFAULT);
  177.     } else if (i == SIGNS+7)
  178.       fprintf(S, "  TOT %2d %3d %3d %3d", mo[0], mo[1], mo[2], count);
  179.     else if (i == OBJECTS)
  180.       PrintTab(' ', 23);
  181.     else if (i >= U_LO)
  182.       fprintf(S, "  Uranian #%d", i-U_LO+1);
  183.     switch (i-SIGNS-1) {
  184.     case 1: fprintf(S, "   +:%2d", pos);       break;
  185.     case 2: fprintf(S, "   -:%2d", count-pos); break;
  186.     case 3: fprintf(S, "   M:%2d", abo);       break;
  187.     case 4: fprintf(S, "   N:%2d", count-abo); break;
  188.     case 5: fprintf(S, "   A:%2d", lef);       break;
  189.     case 6: fprintf(S, "   D:%2d", count-lef); break;
  190.     case 7: fprintf(S,    "<:%2d", lea);       break;
  191.     }
  192.     printl();
  193.   }
  194.  
  195.   /* Do another loop to print out the stars in their specified order. */
  196.  
  197.   if (universe) for (i = S_LO; i <= S_HI; i++) if (!ignore[i]) {
  198.     j = BASE+starname[i-BASE];
  199.     AnsiColor(objectansi[j]);
  200.     fprintf(S, "%.4s: ", objectname[j]);
  201.     PrintZodiac(planet[j]);
  202.     fprintf(S, "   ");
  203.     PrintAltitude(planetalt[j]);
  204.     k = inhouse[j];
  205.     AnsiColor(signansi(k));
  206.     fprintf(S, "     [%2d%c%c house]", k, post[k][0], post[k][1]);
  207.     AnsiColor(DEFAULT);
  208.     fprintf(S, "     ______  Star #%2d: %5.2f\n", i-BASE, starbright[j-BASE]);
  209.   }
  210. }
  211.  
  212.  
  213. /* Print out the aspect and midpoint grid for a chart, as specified with the */
  214. /* -g switch. (Each grid row takes up 4 lines of text.)                      */
  215.  
  216. void ChartGrid()
  217. {
  218.   int x, y, r, x1, y1, temp;
  219.  
  220. #ifdef INTERPRET
  221.   if (interpret) {    /* Print interpretation instead if -I in effect. */
  222.     InterpretGrid();
  223.     return;
  224.   }
  225. #endif
  226.  
  227.   for (y1 = 0, y = 1; y <= total; y++) if (!ignore[