座標系の横縦比が1の場合,絵定義GRIDは次のコードで実現できます。
200行以降がGRIDの定義部です。絵定義GRIDを使うプログラム単位には,110行に示すような外部絵定義宣言を書きます。
Full BASICではTEXT HEIGHTの初期値は0.01なので,たいていの場合,この値は小さすぎます。そのため,290行のように縦座標の範囲に比例して大きくなるように指定する必要があります。
110 DECLARE EXTERNAL PICTURE grid
120 DEF f(x)=ABS(x)
130 SET WINDOW -4,4,-4,4
140 DRAW grid
150 FOR x=-4 TO 4 STEP 0.01
160 PLOT LINES: x,f(x);
170 NEXT x
180 END
190 !
200 EXTERNAL PICTURE GRID
210 ASK WINDOW L,R,B,T
220 ASK LINE STYLE S
230 SET LINE STYLE 3
240 ASK LINE COLOR C
250 SET LINE COLOR 15
260 ASK TEXT COLOR tc
270 ASK TEXT HEIGHT th
280 SET TEXT COLOR 15
290 SET TEXT HEIGHT (T-B)*0.02
300 FOR X=CEIL(L) TO INT(R)
310 PLOT LINES:X,B;X,T
320 PLOT TEXT, AT x,0:str$(x)
330 NEXT X
340 FOR Y=CEIL(B) TO INT(T)
350 PLOT LINES:L,Y;R,Y
360 PLOT TEXT, AT 0,y:str$(y)
370 NEXT Y
380 SET LINE STYLE 1
390 PLOT LINES:L,0;R,0
400 PLOT LINES:0,B;0,T
410 SET LINE COLOR C
420 SET LINE STYLE S
430 SET TEXT COLOR tc
440 SET TEXT HEIGHT th
450 END PICTURE
Full BASICには,指定した画素の色指標を調べる命令 ASK PIXEL VALUEがあるので,draw mode mask と同等の結果を得ることは不可能ではない。
1020~1090行のように色指標を定めておくと,減色混合するための色指標を2進数のOR演算で求めることができる(が,Full BASICには2進数のOR演算の機能がないので,面倒(1230~1232行))。
なお,次プログラムのように注釈に日本語を書くと規格合致ではない。
MAC上の十進BASIC 0.6.3.2はDRAW MODE MASKが機能しないが,この手法はMAC上の十進BASICにも適用できる。
(bitORは使えるので1220行の注釈を解除して1230~1232行を削除する。ただし,それでも遅い。)
100 REM ローレンツ・アトラクタ
110 REM 左赤,右シアンのフィルターを通して立体視する。
115 OPTION ARITHMETIC NATIVE
120 DECLARE EXTERNAL SUB init_Colors, SET_POINT_COLOR, PLOT_POINT
130 CALL init_Colors
140 CLEAR
150 SET WINDOW -60,60,-60,60
160 SET POINT STYLE 1
170 LET s=11
180 LET b=8/4
190 LET r=88
200 LET x=-10
210 LET y=-10
220 LET z=-30
230 LET dt=0.00001
240 FOR t=0 TO 10 STEP dt
250 LET xx=x+(-s*x+s*y)*dt
260 LET yy=y+(r*x-y-x*z)*dt
270 LET zz=z+(-b*z+x*y)*dt
280 LET x=xx
290 LET y=yy
300 LET z=zz
310 CALL SET_POINT_COLOR("cyan") ! 左目
320 call PLOT_POINT(x+0.02*z ,y)
330 call SET_POINT_COLOR("red") ! 右目
340 CALL PLOT_POINT(x-0.02*z ,y)
350 NEXT t
360 END
1000 !
1010 EXTERNAL SUB init_Colors
1015 OPTION ARITHMETIC NATIVE
1020 DATA 1 , 1 , 1 ! 0 White
1030 DATA 0 , 1 , 1 ! 1 Cyan
1040 DATA 1 , 0 , 1 ! 2 Magenta
1050 DATA 0 , 0 , 1 ! 3 Blue
1060 DATA 1 , 1 , 0 ! 4 Yellow
1070 DATA 0 , 1 , 0 ! 5 Green
1080 DATA 1 , 0 , 0 ! 6 Red
1090 DATA 0 , 0 , 0 ! 7 Black
1100 DECLARE NUMERIC i,r,g,b
1110 FOR i=0 TO 7
1120 READ r,g,b
1130 SET COLOR MIX(i) r,g,b
1140 NEXT i
1150 END sub
1155 !
1160 EXTERNAL SUB PLOT_POINT(x,y)
1165 OPTION ARITHMETIC NATIVE
1170 DECLARE NUMERIC a,b,c
1180 SET POINT STYLE 1
1190 ASK POINT COLOR b
1200 ASK pixel VALUE (x,y) c
1210 IF c>=0 THEN
1220 ! LET a=bitOR(b,c)
1230 LET a=MAX(MOD(b,2),MOD(c,2))
1231 LET a=a+MAX(MOD(INT(b/2),2), MOD(INT(c/2),2))*2
1232 LET a=a+MAX(MOD(INT(b/4),2), MOD(INT(c/4),2))*4
1240 SET POINT COLOR a
1250 PLOT POINTS: x,y
1260 END IF
1270 SET POINT COLOR b
1280 END SUB
1285 !
1290 EXTERNAL SUB SET_POINT_COLOR(s$)
1295 OPTION ARITHMETIC NATIVE
1300 DECLARE EXTERNAL FUNCTION COLOR_INDEX_OF
1310 SET POINT COLOR COLOR_INDEX_OF(s$)
1320 END SUB
1480 !
1490 EXTERNAL FUNCTION COLOR_INDEX_OF(s$)
1495 OPTION ARITHMETIC NATIVE
1500 DECLARE NUMERIC k
1510 LET s$=UCASE$(s$)
1520 SELECT CASE s$
1530 CASE "WHITE"
1540 LET k=0
1550 CASE "BLACK"
1560 LET k=7
1570 CASE "BLUE"
1580 LET k=3
1590 CASE "GREEN"
1600 LET k=5
1610 CASE "RED"
1620 LET k=6
1630 CASE "CYAN"
1640 LET k=1
1650 CASE "MAGENTA"
1660 LET k=2
1670 CASE "YELLOW"
1680 LET k=4
1690 CASE "GRAY"
1700 LET k=8
1710 CASE "SILVER"
1720 LET k=15
1730 CASE ELSE
1740 CAUSE EXCEPTION 11085
1750 END SELECT
1760 LET COLOR_INDEX_OF=k
1770 END FUNCTION