home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
games
/
viewmoon.zip
/
MOONBEAM.V1
< prev
next >
Wrap
Text File
|
1985-03-14
|
21KB
|
570 lines
program moon;
var {global variables}
time,mm,dd,yy,jdn,jd,t,theta,lambda,beta,mmanom,msanom : real;
mra,mdec : real;
continue : boolean;
answer : char;
procedure start;
var
i : integer;
stz : real;
begin
clrscr;
writeln;
writeln;
writeln(' PROGRAM MOONBEAM ');
writeln(' version 1.0');
writeln(' Copyright 1985 by');
writeln(' F. T. Mendenhall Jr.');
for i :=1 to 6 do
writeln;
writeln('Please supply the date of interest:');
write('What is the month (1-12)? ');
readln(mm);
write('What is the day (1-31)?');
readln(dd);
write('What is the year?');
readln(yy);
clrscr;
writeln(' PLEASE ENTER APPROPRIATE TIME ZONE');
writeln;
writeln(' Enter 0 for Universal Time (GMT)');
writeln;
writeln(' Enter 1 for Eastern Standard Time');
writeln;
writeln(' Enter 2 for Central Standard Time');
writeln;
writeln(' Enter 3 for Mountain Standard Time');
writeln;
writeln(' Enter 4 for Pacific Standard Time');
writeln;
write(' What time zone do you wish to use (0-4)? ');
readln(stz);
clrscr;
writeln;
writeln(' USING THE 24 HOUR CLOCK WHAT IS THE TIME OF OBSERVATION?');
writeln;
writeln('NOTE: 1pm=1300 2pm=1400 3pm=1500');
writeln(' 4pm=1600 5pm=1700 6pm=1800');
writeln(' 7pm=1900 8pm=2000 9pm=2100');
writeln(' 10pm=2200 11pm=2300 12am=0000');
writeln;
writeln(' for example 8:45pm would entered as 2045 hours');
writeln;
write(' What is the time of your observation? ');
readln(time);
clrscr;
writeln;
write('For the date ',mm:2:0,'/',dd:2:0,'/',yy:4:0);
writeln(' At ',time:4:0,' Local Time' );
if stz <> 0 then
time := time + stz*100 +400;
end;{end of procedure start}
procedure julian;
var
m,y,a,b : real;
begin { begin julian day procedure}
dd := dd + Int(time/100.0)/24.0 + Frac(time/100.0)/60.0;
if mm > 2 then
begin
y := yy;
m := mm;
end;{end of then clause}
if (mm=1) or (mm=2) then
begin
y := yy-1;
m := mm +12;
end; {end of then clause}
if yy < 1583 then
writeln('WARNING PROGRAM NOT VALID PRIOR TO 1583');
a := int(y/100);
b := 2-a+int(a/4);
jd := int(365.25*y)+int(30.6001*(m+1))+dd+1720994.5+b;
end; {end of procedure julian}
procedure julian_new;
{ This procedure calculates the previous date of the new moon
from the date of interest}
var
jds,ms,ds,k,y,tt,m,m1,f,cor : real;
begin { begin procedure julian_new}
ms := mm;
{ store the original date and julian day}
ds := dd;
mm := 1;
dd := 1;
jds := jd;
{ find the julian day of the first of the year}
julian;
tt := jds -jd;
{ tt is the number of days since the first of the year}
y := yy+tt/365.;
jd := jds;
{restore the original date and jd}
mm := ms;
dd := ds;
k := (y-1900)*12.3685;
k := int(k);
tt := k/1236.85;
jdn := 2415020.75933+29.53058868*k+0.0001178*tt*tt
-0.000000155*tt*tt*tt+0.00033*sin((166.56+132.87*tt
-0.009173*tt*tt)*pi/180.0);
m := (359.2242+29.10535608*k-0.0000333*tt*tt
-0.00000347*tt*tt*tt)*pi/180.0;
m1 := (306.0256+385.81691806*k+0.0107306*tt*tt
+0.00001236*tt*tt*tt)*pi/180.0;
f := (21.2964+390.67050646*k-0.0016528*tt*tt
-0.00000239*tt*tt*tt)*pi/180.0;
cor := (0.1734-0.000393*tt)*sin(m)
+0.0021*sin(2*m)
-0.4068*sin(m1)
+0.0161*sin(2*m1)
-0.0004*sin(3*m1)
+0.0104*sin(2*f)
-0.0051*sin(m+m1)
-0.0074*sin(m-m1)
+0.0004*sin(2*f+m)
-0.0004*sin(2*f-m)
-0.0006*sin(2*f+m1)
+0.0010*sin(2*f-m1)
+0.0005*sin(m+2*m1);
jdn := jdn +cor;
end;
{ jdn is the julian of the previous new moon }
procedure phaseout;
{ This procedure prints out the moon phase }
var
dpn : real;
begin
writeln;
dpn := jd-jdn;
writeln(' The Moon will be ',dpn:3:1,' days passed new');
writeln;
if dpn < 7.5 then
writeln(' The Moon is between New and First Quarter');
if (dpn > 7.5) and (dpn <14) then
writeln (' The Moon is between First Quarter and Full');
If (dpn >14) and (dpn < 21.5) then
writeln(' The Moon is between Full and Last Quarter');
if dpn > 21.5 then
writeln(' The Moon is between Last Quarter and New');
writeln;
writeln('STANDBY: Lunar position being calculated');
end;{end of phaseout}
procedure sunlat;
{This procedure finds the mean sun anomaly and the suns true
longitude theta}
var
l,c : real;
begin {sunlat}
t := (jd-2415020.0)/36525.0;
l := 279.69668 + 36000.76892*t + 0.0003025*t*t;
msanom := 358.475833 + 35999.04975*t - 0.000150*t*t - 0.0000033*t*t*t;
c := +(1.919460-0.004789*t-0.000014*t*t)*sin(msanom*pi/180.0)
+(0.020094 - 0.000100*t)*sin(2.0*msanom*pi/180.0)
+ 0.000293*sin(3.0*msanom*pi/180.0);
theta := l + c;
end; {end procedure sunlat}
procedure moonpos;
{This procedure calculates the moons mean anomaly, and its
longitude, lambda, and latitude, beta}
var
l,d,f,omeg,epsio,addcon,addcon2,rad : real;
begin {moonpos, note that t,msanom are previously calculated in sunlat}
rad := pi/180.0;
epsio := 1.0 - 0.002495*t - 0.00000752*t*t;
addcon := 0.003964*sin((346.560+132.870*t-0.0091731*t*t)*rad);
addcon2 := sin((51.2+20.2*t)*rad);
l := 270.434164 + 481267.8831*t -0.001133*t*t + 0.0000019*t*t*t;
mmanom := 296.104608 + 477198.8491*t +0.009192*t*t +0.0000144*t*t*t;
d := 350.737486 +445267.1142*t -0.001436*t*t +0.0000019*t*t*t;
f := 11.250889 +483202.0251*t -0.003211*t*t -0.0000003*t*t*t;
omeg := 259.183275 -1934.1420*t +0.002078*t*t +0.0000022*t*t*t;
{ now adding periodic variations}
l := l +addcon +0.001964*sin(omeg*rad) +0.000233*addcon2;
msanom := msanom -0.001778*addcon2;
mmanom := mmanom +addcon +0.000817*addcon2 +0.002541*sin(omeg*rad);
d := d +addcon +0.002011*addcon2 +0.001964*sin(omeg*rad);
f := f+addcon -0.024691*sin(omeg*rad)
-0.004328*sin((omeg+275.05-2.3*t)*rad);
{calculate the coordinates}
lambda := l + 6.288750*sin(mmanom*rad)
+1.274018*sin((2*d-mmanom)*rad)
+0.658309*sin(2*d*rad)
+0.213616*sin(2*mmanom*rad)
-0.185596*epsio*sin(msanom*rad)
-0.114336*sin(2*f*rad)
+0.058793*sin((2*d-2*mmanom)*rad)
+0.057212*epsio*sin((2*d-msanom-mmanom)*rad)
+0.053320*sin((2*d+mmanom)*rad)
+0.045874*epsio*sin((2*d-msanom)*rad)
+0.041024*epsio*sin((mmanom-msanom)*rad)
-0.034718*sin(d*rad)
-0.030465*epsio*sin((mmanom+msanom)*rad)
+0.015326*sin((2*d-2*f)*rad)
-0.012528*sin((2*f+mmanom)*rad)
-0.010980*sin((2*f-mmanom)*rad)
+0.010674*sin((4*d-mmanom)*rad)
+0.010034*sin(3*mmanom*rad)
+0.008548*sin((4*d-2*mmanom)*rad)
-0.007910*epsio*sin((msanom-mmanom+2*d)*rad)
-0.006783*epsio*sin((2*d+msanom)*rad)
+0.005162*sin((mmanom-d)*rad)
+0.005000*epsio*sin((msanom+d)*rad)
+0.004049*epsio*sin((mmanom-msanom+2*d)*rad)
+0.003996*sin((2*mmanom+2*d)*rad)
+0.003862*sin(4*d*rad)
+0.003665*sin((2*d-3*mmanom)*rad)
+0.002695*epsio*sin((2*mmanom-msanom)*rad)
+0.002602*sin((mmanom-2*f-2*d)*rad)
+0.002396*epsio*sin((2*d-msanom-2*mmanom)*rad)
-0.002349*sin((mmanom+d)*rad)
+0.002249*epsio*epsio*sin((2*d-2*msanom)*rad)
-0.002125*epsio*sin((2*mmanom+msanom)*rad)
-0.002079*epsio*epsio*sin(2*msanom*rad)
+0.002059*epsio*epsio*sin((2*d-mmanom-2*msanom)*rad)
-0.001773*sin((mmanom+2*d-2*f)*rad)
-0.001595*sin((2*f+2*d)*rad)
+0.001220*epsio*sin((4*d-msanom-mmanom)*rad)
-0.001110*sin((2*mmanom+2*f)*rad)
+0.000892*sin((mmanom-3*d)*rad)
-0.000811*epsio*sin((msanom+mmanom+2*d)*rad)
+0.000761*epsio*sin((4*d-msanom-2*mmanom)*rad)
+0.000717*epsio*epsio*sin((mmanom-2*msanom)*rad)
+0.000704*epsio*epsio*sin((mmanom-2*msanom-2*d)*rad)
+0.000693*epsio*sin((msanom-2*mmanom+2*d)*rad)
+0.000598*epsio*sin((2*d-msanom-2*f)*rad)
+0.000550*sin((mmanom+4*d)*rad)
+0.000538*sin(4*mmanom*rad)
+0.000521*epsio*sin((4*d-msanom)*rad)
+0.000486*sin((2*mmanom-d)*rad);
while lambda > 360.0 do
lambda := lambda -360.0;
while lambda < 0.0 do
lambda := lambda + 360.0;
{ now for Beta }
beta := +5.128189*sin(f*rad)
+0.280606*sin((mmanom+f)*rad)
+0.277693*sin((mmanom-f)*rad)
+0.173238*sin((2*d-f)*rad)
+0.055413*sin((2*d+f-mmanom)*rad)
+0.046272*sin((2*d-f-mmanom)*rad)
+0.032573*sin((2*d+f)*rad)
+0.017198*sin((2*mmanom+f)*rad)
+0.009267*sin((2*d+mmanom-f)*rad)
+0.008823*sin((2*mmanom-f)*rad)
+0.008247*epsio*sin((2*d-msanom-f)*rad)
+0.004323*sin((2*d-f-2*mmanom)*rad)
+0.004200*sin((2*d+f+mmanom)*rad)
+0.003372*epsio*sin((f-msanom-2*d)*rad)
+0.002472*epsio*sin((2*d+f-msanom-mmanom)*rad)
+0.002222*epsio*sin((2*d+f-msanom)*rad)
+0.002072*epsio*sin((2*d-f-msanom-mmanom)*rad)
+0.001877*epsio*sin((f-msanom+mmanom)*rad)
+0.001828*sin((4*d-f-mmanom)*rad)
-0.001803*epsio*sin((f+msanom)*rad)
-0.001750*sin(3*f*rad)
+0.001570*epsio*sin((mmanom-msanom-f)*rad)
-0.001487*sin((f+d)*rad)
-0.001481*epsio*sin((f+msanom+mmanom)*rad)
+0.001417*epsio*sin((f-msanom-mmanom)*rad)
+0.001350*epsio*sin((f-msanom)*rad)
+0.001330*sin((f-d)*rad)
+0.001106*sin((f+3*mmanom)*rad)
+0.001020*sin((4*d-f)*rad)
+0.000833*sin((f+4*d-mmanom)*rad)
+0.000781*sin((mmanom-3*f)*rad)
+0.000670*sin((f+4*d-2*mmanom)*rad)
+0.000606*sin((2*d-3*f)*rad)
+0.000597*sin((2*d+2*mmanom-f)*rad)
+0.000492*epsio*sin((2*d+mmanom-msanom-f)*rad)
+0.000450*sin((2*mmanom-f-2*d)*rad)
+0.000439*sin((3*mmanom-f)*rad)
+0.000423*sin((f+2*d+2*mmanom)*rad)
+0.000422*sin((2*d-f-3*mmanom)*rad)
-0.000367*epsio*sin((msanom+f+2*d-mmanom)*rad)
-0.000353*epsio*sin((msanom+f+2*d)*rad)
+0.000331*sin((f+4*d)*rad)
+0.000317*epsio*sin((2*d+f-msanom+mmanom)*rad)
+0.000306*epsio*epsio*sin((2*d-2*msanom-f)*rad)
-0.000283*sin((mmanom+3*f)*rad);
beta := beta * (1.0 - 0.0004664*cos(omeg*rad)
- 0.0000754*cos((omeg+275.05-2.30*t)*rad));
end; {end of moonpos}
procedure illum; { this procedure calculates the percent of
the moon's disk that is illuminated}
var
d,i,k,ang,y : real;
begin {start of illum}
ang := cos((lambda-theta)*pi/180.0)*cos(beta*pi/180.0);
{ The line solves for the arccos. i.e
the governing equation is
cos(d)=ang }
d := ArcTan(sqrt(1-ang*ang)/ang);
d := d*180.0/pi;
if d < 0. then
d := d + 180.0;
i := 180.0-d-0.1468*
(1-0.0549*sin(mmanom*pi/180.0))/(1-0.0167*sin(msanom*pi/180.0))
*sin(d*pi/180.0);
k := (1+cos(i*pi/180.0))/2.0;
k := k*100.0;
writeln('The Moon`s Disk will be ',k:3:0,' percent illuminated tonight.');
writeln;
end; {end of illum}
procedure equator; {This procedure converts the eclipetal lunar
coordinates to equatorial coordinates
epoch 2000}
var
a,y,RA,DEC,rad,hr,min,sec,deg : real;
const
epsi = 23.4392911;
begin {start of equator}
rad := pi/180.0;
y := (sin(lambda*rad)*cos(epsi*rad)-(sin(beta*rad)/cos(beta*rad))
*sin(epsi*rad));
a := y/cos(lambda*rad);
RA := ArcTan(a)/rad;
if (a > 0.0) and (y > 0.0) and (RA < 0.0) then
RA := RA + 90.0;
if (a > 0.0) and (y < 0.0) then
begin
if RA > 0.0 then
RA := RA + 180.0 else
RA := RA + 270.0;
end;
if (a < 0.0) and (y > 0.0) then
begin
if RA > 0.0 then
RA := RA + 90.0 else
RA := RA + 180.0;
end;
if (a< 0.0) and (y < 0.0) then
begin
if RA > 0.0 then
RA := RA + 270.0 else
RA := RA + 360.0;
end;
RA := RA/15.0; {convert to hours from degrees}
mra := RA;
writeln(' The Moon`s Right Ascension is:');
hr := Int(RA);
min := Int(Frac(RA)*60.0);
sec := Int(Frac(Frac(RA)*60.0)*60.0);
writeln(' ',hr:2:0,' hours ',min:2:0,' min ',sec:2:0,' seconds');
writeln;
writeln(' The Moons Declination is:');
a := sin(beta*rad)*cos(epsi*rad) + cos(beta*rad)*sin(epsi*rad)*
sin(lambda*rad);
{the following equation needs to be solved:
sin(DEC)=a
the next line finds the arcsin using the ArcTan function.}
DEC := ArcTan(a/sqrt(1-a*a))/rad;
mdec := DEC;
deg := Int(DEC);
min := Int(Frac(DEC)*60.0);
sec := Int(Frac(Frac(DEC)*60.0)*60.0);
writeln(' ',deg:3:0,' degrees ',min:2:0,' min ',sec:2:0,' seconds');
end; {end of equator}
{insert moonplot here}
procedure moonplot ;
TYPE
str29 = string[29];
stardata = record
shour : byte;
smin : byte;
ssec : byte;
ssign : char;
sdeg : byte;
sdmin : byte;
smsign : char;
smag : integer;
end;
var
hour : byte;
min : byte;
sec : byte;
sign : string[1];
deg : byte;
dmin : byte;
msign : string[1];
mag : integer;
st : integer;
Irec : integer;
J : integer;
num : integer;
line : string[29];
str2 : string[2];
str3 : string[3];
datafile : text;
filename : string[14];
recfile : string[14];
starfile : file of stardata;
starrec : stardata;
RA : real;
DEC : real;
Xmag : real;
xpos : integer;
ypos : integer;
theta1 : real;
mcx : integer;
mcy : integer;
radius : real;
minmag : real;
dummy : char;
begin
recfile := 'star.rec';
assign(starfile,recfile);
reset(starfile);
Irec := filesize(starfile);
clrscr;
writeln (' The following plots the moon`s position on a star chart.');
writeln (' R.A. is from 0 hours at the right of the screen to');
writeln (' 24 hours at the left of the screen.');
writeln (' DEC is from -50 deg at the bottom to +50 deg at the top.');
writeln (' The star data is from the Yale Bright Star data base and');
writeln (' contains stars down to 7th mag.');
writeln;
write('what is the min magnitude to be plotted (1-7)?');
readln(minmag);
minmag := minmag*100;
clrscr;
Hires;
hirescolor(15);
for J := 0 to Irec-1 do
begin
seek(starfile,J);
read(starfile,starrec);
with starrec do
begin
if (sdeg <= 50) and (minmag > smag) then
begin
RA := shour + smin/60 +ssec/3600;
DEC := sdeg + sdmin/60;
Xmag := smag / 100.0;
xpos := round(630 -(RA/24)*630);
if ssign = '-' then DEC := -1*DEC;
ypos := round((50-DEC)/50*90);
plot(xpos,ypos,1);
if xmag < 4 then
begin
xpos := xpos +1;
plot(xpos,ypos,1);
xpos := xpos -2;
plot(xpos,ypos,1);
xpos :=xpos +1;
ypos :=ypos -1;
plot(xpos,ypos,1);
ypos := ypos +2;
plot(xpos,ypos,1);
end; {of xmag if}
if xmag < 2 then
begin
xpos := xpos +1;
plot(xpos,ypos,1);
xpos := xpos -2;
plot(xpos,ypos,1);
ypos := ypos -2;
plot (xpos,ypos,1);
xpos := xpos +2;
plot(xpos,ypos,1);
end; { of mag 2 if}
if (xmag <1) or (smsign = '-') then
begin
xpos := xpos -1;
ypos := ypos -1;
plot(xpos,ypos,1);
ypos := ypos -1;
plot(xpos,ypos,1);
ypos := ypos +5;
plot(xpos,ypos,1);
ypos := ypos +1;
plot(xpos,ypos,1);
ypos := ypos -3;
xpos := xpos - 3;
plot(xpos,ypos,1);
xpos := xpos +1 ;
plot(xpos,ypos,1);
xpos := xpos + 4;
plot(xpos,ypos,1);
xpos := xpos +1;
plot(xpos,ypos,1);
end; {of 1st mag if};
end; {of if}
end; {of with starrec}
end;{of for}
close(starfile);
{start the moonplot code}
mcx := round(630-(mra/24)*630);
mcy := round((50-mdec)/50 *90);
theta1 := 0.;
radius := 8.0;
while radius > 1.0 do
begin
while theta1 < 2*pi do
begin
xpos := mcx+round(radius*cos(theta1));
ypos := mcy+round(radius/2.0*sin(theta1));
plot(xpos,ypos,1);
theta1 := theta1 + pi/16.0;
end;
radius := radius - 1.0;
theta1 := 0.;
plot(mcx,mcy,1);
end;
gotoxy(1,24);
write('input g to continue -');
readln(dummy);
TextMode(bw80);
end; { of procedure moonplot }
begin { start of moon}
continue := true;
while continue do
begin
start;
julian;
writeln ('julian date of the observation is ',jd:10:3);
julian_new;
phaseout;
sunlat;
moonpos;
writeln;
illum;
equator;
writeln;
write(' Do you want a plot of position on star chart (y/n)?');
readln(answer);
if (answer) = 'y' then moonplot;
write('Do you want to check another date (y/n)? ');
readln(answer);
if (answer) <> 'y' then continue := false;
end; {of while}
clrscr;
writeln;
writeln;
writeln('Astronomy is a beautiful adventure! I hope this program helps you');
writeln('obtain more pleasure from your investigation of the night skies.');
writeln('This program is Copyrighted. However, the author grants everyone ');
writeln('the right to copy and distribute this program as long as they');
writeln('do not charge money or services in exchange for the program.');
writeln;
writeln('If you find this program useful and wish to encourage the ');
writeln('development of other free programs, the author requests a ');
writeln('donation of $5.00 be sent to:');
writeln;
writeln(' Fred Mendenhall');
writeln(' 2209 Tam-O-Shanter Ct.');
writeln(' Carmel, Ind. 46032');
writeln;
writeln('Copies of the Pascal source file are available by');
writeln('sending a SASE and blank disk with your donation.');
writeln;
writeln(' Happy Observing!');
end. {end of moon}