PCが描く奇妙な画像集(数学的万華鏡と生物形態等の世界)

・インタープリタBASICによるフラクタルとカオスの奇妙な画集。

277 ブッダブロもどき画像

2014-07-21 07:29:32 | ブッダブロー画像

ブッダブロ゛ー画像という画像がある。
ウィキペデイアによると、この画像は以下の画像のようである。

『ブッダブロ(英: 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






最新の画像もっと見る