mirror of
https://github.com/BigEd/FractalLandscape.git
synced 2024-11-23 12:32:18 +00:00
Added line numbers
but have not tried to convert any label references
This commit is contained in:
parent
c505ca8c8d
commit
a983eb5efb
524
pcfractal.bas
Normal file
524
pcfractal.bas
Normal file
@ -0,0 +1,524 @@
|
||||
20 REM MacFractal (c) Jack Weber - October 1985
|
||||
30 REM Plots fractal landscapes as a 3D grid by taking a random straight line
|
||||
40 REM across the grid and raising (or lowering) all points to one side of the
|
||||
50 REM line by one level step.
|
||||
60 REM Full hidden-line removal.
|
||||
70 REM Landscape may be flooded to any level.
|
||||
80 REM Adjustable vertical scale.
|
||||
90 REM Rotation in 90 degree steps in either direction.
|
||||
100 REM
|
||||
110 REM This program runs on a 128k or 512k Apple Macintosh under MS Basic.
|
||||
120 REM Passing this program through the Basic Compressor utility gives a speed
|
||||
130 REM increase of about 15%.
|
||||
140 REM
|
||||
|
||||
160 GOSUB Initialise
|
||||
170 REM Main program loop prints current generation number in its own window
|
||||
180 REM then re-calculates the grid and, if necessary, draws it
|
||||
|
||||
200 mainloop:
|
||||
210 FOR g%=gs% TO gen%
|
||||
220 WINDOW OUTPUT 3
|
||||
230 CLS
|
||||
240 CALL TEXTFONT(0)
|
||||
250 PRINT USING "#####";g%;
|
||||
260 GOSUB Calculate
|
||||
270 IF (g% MOD plot%=0) OR (g%=gen%) THEN GOSUB Plot
|
||||
280 NEXT
|
||||
290 REM When all iterations done, offer user choice to continue or stop there
|
||||
300 IF gen%>32000 THEN GOSUB Endless
|
||||
310 WINDOW 2,,(20,280)-(140,320),2
|
||||
320 BUTTON 1,1," Finished",(10,2)-(110,18),3
|
||||
330 BUTTON 2,1," Continue", (10,20)-(110,40),3
|
||||
340 WHILE DIALOG(0)<>1: WEND
|
||||
350 REM If "Finished" pressed hold display in endless loop
|
||||
360 IF DIALOG(1)=1 THEN WINDOW CLOSE 2: GOSUB Endless
|
||||
370 REM "Continue" pressed so increment generation counter and do 500 more gs%=gen$+1
|
||||
380 gen%=gen%+500
|
||||
390 WINDOW CLOSE 2
|
||||
400 GOTO mainloop
|
||||
410 END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
490 Initialise:
|
||||
500 REM Open main output window
|
||||
510 WINDOW 1,"MacFractal",(5,40)-(508,335),1
|
||||
520 CLS
|
||||
530 DIM c%(30,30), d%(30,30), poly%(12)
|
||||
540 RANDOMIZE TIMER
|
||||
550 REM Start with magnification=1, 1st generation and no flooding
|
||||
560 magn!=1
|
||||
570 gs%=1
|
||||
580 flood%=0
|
||||
590 REM Set up pattern array for shading flood water
|
||||
600 FOR i%=0 TO 3
|
||||
610 patt%(i%)=21930
|
||||
620 NEXT
|
||||
630 REM Open a window and enter size of grid and number of generations to be done
|
||||
640 WINDOW 2,,(100,80)-(400,170),2
|
||||
650 CALL TEXTFONT(0)
|
||||
660 xin:
|
||||
670 CALL MOVETO(25,20)
|
||||
680 INPUT "Enter extent of X axis (max 30) - ", xmax%
|
||||
690 IF xmax%>30 OR xmax%<2 THEN BEEP: GOTO xin
|
||||
700 yin:
|
||||
710 CALL MOVETO(25,45)
|
||||
720 INPUT "Enter extent of Y axis (max 30) - ", ymax%
|
||||
730 IF ymax%>30 OR ymax%<2 THEN BEEP: GOTO yin
|
||||
740 genin:
|
||||
750 CALL MOVETO(25,70)
|
||||
760 INPUT "Enter number of iterations - ", gen%
|
||||
770 IF gen%>32000 OR gen%<1 THEN BEEP: GOTO genin
|
||||
780 REM Close that window and open new one to enter frequency of plots
|
||||
790 WINDOW CLOSE 2
|
||||
800 WINDOW 2,,(100,100)-(400,220),2
|
||||
810 CALL TEXTFONT(0)
|
||||
820 PRINT " How many iterations between plots?"
|
||||
830 BUTTON 1,1,"1",(20,25)-(65,50),3
|
||||
840 BUTTON 2,1,"10",(155,25)-(200,50),3
|
||||
850 BUTTON 3,1,"50",(20,55)-(70,80),3
|
||||
860 BUTTON 4,1,"100",(155,55)-(215,80),3
|
||||
870 BUTTON 5,1,"Draw final surface only",(20,85)-(220,110),3
|
||||
880 WHILE DIALOG(0)<> 1: WEND
|
||||
890 press%=DIALOG(l)
|
||||
900 plot%=1
|
||||
910 IF press%=2 THEN plot%=10
|
||||
920 IF press%=3 THEN plot%=50
|
||||
930 IF press%=4 THEN plot%=100
|
||||
940 IF press%=5 THEN plot%=gen%
|
||||
950 WINDOW CLOSE 2
|
||||
|
||||
970 REM Calculate screen co-ordinates of grid origin according to size of grid
|
||||
980 REM but they could just as easily be fixed near the centre top of the screen
|
||||
990 xo%=334-2*xmax%
|
||||
1000 yo%=80-2*ymax%
|
||||
1010 REM Put plot manipulation options in menu bar
|
||||
1020 MENU 6,0,1,"Landscape"
|
||||
1030 MENU 6,1,1,"Rotate left"
|
||||
1040 MENU 6,2,1,"Rotate right"
|
||||
1050 MENU 6,3,1,"Magnify"
|
||||
1060 MENU 6,4,1,"Flood"
|
||||
1070 ON MENU GOSUB Menucheck
|
||||
1080 REM Advise user if initial iterations are likely to take a long time
|
||||
1090 IF plot%=1 AND (xmax%*ymax%)<400 GOTO ready
|
||||
1100 WINDOW 2,,(150,100)-(350,190),4
|
||||
1110 PRINT: PRINT " Performing initial iteration";
|
||||
1120 IF plot%>1 THEN PRINT "s" ELSE PRINT"???"
|
||||
1130 CALL TEXTFONT(0)
|
||||
1140 PRINT: PRINT TAB(8);"Please wait"
|
||||
1150 ready:
|
||||
1160 REM Open small window to display generation number
|
||||
1170 WINDOW 3,,(10,50)-(60,66),4
|
||||
1180 MENU ON
|
||||
1190 RETURN
|
||||
|
||||
1210 Calculate:
|
||||
1220 MENU STOP
|
||||
1230 ortho%=0
|
||||
1240 REM Select two sides which fault line will cross
|
||||
1250 side%(1)=INT(RND*4)
|
||||
1260 side2:
|
||||
1270 side%(2)=INT(RND*4)
|
||||
1280 IF side%(2)=side%(1) GOTO side2
|
||||
1290 REM Pos subroutines select random positions where line will cross the sides
|
||||
1300 FOR i%= 1 TO 2
|
||||
1310 ON side%(i%)+1 GOSUB Pos1,Pos2,Pos3,Pos4
|
||||
1320 NEXT
|
||||
1330 REM Set flag if line parallel to Y-axis to avoid division by zero
|
||||
1340 IF xx%(1)=xx%(2) THEN ortho%=1 : GOTO skipover
|
||||
1350 REM Equation of straight line is y=m*x+k. Calculate m and k
|
||||
1360 m=(yy%(2)-yy%(1))/(xx%(2)-xx%(1))
|
||||
1370 k=yy%(l)-m*xx%(1)
|
||||
1380 skipover:
|
||||
1390 REM Select whether points above line are to be raised or lowered
|
||||
1400 q%=INT(RND*2): IF q%=0 THEN q%=-1
|
||||
|
||||
|
||||
|
||||
|
||||
1450 REM Check all grid points. If above line raise (or lower)
|
||||
1460 FOR x%=1 TO xmax%
|
||||
1470 REM First find y co-ordinate of the line at that value of x
|
||||
1480 yp%=INT(m*x%+k)
|
||||
1490 FOR y%=l TO ymax%
|
||||
1500 IF ortho%=0 AND y%>yp% THEN c%(x%,y%)=c%(x%,y%)+q%: GOTO nex
|
||||
1510 IF ortho%=1 AND x%>xx%(1) THEN c%(x%,y%)=c%(x%,y%)+q%
|
||||
1520 nex:
|
||||
1530 NEXT
|
||||
1540 NEXT
|
||||
1550 MENU ON
|
||||
1560 RETURN
|
||||
|
||||
1580 Pos1:
|
||||
1590 xx%(i%)=1: yy%(i%)=INT(RND*ymax%)+1
|
||||
1600 RETURN
|
||||
|
||||
1620 Pos2:
|
||||
1630 xx%(i%)=INT(RND*xmax%)+1: yy%(i%)=ymax%
|
||||
1640 RETURN
|
||||
|
||||
1660 Pos3:
|
||||
1670 xx%(i%)=xmax%: yy%(i%)=INT(RND*ymax%)
|
||||
1680 RETURN
|
||||
|
||||
1700 Pos4:
|
||||
1710 xx%(i%)=INT(RND*xmax%): yy%(i%)=1
|
||||
1720 RETURN
|
||||
|
||||
1740 Plot:
|
||||
1750 MENU STOP
|
||||
1760 WINDOW CLOSE 2
|
||||
1770 WINDOW OUTPUT 1
|
||||
1780 CLS
|
||||
1790 REM Use separate plotting routines for flooding on or off
|
||||
1800 IF flood%=0 THEN GOSUB Dryplot ELSE GOSUB Floodplot
|
||||
1810 MENU ON
|
||||
1820 RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1930 Dryplot:
|
||||
1940 REM Scan all grid points
|
||||
1950 FOR x%= 1 TO xmax%
|
||||
1960 FOR y%= 1 TO ymax%
|
||||
1970 REM Calculate screen co-ordinates of first corner of grid square at (x%,y%)
|
||||
1980 x1%=xo%+(y%-x%)*7
|
||||
1990 y1%=yo%-INT(magn!*c%(x%,y%))+(x%+y%)*4
|
||||
2000 REM Then calculate screen co-ordinates of second corner at (y%-1,y%)
|
||||
2010 x2%=x1%+7
|
||||
2020 y2%=yo%-INT(magn!*c%(x%-1,y%))+(x%-1+y%)*4
|
||||
2030 REM Draw side of grid square parallel to X-axis
|
||||
2040 REM First erase hidden-lines by drawing broad line in white
|
||||
2050 CALL PENSIZE(1,30): CALL PENMODE(11)
|
||||
2060 CALL MOVETO(x2%,y2%): CALL LINETO(x1%,y1%)
|
||||
2070 REM Then draw new line
|
||||
2080 IF x%>1 THEN LINE(x%,y1%)-(x2%,y2%)
|
||||
2090 REM If end of row has been reached then second line riot needed so skip on
|
||||
2100 IF y%=ymax% GOTO loopdry
|
||||
2110 REM Draw side of grid square parallel to V-axis
|
||||
2120 REM Calculate co-ordinates of 3rd corner at (x%,y%+1)
|
||||
2130 y3%=yo%-INT (magn!*c%(x%,y%+1))+(x%+y%+1)*4
|
||||
2140 REM Erase hidden-lines as before
|
||||
2150 CALL LINETO(x2%,y3%)
|
||||
2160 REM Draw new line
|
||||
2170 LINE(x1%,y1%)-(x2%,y3%)
|
||||
2180 loopdry:
|
||||
2190 NEXT
|
||||
2200 NEXT
|
||||
2210 REM Draw base of grid
|
||||
2220 CALL PENNORMAL
|
||||
2230 REM First find altitudes of the three visible corners
|
||||
2240 ca%=c%(xmax%,1): cb%=c%(xmax%,ymax%): cc%=c%(l,ymax%)
|
||||
2250 REM Then draw three vertical lines down from these corners
|
||||
2260 LINE(xo%+(1-xmax%)*7,yo%+(xmax%+1)*4-INT(magn!*ca%))-STEP(0,30+INT(magn!*ca%))
|
||||
2270 LINE(xo%+(ymax%-xmax%)*7,yo%+(xmax%+ymax%)*4-INT(magn!*cb%))-
|
||||
2280 STEP(0,30+INT(magn!*cb%))
|
||||
2290 LINE(xo%+(ymax%-1)*7,yo%+(1+ymax%)*4-INT(magn!*cc%))-
|
||||
2300 STEP(0,30+INT(magn!*cc%))
|
||||
2310 REM Finally draw the two base lines
|
||||
2320 LINE-STEP((1-xmax%)*7,(xmax%-1)*4)
|
||||
2330 LINE-STEP((1-ymax%)*7,(1-ymax%)*4)
|
||||
2340 RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2410 Floodplot:
|
||||
2420 FOR x%= 1 TO xmax%
|
||||
2430 FOR y%=l TO ymax%
|
||||
2440 REM Check level to see if this point is flooded.
|
||||
2450 REM If it is, draw it at water level
|
||||
2460 IF c%(x%,y%)<ml% THEN ca%=ml% ELSE ca%=c%(x%,y%)
|
||||
2470 IF c%(x%-1,y%)<ml% THEN cb%=ml% ELSE cb%=c%(x%-1,y%)
|
||||
2480 REM Calculate co-ordinates and plot as for dry
|
||||
2490 x1%=xo%+(y%-x%)*7
|
||||
2500 y1%=yo%-INT(magn!*ca%)+(x%+y%)*4
|
||||
2510 x2%=x1%+7
|
||||
2520 y2%=yo%-INT(magn!*cb%)+(x%-1+y%)*4
|
||||
2530 CALL PENSIZE(1,30): CALL PENMODE(11)
|
||||
2540 CALL MOVETO(x2%,y2%): CALL LINETO(xl%,yl%)
|
||||
2550 IF x%>1 THEN LINE(xl%,y1%)-(x2%,y2%)
|
||||
2560 IF y%=ymax% GOTO loopflood
|
||||
2570 IF c%(x%,y%+l)<ml% THEN cc%=ml% ELSE cc%=c%(x%,y%+l)
|
||||
2580 y3%=yo%-INT(magn!*cc%)+(x%+y%+1)*4
|
||||
2590 CALL LINETO(x2%,y3%)
|
||||
2600 LINE(x1%,y1%)-(x2%,y3%)
|
||||
2610 loopflood:
|
||||
2620 REM Shade any part of square which is flooded
|
||||
2630 GOSUB Shade
|
||||
2640 NEXT
|
||||
2650 NEXT
|
||||
2660 CALL PENNORMAL
|
||||
2670 REM Draw base as for dry
|
||||
2680 IF c%(xmax%,1)<ml% THEN ca%=ml% ELSE ca%=c%(xmax%,l)
|
||||
2690 IF c%(xmax%,ymax%)<ml% THEN cb%=ml% ELSE cb%=c%(xmax%,ymax%)
|
||||
2700 IF c%(l,ymax%)<ml% THEN cc%=ml% ELSE cc%=c%(l,ymax%)
|
||||
2710 LINE(xo%+(1-xmax%)*7,yo%+(xmax%+l)*4-INT(magn!*ca%))-
|
||||
2720 STEP(0,30+INT(magn!*ca%))
|
||||
2730 LINE(xo%+(ymax%-xmax%)*7,yo%+(xmax%+ymax%)*4-INT(magn!*cb%))-
|
||||
2740 STEP(0,30+INT(magn!*cb%))
|
||||
2750 LINE(xo%+(ymax%-1)*7,yo%+(l+ymax%)*4-INT(magn!*cc%))-
|
||||
2760 STEP(0,30+INT(magn!*cc%))
|
||||
2770 LINE-STEP((1-xmax%)*7,(xmax%- 1)*4)
|
||||
2780 LINE-STEP((1-ymax%)*7,(1-ymax%)*4)
|
||||
2790 RETURN
|
||||
|
||||
2810 Menucheck: A menu selection has been detected - find what it is
|
||||
2820 menunumber%=MENU(0)
|
||||
2830 IF menunumber%<>6 THEN RETURN
|
||||
2840 menuitem%=MENU(1)
|
||||
2850 ON menuitem% GOSUB Rotateleft,Rotateright, Magnify, Flood
|
||||
2860 RETURN
|
||||
|
||||
|
||||
2890 Rotateleft:
|
||||
2900 REM Rotate by reading c& array into dX array with axes interchanged
|
||||
2910 FOR x%=1 TO xmax%
|
||||
2920 FOR y%=l TO ymax%: d%(ymax%-y%+1,x%)=c%(x%,y%): NEXT
|
||||
2930 NEXT
|
||||
2940 REM Then return rotated data to c% array
|
||||
2950 SWAP xmax%,ymax%
|
||||
2960 FOR x%=0 TO xmax%
|
||||
2970 FOR y%=1 TO ymax%: c%(x%,y%)=d%(x%,y%): NEXT
|
||||
2980 NEXT
|
||||
2990 GOSUB Plot
|
||||
3000 MENU
|
||||
3010 RETURN
|
||||
|
||||
3030 Rotateright:
|
||||
3040 FOR x%=l TO xmax%
|
||||
3050 FOR y%=1 TO ymax%: d%(y%,xmax%-x%+1)=c%(x%,y%): NEXT
|
||||
3060 NEXT
|
||||
3070 SWAP xmax%,ymax%
|
||||
3080 FOR x%=0 TO xmax%
|
||||
3090 FOR y%=0 TO ymax%: c%(x%,y%)=d%(x%,y%): NEXT
|
||||
3100 NEXT
|
||||
3110 GOSUB Plot
|
||||
3120 MENU
|
||||
3130 RETURN
|
||||
|
||||
3150 Magnify:
|
||||
3160 REM Open window to enter desired vertical scale magnification
|
||||
3170 WINDOW 2,,(80,100)-(420,220),2
|
||||
3180 CALL TEXTFONT(0)
|
||||
3190 PRINT SPC(4);"adjust vertical magnification as required"
|
||||
3200 REM Draw magnification selection bar
|
||||
3210 LINE(15,70)-(325,90),,b
|
||||
3220 LINE(16,71)-(324,89),,b
|
||||
3230 BUTTON 1,1,"OK",(240,25)-(290,55),1
|
||||
3240 REM Put scale markings and labels onto selection bar
|
||||
3250 FOR i%=20 TO 320 STEP 20: LINE(1%,90)-(i%,95): NEXT
|
||||
3260 CALL TEXTFONT(1)
|
||||
3270 CALL TEXTSIZE(9)
|
||||
3280 FOR i%=20 TO 320 STEP 100
|
||||
3290 CALL MOVETO(i%,108)
|
||||
3300 PRINT .5*(1+(i%-20)/l00);
|
||||
3310 LINE(i%,95)-(i%,100)
|
||||
3320 NEXT
|
||||
|
||||
|
||||
|
||||
|
||||
3370 REM Draw magnification pointer to show current magnification
|
||||
3380 REM allow it to move with the mouse until the OK button is pressed
|
||||
3390 LINE(20+(magn!-.5)*200,72)-STEP(0, 16)
|
||||
3400 WHILE DIALOG(0)<> 1
|
||||
3410 IF MOUSE(0)<>0 THEN GOSUB Mousemag
|
||||
3420 WEND
|
||||
3430 WINDOW CLOSE 2
|
||||
3440 REM Re-draw grid with new magnification
|
||||
3450 GOSUB Plot
|
||||
3460 MENU
|
||||
3470 RETURN
|
||||
|
||||
3490 Mousemag:
|
||||
3500 REM Find position of mouse, if it is within selection bar then move pointer
|
||||
3510 IF MOUSE(1)<15 OR MOUSE(1)>325 THEN RETURN
|
||||
3520 IF MOUSE(2)<70 OR MOUSE(2)>90 THEN RETURN
|
||||
3530 LINE(20+(magn!-.5)*200,72)-STEP(0,16),30
|
||||
3540 magn!=.5+((MOUSE(1)-20)\20)/10
|
||||
3550 LINE(20+(magn!-.5)*200,72)-STEP(0,16)
|
||||
3560 RETURN
|
||||
|
||||
3580 Flood:
|
||||
3590 REM Open a window
|
||||
3600 WINDOW 2,,(80,100)-(420,220),2
|
||||
3610 PRINT: PRINT: PRINT SPC(14);"Calculating levels"
|
||||
3620 CALL TEXTFONT(0)
|
||||
3630 PRINT: PRINT SPC(16);"Please wait"
|
||||
3640 REM Find highest and lowest levels present within the array
|
||||
3650 min%=10000
|
||||
3660 max%=-10000
|
||||
3670 FOR x%=1 TO xmax%
|
||||
3680 FOR y%=l TO ymax%
|
||||
3690 IF c%(x%,y%)<min% THEN min%=c%(x%,y%)
|
||||
3700 IF c%(x%,y%)>max% THEN max%=c%(x%,y%)
|
||||
3710 NEXT
|
||||
3720 NEXT
|
||||
3730 CLS
|
||||
3740 CALL TEXTFONT(1)
|
||||
3750 CALL TEXTSIZE(9)
|
||||
3760 REM Draw flood level selection bar
|
||||
3770 LINE(17,70)-(323,90),,b
|
||||
3780 LINE(18,71)-(322,89),,b
|
||||
3790 REM Put scale markings and labels on selection bar
|
||||
3800 div%(max%-min%)\10: IF div%=0 THEN div%=l
|
||||
|
||||
|
||||
|
||||
|
||||
3850 FOR i%=min% TO max%
|
||||
3860 scalex%=20+(i%-min%)*300/(max%-min%)
|
||||
3870 IF i% MOD div%=0 OR i%=max% THEN LINE(scalex%,90)-STEP(0,6)
|
||||
3880 IF i% MOD (div%*5)=0 OR i%=min% OR i%=max% THEN
|
||||
3890 CALL MOVETO(scalex%-10,110): PRINT i%;
|
||||
3900 NEXT
|
||||
3910 CALL TEXTSIZE(12)
|
||||
3920 CALL TEXTFONT(0)
|
||||
3930 CALL MOVETO(50,50): PRINT "Select required water level";
|
||||
3940 BUTTON 1,1,"OK",(270,10)-(320,40),1
|
||||
3950 level%=ml%-min%
|
||||
3960 REM If Flood had been previously selected, the old level may now be outside
|
||||
3970 REM the present level range - adjust if necessary
|
||||
3980 IF flood%=0 OR level%<0 THEN level%=0
|
||||
3990 IF level%>max%-min% THEN level%=max%-min%
|
||||
4000 REM Draw pointer on selection bar to show current water level
|
||||
4010 REM allow it to move with the mouse until the OK button is pressed
|
||||
4020 LINE(20+level%*300/(max%-min%),72)-STEP(0,16)
|
||||
4030 WHILE DIALOG(0)<>1
|
||||
4040 IF MOUSE(0)<>0 THEN GOSUB Mouseflood
|
||||
4050 WEND
|
||||
4060 ml%=min%+level%
|
||||
4070 REM Set flood flag if chosen flood level is not zero
|
||||
4080 IF level%>0 THEN flood%=1
|
||||
4090 WINDOW CLOSE 2
|
||||
4100 REM Re-draw grid with new flood level
|
||||
4110 GOSUB Plot
|
||||
4120 MENU
|
||||
4130 RETURN
|
||||
|
||||
4150 Mouseflood:
|
||||
4160 REM Find position of mouse, if it is within selection bar then move pointer
|
||||
4170 IF MOUSE(1)<20 OR MOUSE(1)>320 THEN RETURN
|
||||
4180 IF MOUSE(2)<70 OR MOUSE(2)>90 THEN RETURN
|
||||
4190 LINE(20+level%*300/(max%-min%),72)-STEP(0,16),30
|
||||
4200 level%=(MOUSE(1)-20)/(300/(max%-min%))
|
||||
4210 LINE(20+level%*300/(max%-min%),72)-STEP(0,16)
|
||||
4220 RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
4330 Shade:
|
||||
4340 IF x%=1 OR y%>=ymax% THEN RETURN
|
||||
4350 REM Count number of corners in each grid square which are below flood level
|
||||
4360 corner%=0
|
||||
4370 maglev%=INT(magn!*ml%)
|
||||
4380 IF c%(x%,y%)<=ml% THEN corner%=l
|
||||
4390 IF c%(x%-1,y%)<=ml% THEN corner%=corner%+1
|
||||
4400 IF c%(x%,y%+1)<=ml% THEN corner%=corner%+1
|
||||
4410 IF c%(x%-1,y%+1)<=ml% THEN corner%=corner%+1
|
||||
4420 REM No shading if less than 3 corners are below flood level
|
||||
4430 IF corner%<3 THEN RETURN
|
||||
4440 REM Prepare array for Toolbox FILLPOLY subroutine
|
||||
4450 poly%(1)=yo%+(x%-1+y%)*4-maglev%
|
||||
4460 poly%(2)=xo%+(y%-x%)*7
|
||||
4470 poly%(3)=poly%(1)+8
|
||||
4480 poly%(4)=poly%(2)+14
|
||||
4490 REM If 3 corners wet shade triangle. If all 4 wet shade whole square
|
||||
4500 IF corner%=3 THEN GOSUB Trishade ELSE GOSUB Squareshade
|
||||
4510 CALL FILLPOLY(VARPTR(poly%(0)),VARPTR(patt%(O)))
|
||||
4520 RETURN
|
||||
|
||||
4540 Trishade:
|
||||
4550 poly%(0)=22
|
||||
4560 REM Find which of 4 possible triangles needs shading
|
||||
4570 IF c%(x%,y%)>ml% THEN GOSUB Tri1: RETURN
|
||||
4580 IF c%(x%-1,y%)>ml% THEN GOSUB Tri2: RETURN
|
||||
4590 IF c%(x%,y%+1)>ml% THEN GOSUB Tri3: RETURN
|
||||
4600 GOSUB Tri4
|
||||
4610 RETURN
|
||||
|
||||
4630 Tri1:
|
||||
4640 poly%(5)=poly%(l)
|
||||
4650 poly%(6)=poly%(2)+7
|
||||
4660 poly%(7)=poly%(3)
|
||||
4670 poly%(8)=poly%(6)
|
||||
4680 poly%(9)=poly%(1)+4
|
||||
4690 poly%(10)=poly%(4)
|
||||
4700 poly%(2)=poly%(6)
|
||||
4710 RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
4810 Tri2:
|
||||
4820 poly%(5)=poly%(l)+4
|
||||
4830 poly%(6)=poly%(2)
|
||||
4840 poly%(7)=poly%(3)
|
||||
4850 poly%(8)=poly%(2)+7
|
||||
4860 poly%(9)=poly%(5)
|
||||
4870 poly%(10)=poly%(4)
|
||||
4880 poly%(l)=poly%(5)
|
||||
4890 RETURN
|
||||
|
||||
4910 Tri3:
|
||||
4920 poly%(5)=poly%(1)+4
|
||||
4930 poly%(6)=poly%(2)
|
||||
4940 poly%(7)=poly%(l)
|
||||
4950 poly%(8)=poly%(2)+7
|
||||
4960 poly%(9)=poly%(5)
|
||||
4970 poly%(10)=poly%(4)
|
||||
4980 poly%(3)=poly%(5)
|
||||
4990 RETURN
|
||||
|
||||
5010 Tri4:
|
||||
5020 poly%(5)=poly%(1)+4
|
||||
5030 poly%(6)=poly%(2)
|
||||
5040 poly%(7)=poly%(3)
|
||||
5050 poly%(8)=poly%(2)+7
|
||||
5060 poly%(9)=poly%(1)
|
||||
5070 poly%(10)=poly%(a)
|
||||
5080 poly%(4)=poly%(8)
|
||||
5090 RETURN
|
||||
|
||||
5110 Squareshade:
|
||||
5120 poly%(0)=26
|
||||
5130 poly%(5)=poly%(1)+4
|
||||
5140 poly%(6)=poly%(2)
|
||||
5150 poly%(7)=poly%(3)
|
||||
5160 poly%(8)=poly%(2)+7
|
||||
5170 poly%(9)=poly%(5)
|
||||
5180 poly%(1O)=poly%(4)
|
||||
5190 poly%(11)=poly%(1)
|
||||
5200 poly%(12)=poly%(8)
|
||||
5210 RETURN
|
||||
|
||||
5230 Endless:
|
||||
5240 WHILE 1<2: WEND
|
||||
5250 RETURN
|
Loading…
Reference in New Issue
Block a user