The QBasic Forum     RULES     Other Subforums, Links and Downloads    Index of Threads

  << Previous Topic | Next Topic >>Return to Index  

ProgramList John Grawey

January 10 2006 at 9:30 PM
John Grawey  (no login)

This sundial shadow angle calculator gives you angles for clock time. I found a few calculators by doing a google search but all of then gave you sundial time not clock time.


    
This message has been edited by iorr5t on May 18, 2007 1:42 PM


 
 Respond to this message   
AuthorReply
John Grawey
(no login)

Sundial shadow angle calculator.

January 10 2006, 9:34 PM 

10 CLS
20 PRINT "This program calculates (clock time) shadow angles in 15 minute"
30 PRINT "increments for a horizontal sundial and saves the results to a"
40 PRINT "file called shadowan.txt. If you want the angles for (sundial time)"
50 PRINT "enter the degrees of your time zone's central meridian for longitude."
60 PRINT ""
70 PRINT " Press any key to continue."
80 DD$ = INKEY$
90 IF DD$ = "" THEN 80
100 DIM Z$(15), Y$(15), X$(15)
110 PI = ATN(1) * 4
120 CLS
130 CC = 0
140 INPUT "Enter degrees latitude. ", AA$
150 FOR BB = 1 TO LEN(AA$)
160 IF CC > 1 THEN 260
170 IF ASC(MID$(AA$, BB, 1)) = 46 THEN CC = CC + 1
180 IF ASC(MID$(AA$, BB, 1)) = 46 THEN 210
190 IF ASC(MID$(AA$, BB, 1)) < 48 THEN 260
200 IF ASC(MID$(AA$, BB, 1)) > 57 THEN 260
210 IF CC > 1 THEN 260
220 NEXT BB
230 A = VAL(LEFT$(AA$, LEN(AA$)))
240 IF A < 0 THEN 260
250 IF A > 90 THEN 260 ELSE 300
260 CLS
270 PRINT "Invalid input. Must be greater than 0 not greater 90."
280 B = 1
290 GOTO 130
300 IF B = 1 THEN CLS
310 IF B = 1 THEN PRINT "Enter degrees latitude."; A
320 CC = 0
330 INPUT "Enter degrees longitude. ", AA$
340 FOR BB = 1 TO LEN(AA$)
350 IF CC > 1 THEN 450
360 IF ASC(MID$(AA$, BB, 1)) = 46 THEN CC = CC + 1
370 IF ASC(MID$(AA$, BB, 1)) = 46 THEN 400
380 IF ASC(MID$(AA$, BB, 1)) < 48 THEN 450
390 IF ASC(MID$(AA$, BB, 1)) > 57 THEN 450
400 IF CC > 1 THEN 450
410 NEXT BB
420 C = VAL(LEFT$(AA$, LEN(AA$)))
430 IF C < 0 THEN 450
440 IF C > 180 THEN 450 ELSE 490
450 CLS
460 PRINT "Invalid input. Must be greater than 0 not greater 180."
470 D = 1
480 GOTO 320
490 IF D = 1 THEN CLS
500 IF D = 1 THEN PRINT "Enter degrees latitude."; A
510 IF D = 1 THEN PRINT "Enter degrees longitude."; C
520 PRINT "Which hemisphere? (W) Western (E) Eastern"
530 E$ = INKEY$
540 IF E$ = "" THEN 530
550 IF ASC(E$) = 119 THEN E$ = CHR$(87) ELSE IF ASC(E$) = 101 THEN E$ = CHR$(69)
560 IF ASC(E$) = 87 THEN 600
570 IF ASC(E$) = 69 THEN 600
580 PRINT "Invalid input. W for Western. E for Eastern."
590 GOTO 530
600 IF ASC(E$) = 87 THEN 610 ELSE 680
610 FOR F = 0 TO 180 STEP 15
620 IF F = C THEN 740
630 IF F < C THEN 640 ELSE 650
640 NEXT F
650 G = F - 15
660 H = ((C - G) * 4) / 60
670 GOTO 740
680 FOR F = 180 TO 0 STEP -15
690 IF F = C THEN 740
700 IF F > C THEN 710 ELSE 720
710 NEXT F
720 G = F + 15
730 H = ((G - C) * 4) / 60
740 FOR I = 6 TO 18
750 FOR J = 0 TO 45 STEP 15
760 K = (I + (J / 60)) - H
770 IF K < 6 THEN 1080
780 IF K > 18 THEN 1080
790 IF K = 6 THEN 1080
800 IF K = 18 THEN 1080
810 L = (ABS(TAN((15 * K) * PI / 180))) * (SIN(A * PI / 180))
820 M = ATN(L) * 180 / PI
830 IF Y = 1 THEN 860
840 IF 90 - M = 90 THEN Y = 1
850 IF 90 - M = 90 THEN 1080
860 IF I > 12 THEN N = I - 12 ELSE IF I < 13 THEN N = I
870 O$ = STR$(N): P$ = STR$(J): Q$ = STR$(90 - M)
880 IF LEN(O$) = 2 THEN O$ = " 0" + RIGHT$(O$, 1)
890 IF LEN(P$) = 2 THEN P$ = " 0" + RIGHT$(P$, 1)
900 P$ = RIGHT$(P$, 2)
910 IF LEFT$(RIGHT$(Q$, 2), 1) = "." THEN Q$ = Q$ + "0"
920 IF MID$(Q$, 3, 1) = "." THEN Q$ = " 0" + MID$(Q$, 2, 4)
930 IF LEN(Q$) > 6 THEN Q$ = LEFT$(Q$, 6)
940 IF LEN(Q$) = 3 THEN Q$ = Q$ + ".00"
950 IF I > 11 THEN R$ = "PM" ELSE IF I < 12 THEN R$ = "AM"
960 S$ = O$ + ":" + P$ + R$ + Q$ + " degrees"
970 T = T + 1
980 IF T < 17 THEN 990 ELSE 1020
990 Z$(U) = S$
1000 U = U + 1
1010 GOTO 1080
1020 IF T < 33 THEN 1030 ELSE 1060
1030 Y$(V) = S$
1040 V = V + 1
1050 GOTO 1080
1060 X$(W) = S$
1070 W = W + 1
1080 NEXT J
1090 NEXT I
1100 CLS
1110 OPEN "SHADOWAN.TXT" FOR OUTPUT AS #1
1120 FOR EE = 0 TO 180 STEP 15
1130 IF EE = C THEN FF$ = " Sundial "
1140 NEXT EE
1150 IF FF$ = " Sundial " THEN 1170
1160 FF$ = " Clock "
1170 PRINT FF$ + "time shadow angles for" + STR$(A) + CHR$(248) + " latitude" + STR$(C) + CHR$(248) + " " + E$ + " longitude."
1180 PRINT ""
1190 PRINT #1, FF$ + "time shadow angles for." + STR$(A) + CHR$(248) + " latitude " + STR$(C) + CHR$(248) + " " + E$ + " longitude."
1200 PRINT #1, ""
1210 FOR X = 0 TO 15
1220 PRINT Z$(X) + " " + Y$(X) + " " + X$(X)
1230 PRINT #1, Z$(X) + " " + Y$(X) + " " + X$(X)
1240 NEXT X
1250 CLOSE 1

 
 Respond to this message   
