10 ' FastBrot Generator
20 ' By D.Catchpole 30 ' 61 West Common Lane 40 ' Scunthorpe 50 ' S.Humberside 60 runit% = 1 70 KEY 138,"gosub 2500"+CHR$(13) 80 KEY 139,"mode 2:ink 0,0:ink 1,24:paper 0:pen 1:mode 2:list"+CHR$(13) 90 ON BREAK GOSUB 2070 100 GOSUB 1460 110 END 120 MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2 130 INPUT "Left start :- ",left 140 INPUT "Bottem start :- ",bottem 150 INPUT "Zoom :- ",zoom 160 mab% = 1 170 RETURN 180 MODE 0 190 IF runit% = 1 THEN DIM pallet%(16) : runit% = 0 200 FOR loop% = 0 TO 15 : INK loop%,INT(loop%*1.5):pallet%(loop%) = INT(loop%*1.5):NEXT 210 CLS 220 RETURN 230 ' Four phase plot algorithm 240 ' plot first phase 250 IF blank% THEN GOSUB 2460 260 ry = bottem 270 FOR sy = 0 TO 400 STEP 4 280 rx = left 290 FOR sx = 0 TO 640 STEP 8 300 IF mab% THEN GOSUB 920 : ELSE GOSUB 1080 310 PLOT sx,sy,col% 320 IF cyc% = 0 THEN GOSUB 1010 330 rx = rx + (zoom * 4) 340 NEXT 350 ry = ry + (zoom * 2) 360 NEXT 370 ry = bottem + zoom 380 FOR sy = 2 TO 400 STEP 4 390 rx = left + zoom 400 FOR sx = 4 TO 640 STEP 8 410 IF NOT (TEST (sx - 4,sy -2) = TEST (sx + 4,sy -2)) GOTO 460 420 IF NOT (TEST (sx - 4,sy -2) = TEST (sx + 4,sy +2)) GOTO 460 430 IF NOT (TEST (sx - 4,sy -2) = TEST (sx - 4, sy +2)) GOTO 460 440 PLOT sx,sy,TEST(sx - 4,sy -2) 450 GOTO 480 460 IF mab% THEN GOSUB 920 : ELSE GOSUB 1080 470 PLOT sx,sy,col% 480 IF cyc% = 0 THEN GOSUB 1010 490 rx = rx + (zoom * 4) 500 NEXT 510 ry = ry + (zoom * 2) 520 NEXT 530 ry = bottem 540 FOR sy = 0 TO 400 STEP 4 550 rx = left + zoom 560 FOR sx = 4 TO 644 STEP 8 570 IF NOT (TEST (sx - 4,sy) = TEST (sx + 4 ,sy )) GOTO 620 580 IF NOT (TEST (sx - 4,sy) = TEST (sx,sy + 2)) GOTO 620 590 IF NOT (TEST (sx - 2,sy) = TEST (sx,sy - 2)) GOTO 620 600 PLOT sx,sy,TEST(sx - 4,sy) 610 GOTO 640 620 IF mab% THEN GOSUB 920 : ELSE GOSUB 1080 630 PLOT sx,sy,col% 640 IF cyc% = 0 THEN GOSUB 1010 650 rx = rx + (zoom * 4) 660 NEXT 670 ry = ry + (zoom * 2) 680 NEXT 690 ry = bottem + zoom 700 FOR sy = 2 TO 400 STEP 4 710 rx = left 720 FOR sx = 0 TO 640 STEP 8 730 IF NOT (TEST (sx,sy + 2) = TEST (sx,sy - 2)) GOTO 780 740 IF NOT (TEST (sx,sy + 2) = TEST (sx - 4,sy)) GOTO 780 750 IF NOT (TEST (sx,sy + 2) = TEST (sx + 4,sy)) GOTO 780 760 PLOT sx,sy,TEST (sx,sy + 2) 770 GOTO 800 780 IF mab% THEN GOSUB 920 : ELSE GOSUB 1080 790 PLOT sx,sy,col% 800 IF cyc% = 0 THEN GOSUB 1010 810 rx = rx + (zoom * 4) 820 NEXT 830 ry = ry + (zoom * 2) 840 NEXT 850 IF scl% = 1 THEN GOSUB 1970 860 k$ = "" : IF blank% THEN GOSUB 2490 870 WHILE k$ <> "C" : IF cyc% < 2 THEN GOSUB 1010 880 k$ = INKEY$ : k$ = UPPER$(k$) 890 WEND 900 fast% = 1 910 RETURN 920 ' Mandelbrot function 930 cx = rx : cy = ry : iter% = 0 940 WHILE (cx^2 + cy^2 < 1000) AND (iter% < 255) 950 x = cx*cx - cy*cy + rx 960 cy = 2 * cx * cy + ry 970 cx = x:iter% = iter% + 1 980 WEND 990 col% = iter% MOD 16 1000 RETURN 1010 ' Colour cycle 1020 pallet%(16) = pallet%(0) 1030 FOR loop% = 0 TO 15 1040 pallet%(loop%) = pallet%(loop%+1) 1050 INK loop%,pallet%(loop%) 1060 NEXT 1070 RETURN 1080 ' Julia Set iteration 1090 xold = rx : yold = ry : iter% = 0 1100 WHILE ( xold^2 + yold^2 < 1000) AND ( iter% < 255 ) 1110 x = xold * xold - yold * yold + p 1120 y = 2 * xold * yold + q 1130 xold = x : yold = y : iter% = iter% + 1 1140 WEND 1150 col% = iter% MOD 16 1160 RETURN 1170 ' Alternative method 1180 start = TIME 1190 ry = bottem 1200 FOR sy = 0 TO 400 STEP 2 1210 rx = left 1220 FOR sx = 0 TO 640 STEP 4 1230 IF mab% THEN GOSUB 920 : ELSE GOSUB 1080 1240 IF trans% THEN GOSUB 2580 : ELSE PLOT sx,sy,col% 1250 IF cyc% = 0 THEN GOSUB 1010 1260 rx = rx + zoom + zoom 1270 NEXT 1280 ry = ry + zoom 1290 NEXT 1300 IF scl% = 1 THEN GOSUB 1970 1310 k$ = "" 1320 WHILE k$ <> "C" :IF cyc% < 2 THEN GOSUB 1010 : 1330 k$ = INKEY$ : k$ = UPPER$(k$) 1340 WEND 1350 fast% = 0 1360 RETURN 1370 ' get Julia set coordinates 1380 MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2 1390 INPUT "Left :- ",left 1400 INPUT "Bottem :- ",bottem 1410 INPUT "Zoom :- ",zoom 1420 INPUT "P :- ",p 1430 INPUT "Q :- ",q 1440 mab% = 0 1450 RETURN 1460 ' Main menu 1470 GOSUB 2090 : getout% = 0 1480 WHILE getout% = 0 1490 MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2 1500 LOCATE 25,2 : PRINT CHR$(24)+" Mandlebrot System "+CHR$(24) 1510 LOCATE 5,5 : PRINT "1 ... Mandlebrot Set ( Fast )" 1520 LOCATE 5,7 : PRINT "2 ... Mandlebrot Set ( Accurate )" 1530 LOCATE 5,9 : PRINT "3 ... Julia Set ( Fast )" 1540 LOCATE 5,11: PRINT "4 ... Julia Set ( Accurate )" 1550 LOCATE 5,13: PRINT "5 ... Colour cycle ( On )" 1560 LOCATE 5,15: PRINT "6 ... Colour cycle ( After )" 1570 LOCATE 5,17: PRINT "7 ... Colour cycle ( Off )" 1580 LOCATE 5,19: PRINT "8 ... Scale lines ( On )" 1590 LOCATE 5,21: PRINT "9 ... Scale lines ( Off )" 1600 LOCATE 25,24: PRINT CHR$(24)+" Please enter your choice or Q to quit "+CHR$(24) 1610 LOCATE 45,5 : PRINT "B ... Blank Screen" 1620 LOCATE 45,7 : PRINT "Z ... Zoom in" 1630 LOCATE 45,9 : PRINT "S ... Summary Plot" 1640 LOCATE 45,11 : PRINT "T ... 3D transformation" 1650 LOCATE 50,15 : PRINT CHR$ (24)+"Blank ... "; 1660 IF blank% THEN PRINT "ON"; : ELSE PRINT "Off"; 1670 PRINT CHR$(24) 1680 LOCATE 50,17 : PRINT CHR$ (24)+"Colour Cycle ... "; 1690 IF cyc% = 0 THEN PRINT "ON"; 1700 IF cyc% = 1 THEN PRINT "AFTER"; 1710 IF cyc% = 2 THEN PRINT "OFF"; 1720 PRINT CHR$(24) 1730 LOCATE 50,19 : PRINT CHR$(24)+"Scale lines ... "; 1740 IF scl% THEN PRINT "ON"; : ELSE PRINT "OFF"; 1750 PRINT CHR$(24) 1760 LOCATE 50,21 : PRINT CHR$ (24)+"3D ... "; 1770 IF trans% THEN PRINT "ON"; : ELSE PRINT "OFF"; 1780 PRINT CHR$(24) 1790 k$ = "" : WHILE k$ = "" : k$ = INKEY$ : WEND 1800 IF k$ = "Q" OR k$ = "q" THEN getout% = 1 : k$ = "" 1810 IF k$ = "1" THEN GOSUB 120 :GOSUB 180:GOSUB 230:k$ = "" 1820 IF k$ = "2" THEN GOSUB 120 :GOSUB 180:GOSUB 1170:k$ = "" 1830 IF k$ = "3" THEN GOSUB 1370 : GOSUB 180 : GOSUB 230 :k$ = "" 1840 IF k$ = "4" THEN GOSUB 1370 : GOSUB 180 : GOSUB 1170:k$ = "" 1850 IF k$ = "5" THEN cyc% = 0 : k$ = "" 1860 IF k$ = "6" THEN cyc% = 1 : k$ = "" 1870 IF k$ = "7" THEN cyc% = 2 : k$ = "" 1880 IF k$ = "8" THEN scl% = 1 : k$ = "" 1890 IF k$ = "9" THEN scl% = 0 : k$ = "" 1900 IF k$ = "S" OR k$ = "s" THEN GOSUB 2130 : k$ = "" 1910 IF k$ = "Z" OR k$ = "z" THEN GOSUB 2340 : k$ = "" 1920 IF k$ = "B" OR k$ = "b" THEN GOSUB 2430 : k$ = "" 1930 IF k$ = "T" OR k$ = "t" THEN GOSUB 2650 : k$ = "" 1940 IF k$ <> "" THEN SOUND 1,40,20 1950 WEND 1960 RETURN 1970 ' Draw scale lines 1980 MOVE 0,200 : DRAW 640,200,8 1990 MOVE 320,0 : DRAW 320,400,8 2000 FOR y% = 0 TO 400 STEP 20 2010 MOVE 312,y% : DRAW 328,y%,7 2020 NEXT 2030 FOR x% = 0 TO 640 STEP 32 2040 MOVE x%,196 : DRAW x%,204,7 2050 NEXT 2060 RETURN 2070 ' break 2080 GOSUB 2490 : RUN 2090 ' set defaults 2100 mab% = 1 : cyc% = 0 : scl% = 1 : fast% = 1 : trans% = 1 2110 left = 1.8 : bottem = 0 : zoom = 0.00001 2120 RETURN 2130 ' Summary plot 2140 GOSUB 120 2150 GOSUB 180 2160 ystep = zoom * 8 : xstep = ystep + ystep 2170 ry = bottem 2180 FOR sy = 25 TO 1 STEP -1 2190 rx = left 2200 FOR sx = 1 TO 20 STEP 1 2210 GOSUB 920 2220 PEN col% : LOCATE sx,sy 2230 PRINT CHR$(143); 2240 GOSUB 1010 2250 rx = rx + xstep 2260 NEXT 2270 ry = ry + ystep 2280 NEXT 2290 k$ = "" 2300 WHILE k$ <> "C" : GOSUB 1010 2310 k$ = INKEY$ : k$ = UPPER$(k$) 2320 WEND 2330 RETURN 2340 ' Zoom in on previous image 2350 CLS 2360 INPUT " X marker :- ",xmark 2370 INPUT " Y marker :- ",ymark 2380 left = left + ((zoom+zoom) * ((xmark - 1) * 8)) 2390 bottem = bottem + (zoom * ((ymark-1) * 10)) 2400 zoom = zoom / 10 2410 GOSUB 180 2420 IF fast% THEN GOSUB 230 ELSE GOSUB 1170 2430 ' Switch blanking on/off 2440 IF blank% THEN blank% = 0 : ELSE blank% = 1 2450 RETURN 2460 ' Turn VDU output off 2470 OUT &BC00,6 : OUT &BD00,0 2480 RETURN 2490 ' Turn VDU output on 2500 FOR f = 0 TO 40 2510 FOR g = 0 TO 12 : NEXT 2520 OUT &BC00,1 : OUT &BD00,f 2530 OUT &BC00,2 : OUT &BD00,46-(20-INT(f/2)) 2540 OUT &BC00,6 : OUT &BD00,25-INT((40-f)/1.6) 2550 OUT &BC00,7 : CALL &BD19 : OUT &BD00,30-((40-f)/3.2) 2560 NEXT 2570 RETURN 2580 ' 3d transformation & plot 2590 nx = FIX(sx + 0.707107 * (400 - sy)) 2600 ny = FIX(( iter%/4 ) + 0.707107 * (400 - sy)) 2610 nb = FIX(1 + 0.707107 * (400 - sy)) 2620 MOVE nx,nb : DRAW nx,ny,col% 2630 IF iter% = 255 THEN PLOT nx,ny,4 2640 RETURN 2650 ' Toggle 3d on/off 2660 IF trans% THEN trans% = 0 : ELSE trans% = 1 2670 RETURN |