slb@drutx.UUCP (Sue Brezden) (02/28/86)
>> I am looking for a routine that will return the phase of >> the moon (in floating, a 0-28 integer, or whatever) ... >I'd like to have this code too. Add me to the list. -- Sue Brezden ihnp4!drutx!slb ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nirvana? That's a place where the powers that be and their friends hang out. --Zonker Harris ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
paul@zoom.UUCP (20 Proprietor) (03/05/86)
koyaanisqatsi...koyaanisqatsi...koyaanisqatsi...koyaanisqatsi...koyaanisqatsi...
OK everybody (Doug Escher, Martin Minow, Chris Beekhuis, der Mouse, etc.)...
I feel that there has been sufficient interest in the Moon programs that I'm
posting them to this news group. I hope everyone has fun with them. I got
them orginally from the 'net some time ago - what group I don't remember --
probably `net.sources.games'. At any rate, there are two programs here that
will give you information about our pal, the Moon. `pom.c' actually draws a
little picture of the Moon on your screen. `potm.c' just issues the English
version of the ("...first quarter", etc). I had only a little trouble getting
them to run here on a 3b2/300 due to a small typecast (fixed) plus the need
for the `-f' flag in compiling. The accuracy of these routines should, for
obvious reasons, not be used if you plan to go to the Moon, but it's close
enough for some purposes. I have much more accurate routines (as mentioned
in an earlier posting) for ephemeride determination. I'm currently trying
to negotiate a reasonable means for the distribution of these routines. If
an interested party would be willing to trade my code for a long-term USENET
feed, I'd love to hear from you. I'm really quite serious.
Paul Ruel
A `shar' follows...
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# Makefile
# moontx.c
# moontx.h
# pom.c
# potm.c
echo shar: extracting Makefile
sed 's/^X//' << 'SHAR_EOF' > Makefile
X#
X# Set `MATH' to `-f' if you need to force floating point emulation.
X#
XMATH =
Xall: pom potm
Xpom: pom.o
X cc $(MATH) pom.o -lm -o pom;
Xpotm: potm.o moontx.o
X cc $(MATH) potm.o moontx.o -lm -o potm;
SHAR_EOF
echo shar: extracting moontx.c
sed 's/^X//' << 'SHAR_EOF' > moontx.c
X/****************************************************************************
X moon.c
X
X Phase of the Moon. Calculates the current phase of the moon.
X Based on routines from `Practical Astronomy with Your Calculator',
X by Duffett-Smith.
X Comments give the section from the book that particular piece
X of code was adapted from.
X
X -- Keith E. Brandt VIII 1984
X
X ****************************************************************************/
X
X# include "moontx.h"
X
Xmoontxt(buf)
Xchar buf[];
X{
X char *cp=buf;
X
Xdouble dtor();
Xdouble adj360();
Xdouble potm();
X
Xlong *lo = (long *) calloc (1, sizeof(long)); /* used by time calls */
Xstruct tm *pt; /* ptr to time structure */
X
Xdouble days; /* days since EPOCH */
Xdouble phase; /* percent of lunar surface illuminated */
Xdouble phase2; /* percent of lunar surface illuminated one day later */
Xint i = EPOCH;
X
Xtime (lo); /* get system time */
Xpt = gmtime(lo); /* get ptr to gmt time struct */
Xcfree(lo);
X
X/* calculate days since EPOCH */
Xdays = (pt->tm_yday +1) + ((pt->tm_hour + (pt->tm_min / 60.0)
X + (pt->tm_sec / 3600.0)) / 24.0);
Xwhile (i < pt->tm_year + 1900)
X days = days + 365 + ly(i++);
X
Xphase = potm(days);
Xsprintf(cp,"The Moon is ");
Xcp += strlen(buf);
Xif ((int)(phase + .5) == 100) {
X sprintf(cp,"Full");
X }
Xelse if ((int)(phase + 0.5) == 0)
X sprintf(cp,"New");
Xelse if ((int)(phase + 0.5) == 50) {
X phase2 = potm(++days);
X if (phase2 > phase)
X sprintf(cp,"at the First Quarter");
X else
X sprintf(cp,"at the Last Quarter");
X }
Xelse if ((int)(phase + 0.5) > 50) {
X phase2 = potm(++days);
X if (phase2 > phase)
X sprintf(cp,"Waxing ");
X else
X sprintf(cp,"Waning ");
X cp = buf + strlen(buf);
X sprintf(cp,"Gibbous (%1.0f%% of Full)", phase);
X }
Xelse if ((int)(phase + 0.5) < 50) {
X phase2 = potm(++days);
X if (phase2 > phase)
X sprintf(cp,"Waxing ");
X else
X sprintf(cp,"Waning ");
X cp = buf + strlen(buf);
X sprintf(cp,"Crescent (%1.0f%% of Full)", phase);
X }
X}
X
Xdouble potm(days)
Xdouble days;
X{
Xdouble N;
Xdouble Msol;
Xdouble Ec;
Xdouble LambdaSol;
Xdouble l;
Xdouble Mm;
Xdouble Ev;
Xdouble Ac;
Xdouble A3;
Xdouble Mmprime;
Xdouble A4;
Xdouble lprime;
Xdouble V;
Xdouble ldprime;
Xdouble D;
Xdouble Nm;
X
XN = 360 * days / 365.2422; /* sec 42 #3 */
Xadj360(&N);
X
XMsol = N + EPSILONg - RHOg; /* sec 42 #4 */
Xadj360(&Msol);
X
XEc = 360 / PI * e * sin(dtor(Msol)); /* sec 42 #5 */
X
XLambdaSol = N + Ec + EPSILONg; /* sec 42 #6 */
Xadj360(&LambdaSol);
X
Xl = 13.1763966 * days + lzero; /* sec 61 #4 */
Xadj360(&l);
X
XMm = l - (0.1114041 * days) - Pzero; /* sec 61 #5 */
Xadj360(&Mm);
X
XNm = Nzero - (0.0529539 * days); /* sec 61 #6 */
Xadj360(&Nm);
X
XEv = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */
X
XAc = 0.1858 * sin(dtor(Msol)); /* sec 61 #8 */
XA3 = 0.37 * sin(dtor(Msol));
X
XMmprime = Mm + Ev - Ac - A3; /* sec 61 #9 */
X
XEc = 6.2886 * sin(dtor(Mmprime)); /* sec 61 #10 */
X
XA4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */
X
Xlprime = l + Ev + Ec - Ac + A4; /* sec 61 #12 */
X
XV = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */
X
Xldprime = lprime + V; /* sec 61 #14 */
X
XD = ldprime - LambdaSol; /* sec 63 #2 */
X
Xreturn (50 * (1 - cos(dtor(D)))); /* sec 63 #3 */
X}
X
Xly(yr)
Xint yr;
X{
X/* returns 1 if leapyear, 0 otherwise */
Xreturn (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0);
X}
X
Xdouble dtor(deg)
Xdouble deg;
X{
X/* convert degrees to radians */
Xreturn (deg * PI / 180);
X}
X
Xdouble adj360(deg)
Xdouble *deg;
X{
X/* adjust value so 0 <= deg <= 360 */
Xdo if (*deg < 0)
X *deg += 360;
Xelse if (*deg > 360)
X *deg -= 360;
Xwhile (*deg < 0 || *deg > 360);
X}
SHAR_EOF
echo shar: extracting moontx.h
sed 's/^X//' << 'SHAR_EOF' > moontx.h
X# include <stdio.h>
X#ifdef VAX
X# include <sys/time.h>
X#else VAX
X# include <time.h>
X#endif VAX
X# include <math.h>
X
X#define EPOCH 1985
X#define EPSILONg 279.611371 /* solar ecliptic long at EPOCH */
X#define RHOg 282.680403 /* solar ecliptic long of perigee at EPOCH */
X#define e 0.01671542 /* solar orbit eccentricity */
X#define lzero 18.251907 /* lunar mean long at EPOCH */
X#define Pzero 192.917585 /* lunar mean long of perigee at EPOCH */
X#define Nzero 55.204723 /* lunar mean long of node at EPOCH */
X
X# define PI 3.141592654
SHAR_EOF
echo shar: extracting pom.c
sed 's/^X//' << 'SHAR_EOF' > pom.c
X/*$The phase of the moon, for your safety and convenience.
X**
X** Stolen from ArchMach & converted from PL/I by Brian Hess.
X** Extensively cleaned up by Rich $alz.
X**
X** If you can figure out how this program works, then YOU deserve
X** to be working on it, sucker! Here's a hint: The epoch is 13:23,
X** 10/1/78.
X*/
X
X
X#include <math.h>
X#include <sys/types.h>
X#include <time.h>
X
X
X/* Globals. */
Xlong Day;
Xlong Hour;
Xlong Minute;
Xdouble Fraction;
Xchar *Moon[] =
X{
X "new",
X "first quarter of the",
X "full moon",
X "last quarter of the"
X};
X
X
X/* Linked in later. */
Xchar *rindex();
Xtime_t time();
Xstruct tm *localtime();
X
X
X#define LINES 24
X#define WIDTH 80
X#define CENTER ((WIDTH - 2 * LINES) / 2)
X#define BRIGHT '@'
X#define LEDGE '('
X#define REDGE ')'
X#define FULL 0.5
X#define TwoPi (2 * 3.14159)
X#define ZERO 0.03
X
X#define Plural(X) if (X != 1) printf("s");
X/*!*/
Xlong
XCalculate()
X{
X register struct tm *tm;
X register long Length;
X register long Phase;
X register long DeltaH;
X register long Delta;
X register long offset;
X time_t tick;
X long julian;
X long year;
X long hour;
X long minute;
X
X tick = time((time_t *)0);
X tm = localtime(&tick);
X julian = tm->tm_yday + 1;
X year = tm->tm_year - 78;
X hour = tm->tm_hour;
X minute = tm->tm_min;
X
X Length = (double)2551 / 60 * 1000 + (double)443 / 60;
X offset = ((year * 365L + julian) * 24L + hour) * 60L + minute;
X Delta = offset - (273L * 24L + 13L) * 60L + 23L;
X Phase = Delta - (Delta / Length) * Length;
X
X Fraction = (double)Phase / Length;
X
X Length = Length / 4;
X Phase = Phase / Length;
X Delta = Delta - (Delta / Length) * Length;
X DeltaH = Delta / 60;
X Minute = Delta - DeltaH * 60;
X Day = DeltaH / 24;
X Hour = DeltaH - Day * 24;
X return(Phase);
X}
X/*!*/
Xint
XCharPos(x)
X double x;
X{
X register int i;
X
X i = x * LINES + 0.5;
X if ((i += LINES + CENTER) < 1)
X i = 1;
X return(i);
X}
X
X
Xvoid
XDraw()
X{
X register char *p;
X register int i;
X register int end;
X register double y;
X register double cht;
X register double squisher;
X register double horizon;
X register double terminator;
X char Buffer[256];
X
X /* Clear screen? */
X
X if (Fraction < FULL)
X squisher = cos(TwoPi * Fraction);
X else
X squisher = cos(TwoPi * (Fraction - FULL));
X
X cht = (double)2.0 / (LINES - 6.0);
X for (y = 0.93; y > -1.0; y -= cht)
X {
X for (i = sizeof Buffer, p = Buffer; --i >= 0; )
X *p++ = ' ';
X horizon = sqrt(1.0 - y * y);
X Buffer[ CharPos(-horizon)] = LEDGE;
X Buffer[i = CharPos( horizon)] = REDGE;
X Buffer[++i] = '\0';
X terminator = horizon * squisher;
X if (Fraction > ZERO && Fraction < (1.0 - ZERO))
X {
X if (Fraction < FULL)
X {
X i = CharPos( terminator);
X end = CharPos( horizon);
X }
X else
X {
X i = CharPos(-horizon);
X end = CharPos( terminator);
X }
X while (i <= end)
X Buffer[i++] = BRIGHT;
X }
X printf(" %s\n", Buffer);
X }
X}
X/*!*/
Xmain(ac)
X int ac;
X{
X register long Phase;
X
X Phase = Calculate();
X if (ac == 1)
X Draw();
X
X printf("\nIt is ");
X if (Day == 0 && Hour == 0 && Minute == 0)
X printf("exactly");
X else
X {
X if (Day)
X {
X printf("%ld day", Day);
X Plural(Day);
X if (Hour | Day)
X printf(", ");
X }
X if (Hour)
X {
X printf("%ld hour", Hour);
X Plural(Hour);
X if (Minute)
X printf(", ");
X }
X if (Minute)
X {
X printf("%ld minute", Minute);
X Plural(Minute);
X }
X printf(" since");
X }
X printf(" the %s moon.\n", Moon[Phase]);
X
X exit(0);
X}
SHAR_EOF
echo shar: extracting potm.c
sed 's/^X//' << 'SHAR_EOF' > potm.c
X/*
X** <potm.c> -- Print out the phase of the moon ...
X**
X** programmer: John Dilley (mordred:jad)
X**
X** creation date: Sat Feb 9 14:27
X**
X**
X** modification history
X**
X*/
X
Xstatic char potm[64];
X
Xmain()
X{
X moontxt(potm);
X printf("Phase-of-the-Moon:%s\n", potm+11);
X}
SHAR_EOF
exit