home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume12 / starcharts / part02 < prev    next >
Text File  |  1987-11-29  |  41KB  |  1,677 lines

  1. Subject:  v12i072:  StarChart program and Yale star data, Part02/07
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: awpaeth@watcgl.waterloo.edu (Alan W. Paeth)
  7. Posting-number: Volume 12, Issue 72
  8. Archive-name: starchart/part02
  9.  
  10. # This is a shell archive.  Remove anything before this line,
  11. # then unpack it by saving it in a file and typing "sh file".
  12. #
  13. # Wrapped by watcgl!awpaeth on Mon Oct  5 18:39:01 EDT 1987
  14. # Contents:  starlaser.c starpic.c starpost.c startek.c starchart.1 epoch.c
  15. #    moonphase.c messier.star ephem.star con.locs
  16.  
  17. echo x - starlaser.c
  18. sed 's/^@//' > "starlaser.c" <<'@//E*O*F starlaser.c//'
  19. /*
  20. ** Hewlett-Packard Laserjet (2686a) laser printer driver
  21. ** for starchart.
  22. ** Low-level routines (starting with 'HPLJET') written and copyrighted by
  23. ** Jyrki Yli-Nokari (jty@intrin.FI),
  24. ** Petri Launiainen (pl@intrin.FI),
  25. ** Intrinsic, Ltd.,  FINLAND.
  26. **
  27. ** You may use this code as you wish if credit is given and this message
  28. ** is retained.
  29. */
  30.  
  31. /*
  32. ** This code is intended for ALL Laserjet family printers.
  33. ** Because the base version has only 59 k raster buffer, the
  34. ** stars are not completely round, but not too ugly either.
  35. */
  36.  
  37. #include <stdio.h>
  38. #include "starchart.h"
  39.  
  40. char *calloc ();
  41.  
  42. #define SCALEU    29        /* graphics scaling */
  43. #define SCALEL    40
  44.  
  45. #define TSCALEU    69        /* text mode scaling */
  46. #define TSCALEL    10
  47.  
  48. #define XOFF    1060        /* text centering offset (in decipoints) */
  49. #define YOFF    (-80)
  50.  
  51. #define HPLJETXMAX 743        /* Number of pixels in X-axis */
  52. #define HPLJETYMAX 557        /* Number of pixels in Y-axis */
  53.  
  54. /*
  55. ** Chart parameters (limiting magnitude and window x,y,w,h)
  56. */
  57.  
  58. mapblock thumbnail =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  59.             3.2, 1.0, 420, 35, 480, 195, 0.0 };
  60.  
  61. mapblock master =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  62.             8.0, 3.0, 20, 265, 880, 500, 0.0 };
  63.  
  64. /*
  65. ** Generic functions
  66. */
  67.  
  68. vecopen ()
  69. {
  70.     HPLJETorient ();
  71.     r_makeraster (HPLJETXMAX, HPLJETYMAX);
  72. }
  73.  
  74. vecclose ()
  75. {
  76.     HPLJETdump ();
  77. }
  78.  
  79. vecsize (points)
  80. int points;
  81. {
  82. /**/
  83. }
  84.  
  85. vecmove (x, y)
  86. int x,y;
  87. {
  88.     x = (x*SCALEU)/SCALEL; /* adjust to bitmap size */
  89.     y = (y*SCALEU)/SCALEL;
  90.  
  91.     HPLJETmove (x, y);
  92. }
  93.  
  94. vecdraw (x, y)
  95. int x,y;
  96. {
  97.     x = (x*SCALEU)/SCALEL; /* adjust to bitmap size */
  98.     y = (y*SCALEU)/SCALEL;
  99.  
  100.     HPLJETdraw (x, y);
  101. }
  102.  
  103. vecdrawdot(x, y)
  104.     {
  105.     vecdraw(x, y); /* dotted and solid the same? (any HP folks out there?) */
  106.     }
  107.  
  108. vecdrawhyph(x, y)
  109.     {
  110.     vecdraw(x, y); /* ditto */
  111.     }
  112.     
  113. /*
  114. ** Text handling is a pain because of separate text/graphics mode
  115. ** and separated axises
  116. */
  117. vecsym (x, y, s)
  118. int x,y;
  119. char s;
  120. {
  121.     y = 767 - y; /* change y axis on text output */
  122.     y -= 5; /* center character strings */
  123.     x = (x*TSCALEU)/TSCALEL + XOFF; /* adjust to bitmap size */
  124.     y = (y*TSCALEU)/TSCALEL + YOFF;
  125.  
  126.     printf ("\033&a%dh%dV%c", x, y, s);
  127. }
  128.  
  129. vecsyms (x, y, s)
  130. int x,y;
  131. char *s;
  132. {
  133.     y = 767 - y; /* change y axis on text output */
  134.     y -= 5; /* center character strings */
  135.     x = (x*TSCALEU)/TSCALEL + XOFF; /* adjust to bitmap size */
  136.     y = (y*TSCALEU)/TSCALEL + YOFF;
  137.  
  138.     printf ("\033&a%dh%dV%s", x, y, s);
  139. }
  140.  
  141. vecmovedraw (x1, y1, x2, y2)
  142. int x1, x2, y1, y2;
  143. {
  144.     x1 = (x1*SCALEU)/SCALEL; /* adjust to bitmap size */
  145.     y1 = (y1*SCALEU)/SCALEL;
  146.  
  147.     x2 = (x2*SCALEU)/SCALEL; /* adjust to bitmap size */
  148.     y2 = (y2*SCALEU)/SCALEL;
  149.  
  150.     HPLJETmove (x1, y1);
  151.     HPLJETdraw (x2, y2);
  152. }
  153.  
  154. drawlen (x, y, dx, dy, len)
  155. int x, y, dx, dy, len;
  156. {
  157.     x = (x*SCALEU)/SCALEL; /* adjust to bitmap size */
  158.     y = (y*SCALEU)/SCALEL;
  159.  
  160.     HPLJETmove (x + dx, y + dy);
  161.     HPLJETdraw (x + dx + len - 1, y+dy);
  162. }
  163.  
  164. /*
  165. ** Low Level Laserjet Plotting Routines
  166. */
  167.  
  168. HPLJETorient ()    /* switch to portrait text orientation mode */
  169. {
  170.     printf ("\033&l1O");
  171. }
  172.  
  173. HPLJETmove (x, y)    /* move to (x,y) */
  174. int x, y;
  175. {
  176.     r_move (x, y);
  177. }
  178.  
  179. HPLJETdraw (x, y)    /* draw to (x,y) */
  180. int x, y;
  181. {
  182.     r_draw (x, y);
  183. }
  184.  
  185. #define IN(i,size)    ((unsigned)i < size)
  186. typedef char ritem;
  187. typedef ritem *raster[];
  188.  
  189. static raster *r_p;    /* global pointer to raster */
  190. static int r_currx, r_curry;    /* the current coordinates */
  191. static int r_xsize, r_ysize;    /* the size of the raster */
  192.  
  193. /*
  194. ** set pixel (x,y) to value val (zero or nonzero).
  195. */
  196. void
  197. r_setpixel(x, y, val)
  198. int x, y;
  199. ritem val;
  200. {
  201.     if (IN(x, r_xsize) && IN(y, r_ysize)) {
  202.         *(((*r_p)[y]) + x) = val;
  203.     }
  204. }
  205.  
  206. /*
  207. ** get pixel (x,y) value (0 or 1)
  208. */
  209. int
  210. r_getpixel(x, y)
  211. {
  212.     if (IN(x, r_xsize) && IN(y, r_ysize)) {
  213.         return *(((*r_p)[y]) + x);
  214.     }
  215.     else
  216.         return (0);
  217. }
  218.  
  219. /*
  220. ** allocate the raster
  221. */
  222. r_makeraster(x, y)
  223. {
  224.     register int j;
  225.     
  226.     /* allocate row pointers */
  227.     if ((r_p = (raster *)calloc(y, sizeof(ritem *))) == NULL) {
  228.         perror("Raster buffer allocation failure");
  229.         exit(1);
  230.     }
  231.     for (j = 0; j < y; j++) {
  232.         if (((*r_p)[j] = (ritem *)calloc(x, sizeof(ritem))) == NULL) {
  233.             perror("Raster buffer allocation failure");
  234.             exit(1);
  235.         }
  236.     }
  237.     r_xsize = x; r_ysize = y;
  238.     r_currx = r_curry = 0;
  239. }
  240.     
  241. /*
  242. ** plot a line from (x0,y0) to (x1,y1)
  243. */
  244. r_plot(x0, y0, x1, y1)
  245. int x0, y0, x1, y1;
  246. {
  247.     int e, hx, hy, dx, dy, i;
  248.     /*
  249.     ** We use Bresenham's alorithm for plotting
  250.     ** (IBM system journal 4(1):25-30, 1965)
  251.     */
  252.     hx = abs(x1 - x0);
  253.     hy = abs(y1 - y0);
  254.     dx = (x1 > x0) ? 1 : -1;
  255.     dy = (y1 > y0) ? 1 : -1;
  256.     
  257.     if (hx > hy) {
  258.         /*
  259.         ** loop over x-axis
  260.         */
  261.         e = hy + hy - hx;
  262.         for (i = 0; i <= hx; i++) {
  263.             r_setpixel(x0, y0, 1);
  264.             if (e > 0) {
  265.                 y0 += dy;
  266.                 e += hy + hy - hx - hx;
  267.             } else {
  268.                 e += hy + hy;
  269.             }
  270.             x0 += dx;
  271.         }
  272.     } else {
  273.         /*
  274.         ** loop over y-axis
  275.         */
  276.         e = hx + hx - hy;
  277.         for (i = 0; i <= hy; i++) {
  278.             r_setpixel(x0, y0, 1);
  279.             if (e > 0) {
  280.                 x0 += dx;
  281.                 e += hx + hx - hy - hy;
  282.             } else {
  283.                 e += hx + hx;
  284.             }
  285.             y0 += dy;
  286.         }
  287.     }
  288. }
  289.  
  290. /*
  291. ** move to (x,y)
  292. */
  293.  
  294. r_move(x, y)
  295. int x, y;
  296. {
  297.     r_currx = x;
  298.     r_curry = y;
  299. }
  300.  
  301. /*
  302. ** draw to (x,y)
  303. ** (move pen down)
  304. */
  305.  
  306. r_draw(x, y)
  307. int x, y;
  308. {
  309.     r_plot(r_currx, r_curry, x, y);
  310.     r_currx = x;
  311.     r_curry = y;
  312. }
  313.  
  314. /*
  315. ** free the allocated raster
  316. */
  317. void
  318. r_freeraster()
  319. {
  320.     int y;
  321.  
  322.     for (y = 0; y < r_ysize; y++) {
  323.         free((char *)(*r_p)[y]);
  324.     }
  325.     free((char *)r_p);
  326. }
  327.  
  328. HPLJETdump ()
  329. {
  330.     int x, y, i;
  331.     unsigned v;
  332.  
  333.     printf("\033*t75R\033&a0r\033&a135C\033&a-2R\033*r1A");
  334.     for (x = r_xsize-1; x >= 0; x--) {
  335.         printf("\033*b%dW", r_ysize/8);
  336.         for (y = r_ysize-8; y >= 0; y -= 8) {
  337.             v = 0;
  338.             for (i = 7; i >= 0; i--) {
  339.                 v = (v << 1) | r_getpixel(x, y + i);
  340.             }
  341.             putc(v, stdout);
  342.         }
  343.     }
  344.     r_freeraster();
  345.     printf("\033*rB\f");
  346. }
  347.  
  348. vecsymsgk(str, x, y)
  349.     char *str;
  350.     {
  351.     vecsyms(str, x, y);
  352.     }
  353. @//E*O*F starlaser.c//
  354. chmod u=rwx,g=rwx,o=rwx starlaser.c
  355.  
  356. echo x - starpic.c
  357. sed 's/^@//' > "starpic.c" <<'@//E*O*F starpic.c//'
  358. /*
  359.  * Unix Pic file format driver for startchart.c mainline
  360.  */
  361.  
  362. #include <stdio.h>
  363. #include "starchart.h"
  364.  
  365. #define PICFRAG 8    /* split long "move,draw,...,draw" chains for pic */
  366. #define DNONE 0        /* track current line style for chains */
  367. #define DSOLID 1
  368. #define DDOT 2
  369. #define DHYPH 3
  370.  
  371. static int style;
  372. static float xold, yold;
  373.  
  374. /*
  375.  * Chart parameters (limiting magnitude and window x,y,w,h)
  376.  */
  377.  
  378. mapblock thumbnail =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  379.             3.2, 1.0, 480, 0, 480, 240, 0.0 };
  380.  
  381. mapblock master =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  382.             8.0, 3.0, 0, 370, 960, 960, 0.0 };
  383.  
  384. /*
  385.  * Generic Star Drawing Stuff
  386.  */
  387.  
  388. static int oldps, dcount;
  389.  
  390. #define PICSCALE (1.0/160.0) /* roughly 6.5/1024.0 */
  391.  
  392. float conv(i)
  393.     {
  394.     return(i*PICSCALE);
  395.     }
  396.  
  397. vecsize(newps)
  398.     int newps;
  399.     {
  400.     if (newps != oldps) printf("\n.ps %d", newps);
  401.     oldps = newps;
  402.     }
  403.  
  404.  vecopen()
  405.    {
  406.    printf(".nf\n.ll 6.75i\n.po 0.75i\n.RT\n.PS");
  407.    vecsize(10);
  408.    printf("\n.tl'Database: \\fIYale Star Catalog\\fP'\\s18\\fBStarChart\\fP\\s0'Software: \\fIAWPaeth@watCGL\\fP'");
  409.    printf("\n.ll 7.25i");
  410.    }
  411.  
  412. vecclose()
  413.     {
  414.     printf("\n.PE\n");
  415.     fflush(stdout);
  416.     }
  417.  
  418. vecmove(x, y)
  419.     {
  420.     dcount = 0;
  421.     printf("\nline from %.3fi,%.3fi", xold = conv(x), yold = conv(y));
  422.     style = DNONE;
  423.     }
  424.  
  425. vecbreak()
  426.     {        /* repost current location when changing line attributes */
  427.     dcount = 0;
  428.     printf("\nline from %.3fi,%.3fi", xold, yold);
  429.     style = DNONE;
  430.     }
  431.  
  432. vecdraw(x, y)
  433.     {
  434.     if ((style != DNONE) && (style != DSOLID)) vecbreak();
  435.     printf(" to %.3fi,%.3fi", xold = conv(x), yold = conv(y));
  436.     dcount++;
  437.     if (dcount > PICFRAG) vecmove(x,y);    /* must fragment long pic commands */
  438.     style = DSOLID;
  439.     }
  440.  
  441. vecdrawdot(x, y)
  442.     {
  443.     if ((style != DNONE) && (style != DDOT)) vecbreak();
  444.     printf(" to %.3fi,%.3fi dotted", xold = conv(x), yold = conv(y));
  445.     dcount++;
  446.     if (dcount > PICFRAG) vecmove(x,y);    /* must fragment long pic commands */
  447.     style = DDOT;
  448.     }
  449.  
  450. vecdrawhyph(x, y)
  451.     {
  452.     if ((style != DNONE) && (style != DHYPH)) vecbreak();
  453.     printf(" to %.3fi,%.3fi dashed", xold = conv(x), yold = conv(y));
  454.     dcount++;
  455.     if (dcount > PICFRAG) vecmove(x,y);    /* must fragment long pic commands */
  456.     style = DHYPH;
  457.     }
  458.  
  459. vecsyms(x, y, s)
  460.     char *s;
  461.     {
  462.     printf("\n\"\\ %s\" ljust at %.3fi,%.3fi", s, conv(x), conv(y));
  463.     }
  464.  
  465. vecmovedraw(x1, y1, x2, y2)
  466.     {
  467.     vecmove(x1, y1);
  468.     vecdraw(x2, y2);
  469.     }
  470.  
  471. drawGalx(x, y)
  472.     {
  473.     vecsize(10);
  474.     vecsymcen(x, y, "@");
  475.     }
  476.  
  477. drawNebu(x, y)
  478.     {
  479.     vecsize(10);
  480.     vecsymcen(x, y, "\\v'3p'~\\v'-3p'"); /* vertical motion to lower '~' */
  481.     }
  482.  
  483. drawClus(x, y)
  484.     {
  485.     vecsize(10);
  486.     vecsymcen(x, y, "%");
  487.     }
  488.  
  489. drawPlan(x, y)
  490.     {
  491.     vecsize(10);
  492.     vecsymcen(x, y, "+");
  493.     }
  494.  
  495. vecsymcen(x, y, s)
  496.     char *s;
  497.     {
  498.     printf("\n\"%s\" at %.3fi,%.3fi", s, conv(x), conv(y));
  499.     }
  500.  
  501. drawStar(x, y, mag, type, color)
  502.     char type, *color;
  503.     {
  504.     switch (mag)
  505.     {
  506.     case -1: vecsize(18); break;
  507.     case  0: vecsize(18); break;
  508.     case  1: vecsize(16); break;
  509.     case  2: vecsize(12); break;
  510.     case  3: vecsize(10); break;
  511.     case  4: vecsize(8);  break;
  512.     default: vecsize(6);  break;
  513.     }
  514.     switch (type)
  515.     {
  516.     default:
  517. /*
  518.  * unadulterated overstrikes to form star symbols
  519.  */
  520.  
  521.     case 'S': vecsymcen(x, y, "\\(bu"); break;
  522.     case 'D': vecsymcen(x, y, "\\o'\\(em\\(bu'"); break;
  523.     case 'V': vecsymcen(x, y, "\\o'O\\(bu'"); break;
  524.  
  525. /*
  526.  * an attempt to raise (with troff local motion commands) the bullet by
  527.  * two printer's points, as it rides a touch low in the Waterloo fonts.
  528.  */
  529. /*
  530.  *    case 'S': vecsymcen(x, y, "\\v'2p'\\(bu\\v'-2p'"); break;
  531.  *    case 'D': vecsymcen(x, y, "\\o'\\(em\\v'2p'\\(bu\\v'-2p''"); break;
  532.  *    case 'V': vecsymcen(x, y, "\\o'O\\v'2p'\\(bu\\v'-2p''"); break;
  533.  */
  534.     }
  535.     }
  536.  
  537. /*
  538.  * Additions for Greek fonts
  539.  */
  540.  
  541. char *intable = " 0123456789abgdezh@iklmnEoprstuOx%w";
  542. char *outtable[] = {
  543.     " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  544.     "\\(*a", "\\(*b", "\\(*g", "\\(*d", "\\(*e", "\\(*z", "\\(*y", "\\(*h",
  545.     "\\(*i", "\\(*k", "\\(*l", "\\(*m", "\\(*n", "\\(*c", "\\(*o", "\\(*p",
  546.     "\\(*r", "\\(*s", "\\(*t", "\\(*u", "\\(*f", "\\(*x", "\\(*q", "\\(*w"
  547.     };
  548.  
  549. vecsymsgk(x, y, s)
  550.     char *s;
  551.     {
  552.     char ch, line[200];
  553.     int i;
  554.     line[0] = '\0';
  555.     while (ch = *s++)
  556.     {
  557.     i = 0;
  558.     while (intable[i] && (intable[i] != ch)) i++;
  559.     strcat(line, intable[i] ? outtable[i] : " ");
  560.     }
  561.     printf("\n\"\\ %s\" ljust at %.3fi,%.3fi", line, conv(x), conv(y));
  562.     }
  563. @//E*O*F starpic.c//
  564. chmod u=rwx,g=rwx,o=rwx starpic.c
  565.  
  566. echo x - starpost.c
  567. sed 's/^@//' > "starpost.c" <<'@//E*O*F starpost.c//'
  568. /*
  569.  * PostScript file format driver for startchart.c mainline
  570.  */
  571.  
  572. #include <stdio.h>
  573. #include "starchart.h"
  574.  
  575. /*
  576.  * Chart parameters (limiting magnitude and window x,y,w,h)
  577.  */
  578.  
  579. mapblock thumbnail =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  580.             3.2, 1.0, 480, 0, 480, 240, 0.0 };
  581.  
  582. mapblock master =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  583.             8.0, 3.0, 0, 370, 960, 960, 0.0 };
  584.  
  585. /*
  586.  * Generic Star Drawing Stuff
  587.  */
  588.  
  589. #define PICSCALE (72.0/160.0) /* roughly 6.5 inches/1024.0 units */
  590.  
  591. static int oldps, vecstate;
  592.  
  593. out(s)
  594.     char *s;
  595.     {
  596.     printf("%s\n", s);
  597.     }
  598.  
  599. float conv(i)
  600.     {
  601.     return(i*PICSCALE+80);    /* 1.1" margins left and bottom */
  602.     }
  603.  
  604. vecsize(newps)
  605.     int newps;
  606.     {
  607.     if (newps != oldps) printf("%d fsize\n", newps);
  608.     oldps = newps;
  609.     }
  610.  
  611. vecopen()
  612.     {
  613. out("%!PSAdobe-1.0");
  614. out("%%Creator: AWPaeth@watCGL");
  615. out("%%Title: StarChart");
  616. out("%%Pages: 1");
  617. out("%%DocumentFonts Times-Bold Symbol");
  618. out("%%BoundingBox 0 0 612 792");
  619. out("%%EndComments");
  620. out("%%EndProlog");
  621. out("%%Page: 0 1");
  622. out("%");
  623. out("% alias moveto/drawto");
  624. out("%");
  625. out("/mt {moveto} def");                /* move to */
  626. out("/st {lineto} def");                /* solid to */
  627. out("/dt {[1] 0 setdash lineto [] 0 setdash} def");    /* dotted to */
  628. out("/ht {[3] 0 setdash lineto [] 0 setdash} def");    /* hyphen to */
  629. out("%");
  630. out("% show: right, center, left adjust");
  631. out("%");
  632. out("/fsize {/Times-Bold findfont exch scalefont setfont} def");
  633. out("/lshow {5 0 8#040 4 3 roll widthshow} def");
  634. out("/cshow {dup stringwidth pop 2 div neg 0 rmoveto show} def");
  635. out("/rshow {dup stringwidth pop neg 0 rmoveto show} def");
  636. out("/gshow {currentfont exch");
  637. out("        /Symbol findfont 10 scalefont setfont lshow setfont} def");
  638. out("%");
  639. out("% star/planet macros");
  640. out("%");
  641. out("/movereldraw {newpath 4 2 roll mt rlineto stroke} def");
  642. out("/starminus {3 copy 0 movereldraw neg 0 movereldraw} def");
  643. out("/starplus {3 copy 0 movereldraw 3 copy neg 0 movereldraw");
  644. out( "          3 copy 0 exch movereldraw 0 exch neg movereldraw} def");
  645. out("/starcirc {newpath 0 360 arc closepath stroke} def");
  646. out("/starbody {newpath 0 360 arc closepath fill} def");
  647. out("/starbodyvar {3 copy 1 add starcirc starbody} def");
  648. out("/starbodydbl {3 copy dup 3 div add starminus starbody} def");
  649. out("% non-stellar object macros (better designs most welcome)");
  650. out("/planet  {2 copy 2.5 starcirc 3.5 starplus} def");
  651. out("/galaxy  {2 copy 2.5 starcirc 3.5 starminus} def");
  652. out("/nebula  {2 copy 1 setgray 2.5 starcirc 0 setgray [2] 0 setdash");
  653. out("          2.5 starcirc [] 0 setdash} def");
  654. out("/cluster {2.5 starcirc} def");
  655. out("%");
  656. out("/back {3 copy 0.5 add 1 setgray} def");
  657. out("/fore {0 setgray} def");
  658. out("/s {back starbody fore starbody} def");
  659. out("/d {back starbodydbl fore starbodydbl} def");
  660. out("/v {back starbodyvar fore starbodyvar} def");
  661. out("/s0 {4.5 s} def");
  662. out("/d0 {4.5 d} def");
  663. out("/v0 {4.5 v} def");
  664. out("/s1 {3.8 s} def");
  665. out("/d1 {3.8 d} def");
  666. out("/v1 {3.8 v} def");
  667. out("/s2 {3.1 s} def");
  668. out("/d2 {3.1 d} def");
  669. out("/v2 {3.1 v} def");
  670. out("/s3 {2.4 s} def");
  671. out("/d3 {2.4 d} def");
  672. out("/v3 {2.4 v} def");
  673. out("/s4 {1.7 s} def");
  674. out("/d4 {1.7 d} def");
  675. out("/v4 {1.7 v} def");
  676. out("/s5 {1.0 s} def");
  677. out("/d5 {1.0 d} def");
  678. out("/v5 {1.0 v} def");
  679. out("%");
  680. out("% alter line drawing defaults, guarentee solid black lines");
  681. out("0.5 setlinewidth 2 setlinecap");
  682. out("[] 0 setdash 0 setgray");
  683. out("%");
  684. out("% boiler-plate");
  685. out("%");
  686. vecsize(10);
  687. out(" 76 685 mt (Database: Yale Star Catalog) show");
  688. out("548 685 mt (Software: AWPaeth@watCGL) rshow");
  689. vecsize(18);
  690. out("314 685 mt (StarChart) cshow");
  691. vecsize(10);
  692. out("%");
  693. out("% THE STUFF");
  694. out("%");
  695.     }
  696.  
  697. vecclose()
  698.     {
  699.     out("showpage");
  700.     out("%");
  701.     out("%%Trailer");
  702.     out("%%Pages: 1");
  703.     fflush(stdout);
  704.     }
  705.  
  706. vecmove(x, y)
  707.     {
  708.     if (vecstate==2) printf("stroke\n");
  709.     if (vecstate==2 || (vecstate == 0)) printf("newpath\n");
  710.     printf("%.1f %.1f mt\n", conv(x), conv(y));
  711.     vecstate = 1;
  712.     }
  713.  
  714. vecdraw(x, y)
  715.     {
  716.     printf("%.1f %.1f st\n", conv(x), conv(y));
  717.     vecstate = 2;
  718.     }
  719.  
  720. vecdrawdot(x, y)
  721.     {
  722.     printf("%.1f %.1f dt\n", conv(x), conv(y));
  723.     vecstate = 2;
  724.     }
  725.  
  726. vecdrawhyph(x, y)
  727.     {
  728.     printf("%.1f %.1f ht\n", conv(x), conv(y));
  729.     vecstate = 2;
  730.     }
  731.  
  732. vecsyms(x, y, s)
  733.     char *s;
  734.     {
  735.     vecmove(x,y-4);
  736.     printf("(%s) lshow\n", s);
  737.     }
  738.  
  739. vecmovedraw(x1, y1, x2, y2)
  740.     {
  741.     vecmove(x1, y1);
  742.     vecdraw(x2, y2);
  743.     }
  744.  
  745. drawPlan(x, y)
  746.     {
  747.     printf("%.1f %.1f planet\n", conv(x), conv(y));
  748.     }
  749.  
  750. drawGalx(x, y)
  751.     {
  752.     printf("%.1f %.1f galaxy\n", conv(x), conv(y));
  753.     }
  754.  
  755. drawNebu(x, y)
  756.     {
  757.     printf("%.1f %.1f nebula\n", conv(x), conv(y));
  758.     }
  759.  
  760. drawClus(x, y)
  761.     {
  762.     printf("%.1f %.1f cluster\n", conv(x), conv(y));
  763.     }
  764.  
  765. drawStar(x, y, mag, type, color)
  766.     char type, *color;
  767.     {
  768.     char *code;
  769.     switch (mag)
  770.     {
  771.     case -1: vecsize(18); break;
  772.     case  0: vecsize(18); break;
  773.     case  1: vecsize(16); break;
  774.     case  2: vecsize(14); break;
  775.     case  3: vecsize(12); break;
  776.     case  4: vecsize(8); break;
  777.     default: vecsize(6); break;
  778.     }
  779.     if (mag<0) mag = 0;
  780.     if (mag>5) mag = 5;
  781.     switch (type)
  782.     {
  783.     default:
  784.     case 'S': code = "s"; break;
  785.     case 'D': code = "d"; break;
  786.     case 'V': code = "v"; break;
  787.     }
  788.     printf("%.1f %.1f %s%1d\n", conv(x), conv(y), code, mag);
  789.     }
  790.  
  791. /*
  792.  * Additions for Greek fonts
  793.  */
  794.  
  795. char  *intable = " 0123456789abgdezh@iklmnEoprstuOx%w";
  796. char *outtable = " 0123456789abgdezhqiklmnxoprstujcyw";
  797.  
  798. vecsymsgk(x, y, s)
  799.     char *s;
  800.     {
  801.     char ch;
  802.     int i, j;
  803.     i = 0;
  804.     while (ch = s[i])
  805.     {
  806.     j = 0;
  807.     while (intable[j] && (intable[j] != ch)) j++;
  808.     s[i] = intable[j] ? outtable[j] : ' ';
  809.     i++;
  810.     }
  811.     vecmove(x,y-4);
  812.     printf("(%s) gshow\n", s);
  813.     }
  814. @//E*O*F starpost.c//
  815. chmod u=rwx,g=rwx,o=rwx starpost.c
  816.  
  817. echo x - startek.c
  818. sed 's/^@//' > "startek.c" <<'@//E*O*F startek.c//'
  819. /*
  820.  * Tektronix driver for startchart.c mainline
  821.  */
  822.  
  823. #include <stdio.h>
  824. #include "starchart.h"
  825.  
  826. /*
  827.  * The following rational fractions are for Tek output on limited (and
  828.  * not 1024x768) bitmap devices, and attempt to cause graceful scaling of
  829.  * glyphs, by defining the distance between adjacent output pixels in terms
  830.  * of Tek coordinates. They should be fine-tuned for your Tektronix emulator.
  831.  * Additional tuning (for rounding considerations) must take place in the
  832.  * routine where the four values are referenced.
  833.  *
  834.  * Typical fractions are 5/8 (yields 640x480), 1/2, and 3/4
  835.  *
  836.  * For full resolution Tektronix devices (full 1024x768), all values are 1.
  837.  */
  838.  
  839. #ifndef TEK
  840. #define XSCALEI 5
  841. #define XSCALEO 8
  842. #define YSCALEI 5
  843. #define YSCALEO 8
  844. #else
  845. #define XSCALEI 1
  846. #define XSCALEO 1
  847. #define YSCALEI 1
  848. #define YSCALEO 1
  849. #endif
  850.  
  851. /*
  852.  * Chart parameters (limiting magnitude and window x,y,w,h)
  853.  */
  854.  
  855. mapblock thumbnail =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  856.             3.2, 1.0, 420, 35, 480, 195, 0.0 };
  857.  
  858. mapblock master =    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  859.             8.0, 3.0, 20, 265, 880, 500, 0.0 };
  860.  
  861. /*
  862.  * Generic Star Drawing Stuff
  863.  */
  864.  
  865. vecopen()
  866.    {
  867.    tekclear();
  868.    }
  869.  
  870. vecclose()
  871.     {
  872.     tekmove(0,0);
  873.     tekalpha();
  874.     fflush(stdout);
  875.     }
  876.  
  877. vecsize(points)
  878.     int points;
  879.     {
  880.     }
  881.  
  882. vecmove(x, y)
  883.     {
  884.     tekmove(x, y);
  885.     }
  886.  
  887. vecdraw(x, y)
  888.     {
  889.     tekdraw(x, y);
  890.     }
  891.  
  892. vecdrawdot(x, y)
  893.     {
  894.     vecdraw(x, y);    /* dotted and solid the same */
  895.     }
  896.  
  897. vecdrawhyph(x, y)
  898.     {
  899.     vecdraw(x, y);    /* dashed and solid the same */
  900.     }
  901.  
  902.  
  903. vecsym(x, y, s)
  904.     char s;
  905.     {
  906.     tekmove(x, y-11); /* center character strings */
  907.     tekalpha();
  908.     printf("%c",s);
  909.     }
  910.  
  911. vecsyms(x, y, s)
  912.     char *s;
  913.     {
  914.     tekmove(x, y-11); /* center character strings */
  915.     tekalpha();
  916.     printf(s);
  917.     }
  918.  
  919. vecmovedraw(x1, y1, x2, y2)
  920.     {
  921.     tekmove(x1, y1);
  922.     tekdraw(x2, y2);
  923.     fflush(stdout);
  924.     }
  925.  
  926.  
  927. drawlen(x, y, dx, dy, len)
  928.     {
  929.     vecmovedraw((x*XSCALEI/XSCALEO+dx)*XSCALEO/XSCALEI,
  930.         (y*YSCALEI/YSCALEO+dy)*YSCALEO/YSCALEI,
  931.         (x*XSCALEI/XSCALEO+dx+len-1)*XSCALEO/XSCALEI+1,
  932.         (y*YSCALEI/YSCALEO+dy)*YSCALEO/YSCALEI);
  933.     }
  934.  
  935. /*
  936.  * Low Level Tektronix Plotting Routines
  937.  */
  938.  
  939. #define    GS    035
  940. #define    US    037
  941. #define ESC    033
  942. #define FF    014
  943.  
  944. static int oldHiY = 0, oldLoY = 0, oldHiX = 0;
  945.  
  946. tekplot()    /* switch to plot mode */
  947.     {
  948.     putchar(GS);
  949.     putchar('@');
  950.     oldHiY = oldLoY = oldHiX = 0;
  951.     }
  952.  
  953. tekalpha()    /* switch to alpha mode */
  954.     {
  955.     putchar(US);
  956.     fflush(stdout);
  957.     }
  958.  
  959. tekclear()
  960.     {
  961.     putchar(ESC);
  962.     putchar(FF);
  963.     fflush(stdout);
  964.     }
  965.  
  966. tekmove(x, y)    /* move to (x,y) */
  967.     {
  968.     putchar(GS);
  969.     tekdraw(x, y);
  970.     }
  971.  
  972. tekdraw(x, y)    /* draw to (x,y) */
  973.     {
  974.     int hiY, loY, hiX, loX;
  975.     if (x < 0) x = 0;
  976.     if (y < 0) y = 0;
  977.     if (x > 1023) x = 1023;
  978.     if (y > 767) y = 767;
  979.  
  980.     hiY = 0040 | (y>>5 & 037),
  981.     loY = 0140 | (y    & 037),
  982.     hiX = 0040 | (x>>5 & 037),
  983.     loX = 0100 | (x    & 037);
  984.  
  985.     if (hiY != oldHiY) putchar(hiY);
  986.     if (loY != oldLoY || hiX != oldHiX) putchar(loY);
  987.     if (hiX != oldHiX) putchar(hiX);
  988.     putchar(loX);
  989.  
  990.     oldHiY = hiY;
  991.     oldLoY = loY;
  992.     oldHiX = hiX;
  993.     }
  994.  
  995. vecsymsgk(str, x, y)
  996.     char *str;
  997.     {
  998.     vecsyms(str, x, y);
  999.     }
  1000. @//E*O*F startek.c//
  1001. chmod u=rwx,g=rwx,o=rwx startek.c
  1002.  
  1003. echo x - starchart.1
  1004. sed 's/^@//' > "starchart.1" <<'@//E*O*F starchart.1//'
  1005. @.TH starchart LOCAL 9/22/87
  1006. @.ad b
  1007. @.SH NAME
  1008. stardsp, starpic, startek, starpost, starhp, starlaser
  1009. @.br
  1010. \- print astronomical star charts using Yale database.
  1011. @.SH SYNOPSIS
  1012. \fBstar* RA DE [ scale title maglim lbllim ]\fR
  1013. @.br
  1014. or
  1015. @.br
  1016. \fB-r Ra -d Dl -s scale -t title -m maglim -l lbllim -f x.star\fR
  1017. @.br
  1018. or
  1019. @.br
  1020. \fB-c constellation ...
  1021. @.SH DESCRIPTION
  1022. These programs generate star charts based on data extracted from the Yale
  1023. public domain star catalog.
  1024. Output is to the terminal 
  1025. @.RB ( stardsp ),
  1026. Unix PIC file format
  1027. @.RB ( starpic ),
  1028. Tektronix
  1029. vector format
  1030. @.RB ( startek ),
  1031. PostScript format
  1032. @.RB ( starpost ),
  1033. Hewlett-Packard terminal vector format
  1034. @.RB (starhp)
  1035. or in Hewlett-Packard Laserjet printer format
  1036. @.RB ( starlaser ).
  1037. @.PP
  1038. Star data is optionally overlayed with other cosmic objects, such as planets.
  1039. If limiting magnitudes are properly set and the Messier database is available,
  1040. Messier objects and some NGC objects are also printed.
  1041. @.PP
  1042. The starchart center is specified by two parameters: Right
  1043. Ascension [0.00 to 24.00 hours] and Declination [-90.00 to +90.00 degrees].
  1044. An optional third parameter defines the N/S range of the output window, in
  1045. degrees of declination.  Digits after decimal point are taken as minutes:
  1046. object positions can therefore be taken directly from a star catalog.
  1047. @.PP
  1048. An optional fourth parameter gives a title.  This conforms to the 'old'
  1049. Yale star chart format.  Two new parameters can be added after title,
  1050. defining the magnitude limit and label printing magnitude limit.  These
  1051. are discussed below.  All parameters can be given by using options,
  1052. which offers more flexibility. Parameters are:
  1053. @.TP
  1054. @.B \-r
  1055. Right ascension.
  1056. @.TP
  1057. @.B \-d
  1058. Declination.
  1059. @.TP
  1060. @.B \-s
  1061. Scale.
  1062. @.TP
  1063. @.B \-t
  1064. Title.  All these work as described above.  New options are:
  1065. @.TP
  1066. @.B \-m
  1067. Star limiting magnitude. This sets limits on the faintest stars displayed
  1068. on the "master" view. Default limits are device driver dependent (more below).
  1069. The "thumbnail" finder view is set to a related limit.
  1070. @.TP
  1071. @.B \-l
  1072. Label limiting magnitude. The new Yale database contains both a small set of
  1073. familiar names (for stars and special objects), plus an extensive list of
  1074. labels (Greek Bayer letter or Flamsteed numbers). Star names (including planet
  1075. names) always print for this small set. To avoid clutter, the labels may be
  1076. omitted below a cut-off magnitude by specifying this value.
  1077. @.TP
  1078. @.B \-c
  1079. A three or four character mnemonic follows, which is a search string for a
  1080. matching line-item entry in the file \fBcon.locs\fP. If found, then the
  1081. initial values for Ra, Decl, Scale and Title are taken from that file.
  1082. Because the command line is parsed from left to right, subsequent switches
  1083. might change the scale, title, or otherwise fine-tune the new defaults.
  1084. @.TP
  1085. @.B \-f
  1086. A file may be given containing ephemerides in the .star format, which will
  1087. overlay the output. This is also useful for generating constellation
  1088. boundaries, Milky Way isophots, and planet or satellite tracks. (The .star
  1089. format additionally includes records for vector and text annotation).
  1090. @.PP
  1091. The present implementations draw two viewports: a ``master'' chart plus a
  1092. ``thumbnail'' overview with low limiting magnitude.
  1093. Their location and the limiting magnitude is specified by records in
  1094. the device driver, allowing the chart layout be tuned on a per-device basis.
  1095. The output is annotated with viewport boundaries, a legend and axis labels.
  1096. @.PP
  1097. Sanson's sinusoidal projection is used to map coordinates.
  1098. This projection preserves both area and linearity in Declination (y axis).
  1099. It gives good conformality (angle correctness) near the equator, so it is
  1100. useful along the Ecliptic.
  1101. Lines of RA converge at the poles (unlike cylindrical projections),
  1102. though Cassiopeia and the Dipper reproduce well.
  1103. @.SH EXAMPLES 
  1104. @.nf
  1105. # Sagittarius: a nice bunch of Messier objects.
  1106. starpost -c sgr -t "(Sagittarius 31 Oct 87)" >sag.ps
  1107. @.sp
  1108. # Orion: the belt lies near 5h40m in RA, just below the CE.
  1109. stardsp 5.32 -5 12 "Trapezium (Orion)" 8 5 | more
  1110. @.fi
  1111. @.SH FILES
  1112. @.nf
  1113. @.ta 2.6i
  1114. \fByale.star\fP    stellar information (mandatory)
  1115. \fBmessier.star\fP    Messier objects (optional)
  1116. \fBplanet.star\fP    Planets (optional)
  1117. \fBcon.locs\fP    default mnemonic locations
  1118. @.fi
  1119. @.br
  1120. @.sp
  1121. These default paths can be easily changed in the Makefile.
  1122. @.SH BUGS
  1123. No testing for bogus ranges and scales which may wrap the poles.
  1124. The present implementation expects
  1125. @.B yale.star
  1126. sorted by decreasing magnitude so that output is sequential, and then cuts off
  1127. below a limiting magnitude.
  1128. For more detailed charts spatial sorting is more appropriate.
  1129. @.PP
  1130. If <minutes> part of the parameters is greater than 59 it is silently
  1131. truncated to 59.
  1132. @.PP
  1133. All .star file coordinates are for epoch E2000.0. The Messier objects
  1134. in \fBmessier.star\fP were taken from precessed E1975.0 data. The additional
  1135. NGC objects were taken from data in the star atlas by \fINorton\fP and
  1136. precessed from E1950.0. Rough guesses on visual magnitude were made.
  1137. @.SH AUTHOR/EDITOR
  1138. Alan Paeth, University of Waterloo (AWPaeth@watCGL)
  1139. @.SH CONTRIBUTORS
  1140. Petri Launiainen (pl@intrin.FI)
  1141. @.br
  1142. Jyrki Yli-Nokari (jty@intrin.FI)
  1143. @.br
  1144. Robert Tidd (inp@VIOLET.BERKELEY.EDU)
  1145. @//E*O*F starchart.1//
  1146. chmod u=rwx,g=rwx,o=rwx starchart.1
  1147.  
  1148. echo x - epoch.c
  1149. sed 's/^@//' > "epoch.c" <<'@//E*O*F epoch.c//'
  1150. /*
  1151.  * epoch.c -- convert reduced Yale databases between epochs.
  1152.  *        (initial RA and DL fields rewritten, rest of input copied
  1153.  *        verbatim, so tool may be used on either reduced Yale dataset)
  1154.  *
  1155.  * copyright (c) 1987 by Alan Paeth
  1156.  *
  1157.  * transformations are based on equations appearing in
  1158.  * "Celestial BASIC" by Eric Burgess (SYBEX 1982)
  1159.  */
  1160.  
  1161. #include <stdio.h>
  1162. #include <math.h>
  1163.  
  1164. #define EPLOW 1850.0
  1165. #define EPHI  2100.0
  1166. #define DEFEIN 1950.0
  1167. #define DEFEOUT 2000.0
  1168.  
  1169. #define LINELEN 80
  1170.  
  1171. #define DLDEGSEC 3600.0
  1172. #define DLMINSEC 60.0
  1173. #define RAHRSSEC 54000.0
  1174. #define RAMINSEC 900.0
  1175. #define RASECSEC 15.0
  1176.  
  1177. #define DEGTORAD (3.14159265359/180.0)
  1178. #define DSIN(x) (sin((x)*DEGTORAD))
  1179. #define DCOS(x) (cos((x)*DEGTORAD))
  1180. #define DTAN(x) (tan((x)*DEGTORAD))
  1181.  
  1182. #define USAGE "{inputepoch=1950.0} {outputepoc=2000.0} <stdin >stdout"
  1183.  
  1184. char buf[LINELEN];    /* global to carry remainer of input line easily */
  1185.  
  1186. main(argc, argv)
  1187.     char **argv;
  1188.     {
  1189.     float r, d, r2, d2, ein, eout;
  1190.     ein  = DEFEIN;
  1191.     eout = DEFEOUT;
  1192.     switch (argc)
  1193.     {
  1194.     default: fprintf(stderr, "usage: [%s] %s\n", argv[0], USAGE); exit(1);
  1195.     case 3: eout = atof(argv[2]);
  1196.     case 2: ein =  atof(argv[1]);
  1197.     case 1: break;
  1198.     }
  1199.     if ((ein < EPLOW) || (ein > EPHI) || (eout < EPLOW) || (eout > EPHI))
  1200.     {
  1201.     fprintf(stderr, "epoch not in range [%.1f..%.1f]\n", EPLOW, EPHI);
  1202.     exit(1);
  1203.     }
  1204.     while(readline(&r, &d))
  1205.     {
  1206.     xform(r, d, &r2, &d2, ein, eout);        /* r2d2 ?! */
  1207.     writeline(r2, d2);
  1208.     }
  1209.     exit(0);
  1210.     }
  1211.  
  1212. readline(ra, de)
  1213.     float *ra, *de;
  1214.     {
  1215.     float rah, ram, ras, dld, dlm;
  1216.     char sign;
  1217.  
  1218.     fgets(buf, LINELEN, stdin);
  1219.     if (feof(stdin)) return(0);
  1220.     sscanf(buf, "%2f%2f%2f%c%2f%2f", &rah, &ram, &ras, &sign, &dld, &dlm);
  1221.     *ra = (RAHRSSEC*rah + RAMINSEC*ram + RASECSEC*ras)/DLDEGSEC;
  1222.     *de = (DLDEGSEC*dld + DLMINSEC*dlm)/DLDEGSEC;
  1223.     if (sign == '-') *de = -(*de);
  1224.     return(1);
  1225.     }
  1226.  
  1227. writeline(ra, de, rst)
  1228.     float ra, de;
  1229.     char *rst;
  1230.     {
  1231.     int rah, ram, ras, dld, dlm, sign;
  1232.     ra *= DLDEGSEC;
  1233.     rah = ra/RAHRSSEC;
  1234.     ra -= rah*RAHRSSEC;
  1235.     ram = ra/RAMINSEC;
  1236.     ra -= ram*RAMINSEC;
  1237.     ras = ra/RASECSEC;
  1238.     sign = (de < 0.0);
  1239.     if (sign) de = -de;
  1240.     dld = de;
  1241.     de -= dld;
  1242.     dlm = de * DLMINSEC + 0.5;
  1243.     if (dlm >= 60) dlm = 59;
  1244.     printf("%02d%02d%02d%s%02d%02d%s",
  1245.     rah, ram, ras, sign ? "-":"+", dld, dlm, &buf[11]);
  1246.     }
  1247.  
  1248. xform(rin, din, rout, dout, ein, eout)
  1249.     float rin, din, *rout, *dout, ein, eout;
  1250.     {
  1251.     float t, t2, x, y, z, w, d;
  1252.     t2 = ( (ein+eout)/2.0 - 1900.0 ) / 100.0;
  1253.     x = 3.07234 + (.00186 * t2);
  1254.     y = 20.0468 - (.0085 * t2);
  1255.     z = y/15;
  1256.     t = eout-ein;
  1257.     w = .0042 * t * (x + (z * DSIN(rin) * DTAN(din)) );
  1258.     d = .00028 * t * y * DCOS(rin);
  1259.     *rout = rin + w;
  1260.     if (*rout >= 360.0) *rout -= 360.0;
  1261.     if (*rout < 0.0) *rout += 360.0;
  1262.     *dout = din + d;
  1263.     }
  1264. @//E*O*F epoch.c//
  1265. chmod u=rwx,g=rwx,o=rwx epoch.c
  1266.  
  1267. echo x - moonphase.c
  1268. sed 's/^@//' > "moonphase.c" <<'@//E*O*F moonphase.c//'
  1269. /****************************************************************************
  1270.  pom.c
  1271.  
  1272.      Phase of the Moon. Calculates the current phase of the moon.
  1273.      Based on routines from `Practical Astronomy with Your Calculator',
  1274.         by Duffett-Smith.
  1275.      Comments give the section from the book that particular piece
  1276.         of code was adapted from.
  1277.  
  1278.      -- Keith E. Brandt  VIII 1984
  1279.  
  1280.  ****************************************************************************/
  1281.  
  1282. #include <stdio.h>
  1283. #include <sys/time.h>
  1284. #include <math.h>
  1285. #define PI         3.141592654
  1286. #define EPOCH   1983
  1287. #define EPSILONg 279.103035     /* solar ecliptic long at EPOCH */
  1288. #define RHOg     282.648015     /* solar ecliptic long of perigee at EPOCH */
  1289. #define e          0.01671626   /* solar orbit eccentricity */
  1290. #define lzero    106.306091     /* lunar mean long at EPOCH */
  1291. #define Pzero    111.481526     /* lunar mean long of perigee at EPOCH */
  1292. #define Nzero     93.913033     /* lunar mean long of node at EPOCH */
  1293.  
  1294. main()  {
  1295.  
  1296. double dtor();
  1297. double adj360();
  1298. double potm();
  1299.  
  1300. long *lo = (long *) calloc (1, sizeof(long)); /* used by time calls */
  1301. struct tm *pt; /* ptr to time structure */
  1302.  
  1303. double days;   /* days since EPOCH */
  1304. double phase;  /* percent of lunar surface illuminated */
  1305. double phase2; /* percent of lunar surface illuminated one day later */
  1306. int i = EPOCH;
  1307.  
  1308. time (lo);  /* get system time */
  1309. pt = gmtime(lo);  /* get ptr to gmt time struct */
  1310. cfree(lo);
  1311.  
  1312. /* calculate days since EPOCH */
  1313. days = (pt->tm_yday +1) + ((pt->tm_hour + (pt->tm_min / 60.0)
  1314.        + (pt->tm_sec / 3600.0)) / 24.0);
  1315. while (i < pt->tm_year + 1900)
  1316.    days = days + 365 + ly(i++);
  1317.  
  1318. phase = potm(days);
  1319. printf("The Moon is ");
  1320. if ((int)(phase + .5) == 100) {
  1321.    printf("Full\n");
  1322.    }
  1323. else if ((int)(phase + 0.5) == 0) 
  1324.    printf("New\n");
  1325. else if ((int)(phase + 0.5) == 50)  {
  1326.    phase2 = potm(++days);
  1327.    if (phase2 > phase)
  1328.       printf("at the First Quarter\n");
  1329.    else 
  1330.       printf("at the Last Quarter\n");
  1331.    }
  1332. else if ((int)(phase + 0.5) > 50) {
  1333.    phase2 = potm(++days);
  1334.    if (phase2 > phase)
  1335.       printf("Waxing ");
  1336.    else 
  1337.       printf("Waning ");
  1338.    printf("Gibbous (%1.0f%% of Full)\n", phase);
  1339.    }
  1340. else if ((int)(phase + 0.5) < 50) {
  1341.    phase2 = potm(++days);
  1342.    if (phase2 > phase)
  1343.       printf("Waxing ");
  1344.    else
  1345.       printf("Waning ");
  1346.    printf("Crescent (%1.0f%% of Full)\n", phase);
  1347.    }
  1348. }
  1349.  
  1350. double potm(days)
  1351. double days;
  1352. {
  1353. double N;
  1354. double Msol;
  1355. double Ec;
  1356. double LambdaSol;
  1357. double l;
  1358. double Mm;
  1359. double Ev;
  1360. double Ac;
  1361. double A3;
  1362. double Mmprime;
  1363. double A4;
  1364. double lprime;
  1365. double V;
  1366. double ldprime;
  1367. double D;
  1368. double Nm;
  1369.  
  1370. N = 360 * days / 365.2422;  /* sec 42 #3 */
  1371. adj360(&N);
  1372.  
  1373. Msol = N + EPSILONg - RHOg; /* sec 42 #4 */
  1374. adj360(&Msol);
  1375.  
  1376. Ec = 360 / PI * e * sin(dtor(Msol)); /* sec 42 #5 */
  1377.  
  1378. LambdaSol = N + Ec + EPSILONg;       /* sec 42 #6 */
  1379. adj360(&LambdaSol);
  1380.  
  1381. l = 13.1763966 * days + lzero;       /* sec 61 #4 */
  1382. adj360(&l);
  1383.  
  1384. Mm = l - (0.1114041 * days) - Pzero; /* sec 61 #5 */
  1385. adj360(&Mm);
  1386.  
  1387. Nm = Nzero - (0.0529539 * days);     /* sec 61 #6 */
  1388. adj360(&Nm);
  1389.  
  1390. Ev = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */
  1391.  
  1392. Ac = 0.1858 * sin(dtor(Msol));       /* sec 61 #8 */
  1393. A3 = 0.37 * sin(dtor(Msol));
  1394.  
  1395. Mmprime = Mm + Ev - Ac - A3;         /* sec 61 #9 */
  1396.  
  1397. Ec = 6.2886 * sin(dtor(Mmprime));    /* sec 61 #10 */
  1398.  
  1399. A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */
  1400.  
  1401. lprime = l + Ev + Ec - Ac + A4;      /* sec 61 #12 */
  1402.  
  1403. V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */
  1404.  
  1405. ldprime = lprime + V;                /* sec 61 #14 */
  1406.  
  1407. D = ldprime - LambdaSol;             /* sec 63 #2 */
  1408.  
  1409. return (50 * (1 - cos(dtor(D))));    /* sec 63 #3 */
  1410. }
  1411.  
  1412. ly(yr)
  1413. int yr;
  1414. {
  1415. /* returns 1 if leapyear, 0 otherwise */
  1416. return (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0);
  1417. }
  1418.  
  1419. double dtor(deg)
  1420. double deg;
  1421. {
  1422. /* convert degrees to radians */
  1423. return (deg * PI / 180);
  1424. }
  1425.  
  1426. double adj360(deg)
  1427. double *deg;
  1428. {
  1429. /* adjust value so 0 <= deg <= 360 */
  1430. do if (*deg < 0)
  1431.    *deg += 360;
  1432. else if (*deg > 360)
  1433.    *deg -= 360;
  1434. while (*deg < 0 || *deg > 360);
  1435. }
  1436. @//E*O*F moonphase.c//
  1437. chmod u=rwx,g=rwx,o=rwx moonphase.c
  1438.  
  1439. echo x - messier.star
  1440. sed 's/^@//' > "messier.star" <<'@//E*O*F messier.star//'
  1441. 053430+2202840ND    TAUm1  Crab Nebula
  1442. 213317-0047700CG    AQRm2
  1443. 134209+2821700CG    CVNm3
  1444. 162302+2624640CG    SCOm4  ,unusually large
  1445. 151916+0205620CG    SERm5  ,spectacular
  1446. 173938-3213600GC    SCOm6  ,butterfly shape
  1447. 175340-3448500GC    SCOm7  ,wider than m6
  1448. 180332-2423600ND    SGRm8  Lagoon Nebula
  1449. 171828-1831800CG    OPHm9  ,bright center
  1450. 165719-0407700CG    OPHm10
  1451. 185121-0616630GC    SCTm11 Wild Duck Cluster
  1452. 164718-0158700CG    OPHm12
  1453. 164154+3627570CG    HERm13 Great Hercules
  1454. 173719-0315880CG    OPHm14
  1455. 213013+1212700CG    PEGm15
  1456. 181925-1347650CO    SERm16 Eagle
  1457. 182127-1611700ND    SGRm17 Omega
  1458. 181927-1708700CO    SGRm18
  1459. 170233-2615800CG    OPHm19
  1460. 180231-2302900ND    SGRm20 Trifid
  1461. 180431-2230700CO    SGRm21
  1462. 183632-2355590CG    SGRm22
  1463. 175629-1901700CO    SGRm23
  1464. 181828-1824500CO    SGRm24 ,very large
  1465. 183229-1915600CO    SGRm25 ,colors, sprawling
  1466. 184522-0924800CO    SCTm26
  1467. 200005+2244760NP    VULm27 Dumbell
  1468. 182433-2452760CG    SGRm28
  1469. 202355+3832710CO    CYGm29 ,good at low pwr
  1470. 214025-2308840CG    CAPm30 ,small
  1471. 004322+4117480GS    ANDm31 Andromeda
  1472. 004322+4053870GP    ANDm32 Andromeda Companion
  1473. 013425+3041580GS    TRIm33 ,neb in face-on galaxy
  1474. 024237+4249550CO    PERm34 ,bright, loose cl
  1475. 060932+2421530CO    GEMm35
  1476. 053640+3406630CO    AURm36 ,bright
  1477. 055338+3233620CO    AURm37
  1478. 052841+3549740CO    AURm38
  1479. 213254+4828520CO    CYGm39 ,very large
  1480. 064704-2044600CO    CMAm41
  1481. 053514-0523500ND    ORIm42 Orion Nebula
  1482. 053514-0516700ND    ORIm43
  1483. 084026+1959370CO    CNCm44 Praesepe, Beehive Cl
  1484. 034729+2408400CO    TAUm45 Pleiades
  1485. 074209-1450700CO    PUPm46
  1486. 073709-1430450CO    PUPm47 ,good binocular obj
  1487. 081314-0546590SA    HYAm48 ,doubtful
  1488. 123016+0759860GS    VIRm49 ,featureless glow
  1489. 070312-0820600CO    MONm50
  1490. 133003+4710860GS    CVNm51 Whirlpool
  1491. 232407+6137760CO    CASm52 ,W-shaped, orange star SW corn
  1492. 131314+1809760CG    COMm53 ,small dim
  1493. 185436-3029770CG    SGRm54
  1494. 193935-3057610CG    SGRm55
  1495. 191658+3011860CG    LYRm56 ,like m53
  1496. 185356+3303930NP    LYRm57 Ring Nebula
  1497. 123816+1148960GS    VIRm58 ,dim near m59
  1498. 124216+1139960GP    VIRm59 ,spherical
  1499. 124416+1133970GP    VIRm60 ,spherical w/sga near
  1500. 122217+0428990GS    VIRm61
  1501. 170136-3007720CG    OPHm62
  1502. 131607+4200950GS    CVNm63 ,bright
  1503. 125714+2140880GS    COMm64 Black-Eye
  1504. 111918+1305960GS    LEOm65 ,spindle shape
  1505. 112018+1259840GS    LEOm66 ,near m65
  1506. 085022+1148700CO    CNCm67
  1507. 123920-2645900CG    HYAm68
  1508. 183038-3221770CG    SGRm69
  1509. 184238-3219820CG    SGRm70
  1510. 195407+1847800CO    SGRm71 ,dim
  1511. 205322-1233920CG    AQRm72
  1512. 205722-1243850CO    AQRm73 ,very open 4 stars
  1513. 013721+1549900GS    PSCm74 ,difficult
  1514. 200529-2157830CG    SGRm75
  1515. 014235+5136999NP    PERm76 Little Dumbell
  1516. 024317+0002990GS    CETm77 ,small indistinct
  1517. 054717+0003800ND    ORIm78
  1518. 052402-2432830CG    LEPm79 ,small bright
  1519. 161730-2259820CG    SCOm80
  1520. 095603+6902760GS    UMAm81 Great Spiral in UMa
  1521. 095605+6940880GS    UMAm82 ,spindle shape
  1522. 133725-2954750GS    HYAm83 ,pale
  1523. 122516+1252960GP    VIRm84 ,circular
  1524. 122516+1810960GS    COMm85 ,small
  1525. 122616+1255970GP    VIRm86 ,near m84
  1526. 123116+1222960GP    VIRm87
  1527. 123216+1424990GS    COMm88
  1528. 123616+1232999GP    VIRm89
  1529. 123716+1308990GS    VIRm90 ,bright nucleus
  1530. 123616+1354999GS    COMm91 ,doubtful, comet
  1531. 171746+4308710CG    HERm92 ,superb globular
  1532. 074404-2352600CO    PUPm93
  1533. 125111+4106890GS    CVNm94 ,very easy galaxy
  1534. 104319+1144990GS    LEOm95
  1535. 104719+1148960GS    LEOm96 ,very near m95
  1536. 111527+5459999NP    UMAm97 Owl Nebula, very dim
  1537. 121416+1453990GS    COMm98 ,faint, v.elongated
  1538. 121916+1424990GS    COMm99 ,dim oval
  1539. 122316+1548990GS    COMm100,v.faint
  1540. 140253+5420840GS    UMAm101,use low magnif
  1541. 013340+6043740GC    CASm103,easily resolved 30x
  1542. 124018-1137840GS    VIRm104Sombrero
  1543. 104819+1234960GS    LEOm105
  1544. 121914+4717860GS    CVNm106,easy elongated
  1545. 163224-1305920GC    OPHm107,pale globular
  1546. 111227+5539990GS    UMAm108,near Merak, elongated
  1547. 115818+5321990GS    UMAm109
  1548. 004022+4143940GS    ANDm110,Andromeda companion
  1549. 002408-7205500CG  47TUCNGC104
  1550. 004332+6148650CI    CASNGC225
  1551. 010225-7050600CG    TUCNGC362
  1552. 011910+5819650CO    CASNGC457
  1553. 014557+6115650CO    CASNGC663
  1554. 022045+5709520CO    PERNGCGC869 Sword Handle
  1555. 022358+5707520CO  x PERNGC884
  1556. 053844-6907570ND    DORNGC2070 Looped Nebula
  1557. 063240+0452570CO    MONNGC2244
  1558. 074150-1812700NP    PUPNGC2440
  1559. 075954-1035750CO    MONNGC2506
  1560. 091159-6451700CG    CARNGC2808
  1561. 102443-1838700NP    HYANGC3242
  1562. 104457-5941700ND  n CARNGC3372 Keyhole Nebula
  1563. 110626-5840700CO    CARNGC3532
  1564. 113614-6137650CG    CENNGC3766
  1565. 121859+4717750GS    CVNNGC4258
  1566. 123624+2559700GS    COMNGC4565
  1567. 125342-6021500CG  k CRUNGC4755 Jewel Box
  1568. 132642-4719480CG  w CENNGC5139
  1569. 134935+6010600ND    UMANGC5322
  1570. 160341-6029600CO    TRANGC6025
  1571. 161321-5413700CG    NORNGC6067
  1572. 164428+2528700NP    HERNGC6210
  1573. 175835+6638650NP    DRANGC6543
  1574. 181238+0651800NP    OPHNGC6572
  1575. 191050-5959700CG    PAVNGC6752
  1576. 210408-1122700NP    AQRNGC7009 Saturn Nebula
  1577. 221505+4953650CO    LACNGC7243
  1578. 232549+4229700NP    ANDNGC7662
  1579. 235133+1616500CO    PEGNGC7772
  1580. 235702+5643800CO    CASNGC7789
  1581. @//E*O*F messier.star//
  1582. chmod u=rwx,g=rx,o=rx messier.star
  1583.  
  1584. echo x - ephem.star
  1585. sed 's/^@//' > "ephem.star" <<'@//E*O*F ephem.star//'
  1586. 053500+0617500I        Orion's Shoulder
  1587. 053500+0617500VM
  1588. 052500+0714500VD
  1589. 051500+0811500VS
  1590. 050500+0908500VM
  1591. 045500+1007500VH
  1592. 044500+1104500VD
  1593. @//E*O*F ephem.star//
  1594. chmod u=rw,g=r,o=r ephem.star
  1595.  
  1596. echo x - con.locs
  1597. sed 's/^@//' > "con.locs" <<'@//E*O*F con.locs//'
  1598. / con.locs    StarChart 'macro library' for canned views
  1599. /        Bob Tidd  inp@amber.berkeley.edu  6/87
  1600. /
  1601. / This is a first cut and not a "cannonical" list of celestial locations.
  1602. / Users should feel free to revise and extend (and post!) new versions.
  1603. /
  1604. /  column 4 coding (to distinguish "virgo area" from "virgo constellation"
  1605. /  c (or blank)=constellation
  1606. /  a=area
  1607. /  f=messier finder chart
  1608. /  t=time of year (evening sky)
  1609. /
  1610. / columns 1-4 exclusively belong to the mnemonic, column five is ignored.
  1611. / The remaining four parameters are three floats plus a string (terminated
  1612. / by the end of line). The first two floats (Ra and Decl) appear in the
  1613. / "hh" or "hh.mm" format used on the command line. Scale is a "traditional"
  1614. / floating point value.
  1615. /
  1616. /...+....1....+....2....+....3....+
  1617. /
  1618. and  1     35   30   Andromeda ?
  1619. and  23.45 40   20   Andromeda
  1620. aqu  22.30 -5   30   Aquarius
  1621. ari  2.15  -18  18   Aries
  1622. aur  5.30  40   20   Auriga ?
  1623. boo  14.45 30   30   Bootes
  1624. can  8.30  18   20   Cancer
  1625. cap  21    -20  20   Capricorn
  1626. cas  1.0   60   15   Cassiopeia
  1627. cep  22    70   30   Cepheus
  1628. cet  7     -5   35   Cetus
  1629. cma  6.45  -20  20   Canis Major
  1630. com  13    25   10   Coma Bereneces
  1631. cor  15.45 28   10   Corona Borealis
  1632. cvn  13    40   10   Canes Venatici
  1633. cyg  20.30 40   30   Cygnus
  1634. equ  21.18 8    8    EQU
  1635. gem  7.30  20   30   Gemini
  1636. her  17    35   35   Hercules
  1637. hyd  11    -15  40   Hydra
  1638. lac  22.20 45   15   LAC
  1639. leo  11    20   30   Leo
  1640. lib  15    -20  20   Libra
  1641. lyr  18.30 35   12   Lyra
  1642. oph  17    0    30   Ophiuchius
  1643. ori  5.5   -.1  21   Orion
  1644. peg  23    30   20   Pegasus
  1645. per  3.30  45   35   Perseus
  1646. pis  1     15   40   Pisces
  1647. sco  17    -30  30   Scorpio
  1648. sct  18.35 -10  10   Scutum
  1649. sgr  18    -23  25   Sagittarius
  1650. trp  5.36  -5   12   Trapezium (Orion)
  1651. tau  4.30  20   30   Taurus
  1652. uma  12.30 55   30   Ursa Major
  1653. vir  13.0  -10  30   Virgo  +-
  1654. vul  19.30 25   10   Vulpecula
  1655. /
  1656. 101f 14.05 54   3 M101 Area
  1657. andf 0.45  41   3 Andromeda, M31
  1658. coma 12.25 16   6 Coma Bereneces M100
  1659. dbcf 2.25  57   2.3 Double Cluster
  1660. hyaf 4.30  17   5 Hyades Cluster
  1661. m47f 7.35  15.4 3 M47 Finder
  1662. m81f 9.55  69   3 M81, M82
  1663. orif 5.35  -5   6 Orion Nebula
  1664. perf 3.25  49   4 Perseus Detail
  1665. plef 3.50  24   3 The Pleiades
  1666. praf 8.40  20   2 Praesepe, M44
  1667. sgra 18.10 -18  10 Sagitarius Cluster
  1668. umaf 11.25 58   12 Ursa Major Bowl
  1669. vira 12.25 14   8 Virgo Cluster
  1670. /
  1671. mayt 13.0  30   110 May Sky
  1672. @//E*O*F con.locs//
  1673. chmod u=rwx,g=rwx,o=rwx con.locs
  1674.  
  1675. exit 0
  1676.  
  1677.