下図はZ^2マンデルブロ集合画像の近似境界(赤線)と、記事294の最後のブッダブロ集合画像を重ね合わせた画像である。それらの画像の位置関係が分かる。
(注:『記事294の最後のブッダブロ集合画像』は、Z^2マンデルブロ集合内の全ての点を始点とした場合のlog画像である。詳細は記事294を参照。)

ブッダブロ画像は点(CX,CY)を新たに選ぶ場合、乱数を使用していたが、乱数は使わず、画像表示画面の全てを順次選ぶ場合の画像を調べてみる。
****
表示ガウス画面の座標(X,iY)を|X|<=2,|Y|<=2とする。
X,Yをパラメータ K,Jで表し、X=Xs+dX*K,Y=Ys=dY*J とし、dX=dY=4/480,K=0~480 step1,J=0~480 step 1とする。
画像作成での始点:Z(X,Y)をZ(K,J)として、K=0→480,J=0→480 全てについて順次与えて画像を作成していく。画像作成手順は、始点Zの与え方以外は全て同じである。但し、巡回ループの最大値は500としている。
****
また、同一点の重なりの回数(以下、濃度:mと表現する)は色で表現する。
(BASIC/98では、mを同一色のグラディエーションでは表現できず、最大16色の色でしか表せない。)
下図は、ブッダブロ画像において、J=480/2の場合のK=0→480でのmの分布を調べたグラフである。m の最大値は13となっている。
下図は、この方法で求めたブッダブロの生(なま)の画像である。但し、周囲の部分は省略し肝心の部分のみ示した。
C=m MOD 16 としているが、m の最大値は13だから、C=mとしてみてよい。
この図から分かるように、ブッダブロ画像のmの分布は混在しており、明確な規則性はない(これは、色が混在しており不鮮明であることから分かる)。
(訂正:下図の画像の縦軸は、-1cm~1cm,横軸は、-1.5cm~0.5cmである)
上の画像は生(なま)データを直接表示したものであるが、画像の色(即ち m )を整理する方法として、log(m)化がある。以下の画像は、log(m)にして、不要な m を未表示にした画像である。画像表示の具体的な方法は各画像に書いてある。
これらの画像は、いわゆるブッダブロ画像と似ている。尚、下図の画像は、色のみ変えており画像の形態は同じである。
-------------------------------------------------------
参考のために上の画像のBASIC/98プログラムを下記しておく。
画像作成プログラム(BASIC/98)
10 REM ブッダブローFILE NAME→ KL
20 REM CX,CY→K,L
60 CHAIN MERGE "C:\BASIC1\PRO\SUBR\KOSHIKI.BAS",90,ALL
90 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ER2.BAS",100,ALL
100 ON ERROR GOTO 50000
110 CONSOLE ,,0,1
120 COLOR 0,7,,,2
130 CLS 3
140 GOSUB 10000
180 CXS=-2 :CXE=2 :DX=(CXE-CXS)/480
190 CYS=-2 :CYE=2 :DY=(CYE-CYS)/480
200 DIM Z(480,480):DIM SX(10000):DIM SY(10000)
202 FOR J=0 TO 480
204 FOR K=0 TO 480
206 Z(K,J)=0
208 NEXT K
210 NEXT J
220 K=0:J=0:N=1:L=0
228 '
232 REM Jの値
240 LOCATE 0,0:PRINT J
250 CY=CYS+DY*J
260 REM Kの値
262 LOCATE 0,1:PRINT K
264 CX=CXS+DX*K
270 X=0:Y=0
288 REM
290 XX=FNR2(X,Y)+CX
300 Y=FNI2(X,Y)+CY
310 X=XX
320 Q=X^2+Y^2
324 IF Q>4 THEN 1000
330 SX(L)=X :SY(L)=Y
334 L=L+1
340 IF N=500 THEN 341 ELSE N=N+1:GOTO 288
341 N=0
350 REM J,Kの値の判定
360 IF K=480 THEN 400 ELSE 370
370 K=K+1
380 L=0: GOTO 260
400 IF J=480 THEN 1500 ELSE 410
410 K=0:J=J+1
420 L=0: GOTO 232
1000 REM X→SX(L),Y→SY(L)の読み込み
1420 FOR LL=0 TO L
1422 X=SX(LL):Y=SY(LL)
1444 KK1=(X+2)/DX : JJ1=(Y+2)/DY
1446 K1=INT(KK1) : J1=INT(JJ1)
1448 IF K1 1449 IF K1>480 OR J1>480 THEN 1460
1450 Z(K1,J1)=Z(K1,J1)+1
1454 C=N MOD 16
1457 PSET (K1,J1),C
1460 NEXT LL
1462 L=0:N=0
1464 GOTO 350
1500 REM ZZ=Z(K1,J1) の書き込み
1502 OPEN "C:\BASIC1\TEST\DATAb.DAT" FOR OUTPUT AS #1
1504 FOR JJJ=0 TO 480
1506 FOR KKK=0 TO 480
1508 WRITE #1,JJJ,KKK,Z(KKK,JJJ)
1510 NEXT KKK
1512 NEXT JJJ
1514 CLOSE #1
1600 END
-----------------------------------
log(m)画像の表示プログラム(BASIC/98)
10 REM ブッダブロ表示(K,J,Zmax)デタの表示
12 REM Zmax値による色の区別はサブルーチン(1000行)で決める
30 CONSOLE ,,0,1
40 COLOR 0,7,,,2
50 CLS 3
51 CHAIN MERGE "C:\BASIC1\PRO\SUBR\COLOR左下表示.BAS",55,ALL
55 OPEN "C:\BASIC1\TEST\DATAb.DAT" FOR INPUT AS #1
60 INPUT #1,K,J,Z
62 LOCATE 0,0:PRINT USING "###";J
64 LOCATE 0,1:PRINT USING "###";K
70 IF EOF(1) THEN 120
72 '
74 '
80 REM Zによる色の区別:サブルーチン
90 GOSUB 500
100 PSET (K,J),C
110 GOTO 60
120 CLOSE #1
130 GOTO 600
500 REM Zによる色の区別
510 IF Z 520 CCC=LOG(Z)
522 IF CCC>2 AND CCC 524 C=CCC:GOTO 540
526 CC=LOG(Z)
528 IF CC>=2.5 THEN C=CC+5 ELSE C=7
540 RETURN
600 GOSUB 3000
610 END
ブッダブロ゛ー画像という画像がある。
ウィキペデイアによると、この画像は以下の画像のようである。
『ブッダブロ(英: buddhabrot)とはマンデルブロ集合に関する図形。ガウス平面から点cをランダムに選び、そのcについて数列z{n+1} = {zn}^2 + cを計算し、|z{n+1}|>2となった場合にz1からznまでの位置に点を描くという作業を、指定した回数だけ反復(iteration)して行ったもの。形がブッダに似ていることから名付けられた。色毎に計算回数を変えてカラー化することもある。』
http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%83%E3%83%80%E3%83%96%E3%83%AD
画像作成手順も以下のように書かれている。
『基本の計算にはマンデルブロ数列を用いる。まずガウス平面の内の実数部、虚数部それぞれ-2~2の範囲を描画面に見立て、描画点の細かさを決めておく。
次に描画面から点をランダムに選び、をから順に計算し、、|z{n+1}|>2になった時点で(発散が明らかになった時点で)、描画面のからの位置に点を描く。すでに点が描いてあった場合には、より明るくする。(ただしの上限を決めておき、それ以上になったら収束したと見なして点は描かない。)次にまた新たなをランダムに決め、先の計算を反復する』
そこで私はBASIC/98で、この画像を求めてみることにした。
問題は、BASIC/98では、『すでに点が描いてあった場合には、より明るくする』便利な方法がないことだ (いや、あるかも知れないが残念ながら私は知らない。)
BASIC/98で決められた16色の色で表現するにはどうしたらよいか、が最大の問題である。
複素平面の一点が加算されるに従い、白色の色調を連続的に濃淡が可能ならば、この画像の作成自体は容易に思われる。
その点は棚明けして、とりあえず、16色でトライしてみることにした。
トライした計算手順は以下のとおりである。
****
プログラム A
1.ガウス平面からランダム点(CX,CY)を選ぶ。
2.マンデルブロ画像作成での巡回ループ(N-loop)で、X,Yの初期値を0として、Z(=X+iY)←Z(X+iY)+CX+iCY を巡回計算し、その都度点(X,Y)をDATAaにシークエンシャル保存する。X^2+Y^2>4になった時点でN-loopを脱出して、DATAaを読み出しDATAbに保存する。その場合、点(x,y)が読みだされたとき、Z(x,y)=Z(x,y)+1として、点(x,y)が読みだされた回数をZ(x,y)も保存していく。
3.M=M+1として、ランダム点(CX,CYの選択回数を記録し、1.の手順にもどり同じ計算をM=Mmaxになるまで繰り返す。N-loopを貫通した場合はMにカウントしない。
*****
プログラム B
DATAbのシークエンシャル・ファイル(x,y,Z(x,y))の順に保存されてい)る)を読 みだして、Z(x,y)の最大値を求め、そのZ(x,y)max=ZZを(x,y,ZZ)として、DATAcにシークエンシャル保存する。
****
プログラム C
DATAcを読み出し、pset(x,y),ZZ として表示する。その場合、ZZに適当な規則を与えて色で表現化する。
****
以上が私が作成したプログラム手順であるが、ここで、x,yは、それぞれ整数K,Jをパラメータとして表現する。今回の画像の場合、J=0~480,K=0~480としている。
以下の図は、M=100000、N=500 の場合の画像である。
この図の右側に、Z(x,y)maxの適当に区分けして、その中にある点(x,y)の数を→で示している。 このZ(x,y)maxの区分けは特別な意味はなく、とりあえず、この表のように区分けた。 この区分けの中に入る点(x,y)は同じ色で表現される。その点(x,y)の数が多い順に、その点の色は単純に16色コード順にした。 このZ(x,y)maxの区分けによる色の単純化が画像の情報の損失となり画像が単純化されている。 この点、Z(x,y)maxを黒白の濃淡として表現されている。 ウィキペディア掲載の画像に比べ粗雑であるが、なんとなく全体像は似ている。
下図は、DATAcに保存された全てのデータにおいて、点(x,y)の色:Cを、C=int(log((Z(x,y)max))とした画像である。ここで、Z(x,y)max=0の場合は、色は白としていて画像には表示されない。 また、C=7(白)の場合は C=15 としたが、特別な理由はない。
このlog画像は全データを使用しているという意味では連続的であるが、log化による色の単純化が行われており、その点、画像が粗雑となっている。
以上が私の『ブッダブロ画像』であるが、上記したように、かなり粗雑化が行われており、『ブッダブロもどき画像』と言ったほうがよい。しかし、これはこれで結構楽しい画像ではある。また以上の画像で横軸はyで縦軸はxである。
---------------------------------------
下図は上記プログラム A で、M=100,Nmax=500とした場合の、N-loop脱出前の点:(x,y)の表で、色:C は、N-loop脱出時のNをNoとしたとき、C=No MOD 16としている。
この図を見ていると、N-loop脱出前の点:(x,y)の軌跡が色として推定できて面白い。
渦状になったり、花火風に散っていったり、様々な形状をしていくのが見えて楽しい。
下図は、M=100000、Nmax=500の場合の上図である。
こうなると複雑で何が何だか分からないが、なんとなく、ブッダブロ画像が潜んでいる
感じはする。但し、この図の横軸はx、縦軸はyである。
------------------------------------------------------------
以下参考に、私が作成したBASIC/98のプログラムを下記しておく。
これらのプログラムには直接関係のないコマンドも含まれているが面倒だから、そのままにしてある。このプログラムで少し気になっているのはプログラムAでの、RNDの使い方である。
*******************
プログラ A
----------------------------------
10 REM ブッダブロー
20 REM CX,CY→RND
60 CHAIN MERGE "C:\BASIC1\PRO\SUBR\KOSHIKI.BAS",90,ALL
90 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ER2.BAS",100,ALL
100 ON ERROR GOTO 50000
110 CONSOLE ,,0,1
120 COLOR 0,7,,,2
130 CLS 3
140 GOSUB 10000
180 CXS=-2 :CXE=2 :DX=(CXE-CXS)/480
190 CYS=-2 :CYE=2 :DY=(CYE-CYS)/480
200 M=1 :DIM Z(480,480)
202 FOR J=0 TO 480
204 FOR K=0 TO 480
206 Z(K,J)=0
208 NEXT K
210 NEXT J
228 OPEN "C:\BASIC1\TEST\DATAb.DAT" FOR OUTPUT AS #3
230 OPEN "C:\BASIC1\TEST\DATAa.DAT" FOR OUTPUT AS #1
248 REM CX,CY given
250 CX1=RND :CX2=RND:CX=(CX1-CX2)*2
260 CY1=RND :CY2=RND:CY=(CY1-CY2)*2
264 IF M=100000 THEN END
266 LOCATE 0,0:PRINT M
270 X=0:Y=0
288 FOR N=1 TO 500
290 XX=FNR2(X,Y)+CX
300 Y=FNI2(X,Y)+CY
310 X=XX
320 Q=X^2+Y^2
324 IF Q>4 THEN 400
325 '
330 WRITE #1,X,Y,C
340 NEXT N
350 GOTO 248
400 CLOSE #1
410 OPEN "C:\BASIC1\TEST\DATAa.DAT" FOR INPUT AS #2
411 IF N=1 THEN 470
420 INPUT #2,X,Y,C
440 IF EOF(2) THEN 470
442 C=N MOD 16
444 KK=(X+2)/DX : JJ=(Y+2)/DY
446 K=INT(KK) : J=INT(JJ)
450 Z(K,J)=Z(K,J)+1
452 ZZ=Z(K,J)
457 PSET (K,J),C
458 WRITE #3,K,J,ZZ
460 GOTO 420
470 CLOSE #2
580 KILL "C:\BASIC1\TEST\DATAa.DAT"
590 M=M+1:GOTO 230
*****************
プログラム B
--------------------------------------------
10 REM DATAbの(K,J,Z)デタを(K,J,Zmax)に並び変えて、それを
20 REM DATAcとして保存する。
30 CONSOLE ,,0,1
40 COLOR 0,7,,,2
50 CLS 3
60 DIM Z(480,480)
70 FOR J=0 TO 480
80 FOR K=0 TO 480
90 Z(K,J)=0
100 NEXT K
110 NEXT J
120 OPEN "C:\BASIC1\TEST\DATAb.DAT" FOR INPUT AS #1
130 INPUT #1,K,J,Z
140 IF EOF(1) THEN 180
150 IF Z>Z(K,J) THEN Z(K,J)=Z
160 N=N+1:LOCATE 0,0:PRINT N
170 GOTO 130
180 CLOSE #1
190 REM 変換されたデタの保管→DATAc
200 OPEN "C:\BASIC1\TEST\DATAc.DAT" FOR OUTPUT AS #2
210 FOR J=0 TO 480
220 LOCATE 0,2:PRINT J
230 FOR K=0 TO 480
240 ZZ=Z(K,J)
250 WRITE #2,K,J,ZZ
260 NEXT K
270 NEXT J
280 CLOSE #2
290 END
********************
プログラム C
--------------------------------
10 REM ブッダブロ表示(K,J,Zmax)デタの表示
12 REM Zmax値による色の区別はサブルーチン(1000行)で決める
30 CONSOLE ,,0,1
40 COLOR 0,7,,,2
50 CLS 3
51 '
55 OPEN "C:\BASIC1\TEST\DATAc.DAT" FOR INPUT AS #1
60 INPUT #1,K,J,Z
62 LOCATE 0,0:PRINT USING "###";J
64 LOCATE 0,1:PRINT USING "###";K
70 IF EOF(1) THEN 120
72 '
74 '
80 REM Zによる色の区別:サブルーチン
90 GOSUB 1000
100 PSET (J,K),C
110 GOTO 60
120 CLOSE #1
130 GOTO 3000
1000 REM Zによる色の区別
1010 IF Z 1020 IF Z>51 AND Z 1030 IF Z>101 AND Z 1040 IF Z>201 AND Z 1050 IF Z>301 AND Z 1060 IF Z>401 AND Z 1070 IF Z>501 AND Z 1080 IF Z>601 AND Z 1090 IF Z>701 AND Z 1100 IF Z>801 AND Z 1120 IF Z>901 AND Z 1130 IF Z>1001 AND Z 1140 IF Z>2001 AND Z 1150 IF Z>3001 AND Z 1160 IF Z>4001 AND Z 1170 IF Z>5001 AND Z 1180 IF Z>6001 THEN C=15
2000 RETURN
3000 REM 5本ずつ同色にして、色の判定 file name COMMOM\色3
3050 C=0:D=0:DD=375
3060 FOR K=0 TO 14
3070 LINE (K+D+DD,400)-(K+D+DD,410),C
3080 NEXT K
3090 D=D+16
3100 C=C+1
3110 IF C=16 THEN 3140 ELSE 3060
3140 LOCATE 47,23:PRINT " 0"
3142 LOCATE 49,23:PRINT " 1"
3143 LOCATE 51,23:PRINT " 2"
3145 LOCATE 53,23:PRINT " 3"
3146 LOCATE 55,23:PRINT " 4"
3147 LOCATE 57,23:PRINT " 5"
3148 LOCATE 59,23:PRINT " 6"
3149 LOCATE 61,23:PRINT " 7"
3150 LOCATE 63,23:PRINT " 8"
3151 LOCATE 65,23:PRINT " 9"
3152 LOCATE 67,23:PRINT "10"
3153 LOCATE 69,23:PRINT "11"
3154 LOCATE 71,23:PRINT "12"
3155 LOCATE 73,23:PRINT "13"
3156 LOCATE 75,23:PRINT "14"
3157 LOCATE 77,23:PRINT "15"
3167 LOCATE 0,24
3200 END