John Grawey
(no login)

Edited version. Works for those east of their central meridian.

January 12 2006, 3:14 PM 

This program as I origionally wrote it would only work if you were west of your time zone's central meridian.

10 CLS
20 PRINT "This program calculates (clock time) shadow angles in 15 minute"
30 PRINT "increments for a horizontal sundial and saves the results to a"
40 PRINT "file called shadowan.txt. If you want the angles for (sundial time)"
50 PRINT "enter the degrees of your time zone's central meridian for longitude."
60 PRINT ""
70 PRINT " Press any key to continue."
80 DD$ = INKEY$
90 IF DD$ = "" THEN 80
100 DIM Z$(15), Y$(15), X$(15)
110 PI = ATN(1) * 4
120 CLS
130 CC = 0
140 INPUT "Enter degrees latitude. ", AA$
150 FOR BB = 1 TO LEN(AA$)
160 IF CC > 1 THEN 260
170 IF ASC(MID$(AA$, BB, 1)) = 46 THEN CC = CC + 1
180 IF ASC(MID$(AA$, BB, 1)) = 46 THEN 210
190 IF ASC(MID$(AA$, BB, 1)) < 48 THEN 260
200 IF ASC(MID$(AA$, BB, 1)) > 57 THEN 260
210 IF CC > 1 THEN 260
220 NEXT BB
230 A = VAL(LEFT$(AA$, LEN(AA$)))
240 IF A < 0 THEN 260
250 IF A > 90 THEN 260 ELSE 300
260 CLS
270 PRINT "Invalid input. Must be greater than 0 not greater 90."
280 B = 1
290 GOTO 130
300 IF B = 1 THEN CLS
310 IF B = 1 THEN PRINT "Enter degrees latitude."; A
320 CC = 0
330 INPUT "Enter degrees longitude. ", AA$
340 FOR BB = 1 TO LEN(AA$)
350 IF CC > 1 THEN 450
360 IF ASC(MID$(AA$, BB, 1)) = 46 THEN CC = CC + 1
370 IF ASC(MID$(AA$, BB, 1)) = 46 THEN 400
380 IF ASC(MID$(AA$, BB, 1)) < 48 THEN 450
390 IF ASC(MID$(AA$, BB, 1)) > 57 THEN 450
400 IF CC > 1 THEN 450
410 NEXT BB
420 C = VAL(LEFT$(AA$, LEN(AA$)))
430 IF C < 0 THEN 450
440 IF C > 180 THEN 450 ELSE 490
450 CLS
460 PRINT "Invalid input. Must be greater than 0 not greater 180."
470 D = 1
480 GOTO 320
490 IF D = 1 THEN CLS
500 IF D = 1 THEN PRINT "Enter degrees latitude."; A
510 IF D = 1 THEN PRINT "Enter degrees longitude."; C
520 PRINT "Are you east of your central meridian? (Y) Yes (N) No"
530 DD$ = INKEY$
540 IF DD$ = "" THEN 530
550 IF ASC(DD$) = 121 THEN DD$ = CHR$(89) ELSE IF ASC(DD$) = 110 THEN DD$ = CHR$(78)
560 IF ASC(DD$) = 89 THEN 600
570 IF ASC(DD$) = 78 THEN 600
580 PRINT "Invalid input. (Y) Yes (N) No."
590 GOTO 530
600 PRINT "Which hemisphere? (W) Western (E) Eastern"
610 E$ = INKEY$
620 IF E$ = "" THEN 610
630 IF ASC(E$) = 119 THEN E$ = CHR$(87) ELSE IF ASC(E$) = 101 THEN E$ = CHR$(69)
640 IF ASC(E$) = 87 THEN 680
650 IF ASC(E$) = 69 THEN 680
660 PRINT "Invalid input. W for Western. E for Eastern."
670 GOTO 610
680 IF ASC(E$) = 87 THEN 690 ELSE 760
690 FOR F = 0 TO 180 STEP 15
700 IF F = C THEN 820
710 IF F < C THEN 720 ELSE 730
720 NEXT F
730 IF DD$ = "Y" THEN G = F ELSE G = F - 15
740 IF DD$ = "Y" THEN H = ((G - C) * 4) / 60 ELSE H = ((C - G) * 4) / 60
750 GOTO 820
760 FOR F = 180 TO 0 STEP -15
770 IF F = C THEN 820
780 IF F > C THEN 790 ELSE 800
790 NEXT F
800 IF DD$ = "Y" THEN G = F ELSE G = F + 15
810 IF DD$ = "Y" THEN H = ((C - G) * 4) / 60 ELSE H = ((G - C) * 4) / 60
820 FOR I = 5 TO 18
830 FOR J = 0 TO 45 STEP 15
840 IF DD$ = "Y" THEN K = (I + (J / 60)) + H ELSE K = (I + (J / 60)) - H
850 IF K < 6 THEN 1160
860 IF K > 18 THEN 1160
870 IF K = 6 THEN 1160
880 IF K = 18 THEN 1160
890 L = (ABS(TAN((15 * K) * PI / 180))) * (SIN(A * PI / 180))
900 M = ATN(L) * 180 / PI
910 IF Y = 1 THEN 940
920 IF 90 - M = 90 THEN Y = 1
930 IF 90 - M = 90 THEN 1160
940 IF I > 12 THEN N = I - 12 ELSE IF I < 13 THEN N = I
950 O$ = STR$(N): P$ = STR$(J): Q$ = STR$(90 - M)
960 IF LEN(O$) = 2 THEN O$ = " 0" + RIGHT$(O$, 1)
970 IF LEN(P$) = 2 THEN P$ = " 0" + RIGHT$(P$, 1)
980 P$ = RIGHT$(P$, 2)
990 IF LEFT$(RIGHT$(Q$, 2), 1) = "." THEN Q$ = Q$ + "0"
1000 IF MID$(Q$, 3, 1) = "." THEN Q$ = " 0" + MID$(Q$, 2, 4)
1010 IF LEN(Q$) > 6 THEN Q$ = LEFT$(Q$, 6)
1020 IF LEN(Q$) = 3 THEN Q$ = Q$ + ".00"
1030 IF I > 11 THEN R$ = "PM" ELSE IF I < 12 THEN R$ = "AM"
1040 S$ = O$ + ":" + P$ + R$ + Q$ + " degrees"
1050 T = T + 1
1060 IF T < 17 THEN 1070 ELSE 1100
1070 Z$(U) = S$
1080 U = U + 1
1090 GOTO 1160
1100 IF T < 33 THEN 1110 ELSE 1140
1110 Y$(V) = S$
1120 V = V + 1
1130 GOTO 1160
1140 X$(W) = S$
1150 W = W + 1
1160 NEXT J
1170 NEXT I
1180 CLS
1190 OPEN "SHADOWAN.TXT" FOR OUTPUT AS #1
1200 FOR EE = 0 TO 180 STEP 15
1210 IF EE = C THEN FF$ = " Sundial "
1220 NEXT EE
1230 IF FF$ = " Sundial " THEN 1250
1240 FF$ = " Clock "
1250 PRINT FF$ + "time shadow angles for" + STR$(A) + CHR$(248) + " latitude" + STR$(C) + CHR$(248) + " " + E$ + " longitude."
1260 PRINT ""
1270 PRINT #1, FF$ + "time shadow angles for." + STR$(A) + CHR$(248) + " latitude " + STR$(C) + CHR$(248) + " " + E$ + " longitude."
1280 PRINT #1, ""
1290 FOR X = 0 TO 15
1300 PRINT Z$(X) + " " + Y$(X) + " " + X$(X)
1310 PRINT #1, Z$(X) + " " + Y$(X) + " " + X$(X)
1320 NEXT X
1330 IF H = 0 THEN 1400
1340 PRINT ""
1350 IF DD$ = "Y" THEN PRINT " You said you are east of your central meridian."
1360 IF DD$ = "N" THEN PRINT " You said you are west of your central meridian."
1370 PRINT #1, ""
1380 IF DD$ = "Y" THEN PRINT #1, " You said you are east of your central meridian."
1390 IF DD$ = "N" THEN PRINT #1, " You said you are west of your central meridian."
1400 CLOSE 1


    
This message has been edited by Solitaire1 on Jan 14, 2006 9:22 PM


 
 Respond to this message   
John Grawey
(no login)

Mac could you change 1 character on 1 line of this program?

January 13 2006, 11:08 PM 

The 6 on line 820 needs to be a 5. For those far enough east of their central meridian the calculations need to start at 5 am instead of 6 am.

 
 Respond to this message   
Current Topic - ProgramList John Grawey
  << Previous Topic | Next Topic >>Return to Index