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

  1. /*
  2. ** Astrolog (Version 4.00) File: xcharts.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. #ifdef GRAPH
  41.  
  42. /*
  43. ******************************************************************************
  44. ** Single Chart Graphics Subprograms.
  45. ******************************************************************************
  46. */
  47.  
  48. /* Given a string, draw it on the screen using the given color. The       */
  49. /* position of the text is based the saved positions of where we drew the */
  50. /* text the last time the routine was called, being either directly below */
  51. /* in the same column or in the same row just to the right. This is used  */
  52. /* by the sidebar drawing routine to print a list of text on the chart.   */
  53.  
  54. int DrawPrint(string, m, n)
  55. char *string;
  56. int m, n;
  57. {
  58.   static int x0, x, y;
  59.  
  60.   if (string == NULL) {    /* Null string means just initialize position. */
  61.     x0 = x = m; y = n;
  62.     return y;
  63.   }
  64.   if (y >= charty)    /* Don't draw if we've scrolled off the chart bottom. */
  65.     return y;
  66.   DrawColor(m);
  67.   DrawText(string, x, y, -1);
  68.  
  69.   /* If the second parameter is TRUE, we stay on the same line, otherwise */
  70.   /* when FALSE we go to the next line at the original column setting.    */
  71.  
  72.   if (n)
  73.     x += StringLen(string)*FONTX*scalet;
  74.   else {
  75.     x = x0;
  76.     n = y;
  77.     y += FONTY*scalet;
  78.   }
  79.   return y;
  80. }
  81.  
  82.  
  83. /* Print text showing the chart information and house and planet positions */
  84. /* of a chart in a "sidebar" to the right of the chart in question. This   */
  85. /* is always done for the -v and -w graphic wheel charts unless the -v0    */
  86. /* switch flag is also set, in which case none of the stuff here is done.  */
  87.  
  88. void DrawInfo()
  89. {
  90.   char string[STRING];
  91.   int elemode[4][3], elem[4], mo[3], tot, pos, abo, lef, lea, i, y, a, s;
  92.  
  93. #ifdef INTERPRET
  94.   /* Hack: Just for fun, if interpretation is active (which normally has  */
  95.   /* no effect whatsoever on graphics) we'll decorate the chart a little. */
  96.  
  97.   if (interpret) {
  98.     if (screenwidth & 1) {
  99.       /* If screenwidth value is odd, draw a moire pattern in each corner. */
  100.       abo = charty/(screenwidth/10);
  101.       lef = chartx/(screenwidth/10);
  102.       for (y = 0; y <= 1; y++)
  103.         for (i = 0; i <= 1; i++)
  104.           for (s = 0; s <= 1; s++)
  105.             for (a = 1; a < (s ? lef : abo)*2; a++) {
  106.               DrawColor(a & 1 ? gray : off);
  107.               DrawLine(i ? chartx-1-lef : lef, y ? charty-1-abo : abo,
  108.                 s ? (i ? chartx-1-a : a) : i*(chartx-1),
  109.                 s ? y*(charty-1) : (y ? charty-1-a : a));
  110.             }
  111.     } else {
  112.       /* If screenwidth is even, draw spider web lines in each corner. */
  113.       DrawColor(gray);
  114.       tot = screenwidth*3/20;
  115.       abo = charty/4;
  116.       lef = chartx/4;
  117.       for (y = 0; y <= 1; y++)
  118.         for (i = 0; i <= 1; i++)
  119.           for (a = 1; a < tot; a++)
  120.             DrawLine(i*(chartx-1), y ? (charty-1-a*abo/tot) : a*abo/tot,
  121.               i ? chartx-1-lef+a*lef/tot : lef-a*lef/tot, y*(charty-1));
  122.     }
  123.   }
  124. #endif
  125.   if (!xtext || (exdisplay & DASHv0) > 0)    /* Don't draw sidebar if */
  126.     return;                                  /* -v0 flag is set.      */
  127.  
  128.   a = ansi;
  129.   ansi = FALSE;
  130.   seconds = -seconds;
  131.   DrawColor(hilite);
  132.   if (xborder)
  133.     DrawLine(chartx-1, 0, chartx-1, charty-1);
  134.   chartx += SIDET;
  135.   DrawPrint(NULL, chartx-SIDET+FONTX*scalet, FONTY*7/5*scalet);
  136.  
  137.   /* Print chart header and setting information. */
  138.   sprintf(string, "%s %s", appname, VERSION);
  139.   DrawPrint(string, on, FALSE);
  140.   if (Mon == -1)
  141.     sprintf(string, "No time or space.");
  142.   else if (relation == DASHrc)
  143.     sprintf(string, "Composite chart.");
  144.   else {
  145.     sprintf(string, "%c%c%c %s", DAYNAM(DayOfWeek(Mon, Day, Yea)),
  146.       CharDate(Mon, Day, Yea, TRUE));
  147.     DrawPrint(string, hilite, FALSE);
  148.     DrawPrint(CharTime((int)floor(Tim), (int)(FRACT(dabs(Tim))*100.0)),
  149.       hilite, TRUE);
  150.     sprintf(string, " (%d:%02d GMT)", (int)(-Zon),
  151.       (int)(FRACT(dabs(Zon))*100.0+ROUND));
  152.   }
  153.   DrawPrint(string, hilite, FALSE);
  154.   DrawPrint(CharLocation(Lon, Lat, 100.0), hilite, FALSE);
  155.   sprintf(string, "%s houses.", systemname[housesystem]);
  156.   DrawPrint(string, hilite, FALSE);
  157.   sprintf(string, "%s zodiac.", operation & DASHs ? "Siderial" : "Tropical");
  158.   DrawPrint(string, hilite, FALSE);
  159.   sprintf(string, "Julian Day = %10.3f", JulianDayFromTime(T));
  160.   DrawPrint(string, hilite, FALSE);
  161.  
  162.   /* Print house cusp positions. */
  163.   DrawPrint("", hilite, FALSE);
  164.   for (i = 1; i <= SIGNS; i++) {
  165.     sprintf(string, "%2d%s house: ", i, post[i]);
  166.     y = DrawPrint(string, signcolor(i), TRUE);
  167.     if (!seconds && (scale == 100 || !xfont || !xfile) && y < charty) {
  168.       s = scale;
  169.       scale = 100*scalet;
  170.       DrawSign(i, chartx-12*scalet, y-(FONTY/2-1)*scalet);
  171.       scale = s;
  172.     }
  173.     DrawPrint(CharZodiac(house[i]), signcolor(ZTOS(house[i])), FALSE);
  174.   }
  175.  
  176.   /* Print planet positions. */
  177.   DrawPrint("", hilite, FALSE);
  178.   for (i = 1; i <= total; i++) if (!ignore[i]) {
  179.     sprintf(string, seconds ? "%3.3s: " : "%4.4s: ", objectname[i]);
  180.     DrawPrint(string, objectcolor[i], TRUE);
  181.     y = DrawPrint(CharZodiac(planet[i]), signcolor(ZTOS(planet[i])), TRUE);
  182.     if (!seconds && i < S_LO &&
  183.       (scale == 100 || !xfont || !xfile) && y < charty) {
  184.       s = scale;
  185.       scale = 100*scalet;
  186.       DrawObject(i, chartx-12*scalet, y-(FONTY/2-1)*scalet);
  187.       scale = s;
  188.     }
  189.     sprintf(string, "%c ", ret[i] < 0.0 ? 'R' : ' ');
  190.     DrawPrint(string, on, TRUE);
  191.     DrawPrint(CharAltitude(planetalt[i]), hilite, FALSE);
  192.   }
  193.  
  194.   /* Print element table information. */
  195.   DrawPrint("", hilite, FALSE);
  196.   CreateElemTable(elemode, elem, mo, &tot, &pos, &abo, &lef, &lea);
  197.   sprintf(string, "Fire: %d, Earth: %d,", elem[_FIR], elem[_EAR]);
  198.   DrawPrint(string, hilite, FALSE);
  199.   sprintf(string, "Air : %d, Water: %d", elem[_AIR], elem[_WAT]);
  200.   DrawPrint(string, hilite, FALSE);
  201.   sprintf(string, "Car: %d, Fix: %d, Mut: %d", mo[0], mo[1], mo[2]);
  202.   DrawPrint(string, hilite, FALSE);
  203.   sprintf(string, "Yang: %d, Yin: %d", pos, tot-pos);
  204.   DrawPrint(string, hilite, FALSE);
  205.   sprintf(string, "N: %d, S: %d, W: %d, E: %d", abo, tot-abo, tot-lef, lef); 
  206.   DrawPrint(string, hilite, FALSE);
  207.   seconds = -seconds;
  208.   ansi = a;
  209. }
  210.  
  211.  
  212. /* Draw a wheel chart, in which the 12 signs and houses are delineated, and  */