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

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

286『ブッダブロ画像』『貫通画像』『ループ内画像』について

2014-07-21 15:47:53 | Z^2マンデルブロー集合
Z^2マンデルブロ画像における計算過程の点Z(X,Y)の推移は三つの場合がある。

(1)巡回ループを脱出する。・・・『ブッダブロ画像』となる。(以下で説明する)
(2)巡回ループを貫通する。・・・『貫通画像』となる。(以下で説明する)
(3)巡回ループに留まる。・・・・・『ループ内画像』となる。(以下で説明する)

***
ブッダブロ画像は(1)の場合の、始点Zoから脱出するまでの点Znの集合画像であった。
これを(2)及び(3)に適用して、(2)の場合は、巡回ループを貫通する場合で、その場合の、始点Zoから貫通するまでの点Znの集合画像も考えられる。
この画像を便宜上『貫通画像』と名付ける。
***
(3)の場合も同様に考えられる。巡回ループの最大巡回数をNmaxとしたとき、その回数になっても巡回ループを脱出もせず、また貫通もしない場合である。
この場合の始点Zoから、Nmaxまでの点Znの集合画像も存在し、その画像を便宜上『ループ内画像』と名付けることにする。
***
今、実軸:-2.5<X<0.5 虚軸:|Y|<1.1の複素平面座標を考え、これらの全て点についてマンデルブロ集合画像の計算過程を行う。この座標の点が始点Zoに相当するが計算過程は上記三つのいずれかの経過をたどる。その、いずれかの点列の集合画像を形成する。
***
巡回ループを脱出する条件は、計算過程での点Zが半径2の円を超えたときとする。
またNmax=500とする。
***
ここで、N-loopを脱出しない場合の点列の集合画像を『非脱出画像』と名付ければ、『ループ内画像』の点集合は、『非脱出画像』の点集合から、『ブッダブロ画像』と『貫通画像』の点集合を差し引けばよい。「差し引く」という意味は、同一座標点の回数(濃度:m)を差し引くという意味である。
***
以下に『非脱出画像』、『ブッダブロ画像』、『貫通画像』、『ループ内画像』を示す。
点集合を{}で表せば、

{『ループ内画像』}={『非脱出画像』}-{『ブッダブロ画像』}-{『貫通画像』}

なお、この減算において、m<0となる場合は、m=0としている。








--------------------------------------------------------
{『ループ内画像』}と{『非脱出画像』}との画像の主要部分のLOG(m)分布は、ほとんど変わっていない。子細に比べれば、画像の周囲部分が若干変わっている。
これは、{『非脱出画像』}のmの分布は、LOG(m)レベルでは、{『ブッダブロ画像』}+{『貫通画像』}は問題になるほど大きくはないということだろう。

--------------------------------------------------------

下図は『ループ内画像』とマンデルブロ集合画像の周辺部との重ね描きである。
両者の座標は一致させている。『ループ内画像』の点列は、マンデルブロ集合の座標より一回り大きいことがわかる。



-------------------------------------------------------
下図は『ループ内画像』のLOG(m)の分布グラフである。このグラフからもLOG(m)が最高となるのは、『ループ内画像』の中央右あたりの円部内で約LOG(m)=7.5~8だと分かる。即ち、m=e^7.5~e^8=1808~2980程度である。


6

285 巡回ループを脱出時点での点(X,Y)の画像

2014-07-21 15:29:04 | Z^2マンデルブロー集合
始点Zoから出発して、その点は巡回ループを巡回し、Z1,Z2,Z3・・・と変化していく。
そして、|Zn|>2となった時点で、点Znは巡回ループから脱出する。
***
今回の画像は、Zn 自身の画像である。始点の範囲は、実軸:-2.5<X<0.5,虚軸:|Y|<1.1だが始点Z0が、この範囲全てについて行われるとき、Znは対応した集合となり画像を形成する。 この{点Zn}はどのような画像になるのだろうか? 













上図の下二枚の画像が何を意味しているか、つかみかねているが、ともかくも、この、{点Zn}画像は不規則性と規則性が混在しているのは確かなようだ。

283 Z^2マンデルブロ画像作成において、巡回ループを貫通する全ての点の集合についての検討

2014-07-21 14:53:19 | Z^2マンデルブロー集合
今回の画像は、巡回最大回数:Nmaxまでに巡回ループを脱出できず、巡回ループを貫通してしまう場合、貫通した時点での全ての点Z(X,iY)の集合の濃度画像を調べる。(これらの点Zは、前記事の画像に含まれる。)

下図がその画像である。点Zの濃度:mは、前記事同様に色で表現しているが、m=CCとしてみてよい。m=0の場合は表示していない。Nmax=50である。



下図は上図にマンデルブロ集合の周辺部分(黒い線)を重ね描きしたものである。


282 Z^2マンデルブロ画像での発散しない点の集合についての検討

2014-07-21 14:27:10 | Z^2マンデルブロー集合

下図の緑色の集合がZ^2マンデルブロ集合である。



下図は、発散しない点C全てにおける、巡回計算過程での点Z(X,iY)の集合濃度画像である。ここで点Zが同一座標になる場合の回数(濃度)をmとし、BASIC/98での色コードをCCとすると、CC=LOG(m)で表現した。(参考:画像データは下に書いたプログラム1のDATA2に相当する。)

下図の下に、CCの色コードを示してあるから、点(X,iY)が同一座標となる濃度の形態が分かる。例えば、色が緑(CC=5)の場合、その点での濃度は、e^5=148となる。また下図においてマダラに見える黒部分はCC=0故、LOG(m)=0となり、m=1 となる。

但し、m=0 の場合は非表示(空白)とした(参考:下のフログラム3の行511)。
下図の左部分の空白は点(X,iY)が存在しない部分であるが、画像中の白スジ線の存在理由は不明である。



下図は上図に、マンデルブロ集合の境界線(白い線で示した)を重ね描きした画像である。
点(X,iY)の集合は、マンデルブロ集合より、一回り大きく、ぼやけてはいるが外形は似ているのが面白い。マンデルブロ集合の中央部と、左側の「こぶ」あたりに、点(X,iY)の濃度も大きくなっていることが色で分かる。



---------------------------------------------------------------
以下、画像作成のBASIC/98フログラムを示す。基本的に三つのプログラムから構成されている。

・プログラム1→発散しない点C全てにおける、巡回計算過程での点(X,Y)及び当該(K,J)をfile:DATA2に保存する。

10 REM マンデルブロー N-loopの内外保存
12 REM N-loopを脱出したデータ→DATA1
14 REM N-loopを脱出しない全データ→DATA2
16 REM N-LOOPを貫通したデータ→DATA3
20 REM 横軸(K):640 dots、縦軸(J):480 dots
30 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ARCTAN3.BAS",40,ALL
40 CHAIN MERGE "C:\BASIC1\PRO\SUBR\TAN.BAS",50,ALL
50 '
60 CHAIN MERGE "C:\BASIC1\PRO\SUBR\KOSHIKI.BAS",70,ALL
70 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ZFZ.BAS",80,ALL
80 CHAIN MERGE "C:\BASIC1\PRO\SUBR\FGZ.BAS",90,ALL
90 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ER1.BAS",100,ALL
100 ON ERROR GOTO 50000
110 CONSOLE ,,0,1
120 COLOR 0,7,,,2
130 CLS 3
140 GOSUB 10000
150 OPEN "C:\BASIC1\RUN\DATA1.DAT" FOR OUTPUT AS #1
152 OPEN "C:\BASIC1\RUN\DATA2.DAT" FOR OUTPUT AS #2
154 OPEN "C:\BASIC1\RUN\DATA3.DAT" FOR OUTPUT AS #3
160 OPEN "C:\BASIC1\RUN\親DATA.DAT" FOR OUTPUT AS #4
170 REM 親DATAの設定(随時変更)
180 CXS=-2.5 :CXE=0.5
190 DX=(CXE-CXS)/640 :DY=DX:CYS=-240*DY
200 WRITE #4,CXS,CXE,CYS,CYE,DX,DY
210 CLOSE #4
220 FOR J=0 TO 480
230 LOCATE 0,0:PRINT J
240 FOR K=0 TO 640
260 CX=CXS+DX*K
270 CY=CYS+DY*J
272 X=0:Y=0
280 FOR N=0 TO 500
290 XX=FNR2(X,Y)+CX
300 Y=FNI2(X,Y)+CY
310 X=XX
320 Q=X^2+Y^2
330 IF Q>4 THEN 380
336 WRITE #2,X,Y,K,J,N
340 NEXT N
342 WRITE #3,X,Y,K,J,N
360 GOTO 420
380 WRITE #1,X,Y,K,J,N
420 NEXT K
430 NEXT J
440 END


・フログラム2→ DATA2の(X,Y)の表示座標系(K,J)への変換し(行170)、同一座標値の濃度を求める(行150~240)。その場合、行200より濃度は+1余計加算されている。また表示座標系(K,J)での各点(X,Y)の最大濃度を求め(行250-300)、file:DAT2Aに保存する(行280)。

10 REM DATA2のX,YのKK,JJ化と、点(KK,JJ)の濃度をZ(KK,JJ)に
12 REM 保存していき、(KK,JJ,Z(KK,JJ))のデータ:DATA2Aを求める。
14 CHAIN MERGE "C:\BASIC1\PRO\SUBR\ER2.BAS",16,ALL
16 ON ERROR GOTO 50000
20 OPEN "C:\BASIC1\TEST\DATA2A.DAT" FOR OUTPUT AS #2
30 OPEN "C:\BASIC1\TEST\DATA2.DAT" FOR INPUT AS #1
40 CONSOLE ,,0,1
50 COLOR 0,7,,,2
60 CLS 3
70 CXS=-2.5:CXE=0.5:DX=(CXE-CXS)/640:DY=DX
80 CYS=-240*DY:CYE=-CYS:M=0
90 DIM Z(640,480)
100 FOR I=0 TO 480
110 FOR II=0 TO 640
120 Z(KK,JJ)=0
130 NEXT II
140 NEXT I
150 INPUT #1,X,Y,K,J,N
160 IF EOF(1) THEN 242
170 KKK=(X-CXS)/DX: JJJ=(Y-CYS)/DY
180 KK=INT(KKK):JJ=INT(JJJ)
190 IF KK>640 OR JJ>480 THEN 240

191 IF KK<0 OR JJ<0 THEN 240

200 Z(KK,JJ)=Z(KK,JJ)+1
202 C=Z(KK,JJ) MOD 16:PSET(KK,JJ),C
212 M=M+1:LOCATE 0,0:PRINT M
240 GOTO 150
242 CLS 3
250 REM KK,JJ,Z(KK,JJ)の保存→DATA*A
260 FOR JJJ=0 TO 480
270 FOR KKK=0 TO 640
271 IF Z(KKK,JJJ)=0 THEN 290
280 WRITE #2,KKK,JJJ,Z(KKK,JJJ)
282 CC=Z(KKK,JJJ) MOD 16:PSET (KKK,JJJ),CC
290 NEXT KKK
300 NEXT JJJ
410 END

・フログラム3 →DATA2A(濃度データ)の表示。

10 REM 画像表示
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\RUN\DATA2A.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
80 REM Zによる色の区別:サブルーチン
90 GOSUB 500
100 PSET (K,J),C
110 GOTO 60
120 CLOSE #1
130 GOTO 600
500 REM Zによる色の区別:最初からZは1加算されているから補正をする
510 Z=Z-1
511 IF Z=0 THEN 550
520 C=LOG(Z)
550 RETURN
600 GOSUB 3000
610 END


・フログラム4 →画像表示及びマンデルブロ集合の境界線の表示

10 REM 画像表示及びマンデルブロ集合の境界線の表示
30 CONSOLE ,,0,1
40 COLOR 0,7,,,2
50 CLS 3
51 CHAIN MERGE "C:\BASIC1\PRO\SUBR\COLOR左下表示.BAS",52,ALL
55 OPEN "C:\BASIC1\RUN\DATA2A.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
80 REM Zによる色の区別:サブルーチン
90 GOSUB 500
100 PSET (K,J),C
110 GOTO 60
120 CLOSE #1
130 GOTO 600
500 REM Zによる色の区別:最初からZは1加算されているから補正をする
510 Z=Z-1
511 IF Z=0 THEN 550
520 C=LOG(Z)
550 RETURN
600 GOSUB 3000
610 REM 旧data1からマンデルブロ画像の境界付近の画像の読み込み
620 OPEN "C:\BASIC1\RUN\DATAmandel.DAT" FOR INPUT AS #1
630 INPUT #1,K,J,N
640 IF EOF(1) THEN 670
650 PSET (K,J),0
660 GOTO 630
670 CLOSE
680 END


282乱数を使ったブッタブロ画像(その2)

2014-07-21 13:33:33 | ブッダブロー画像
乱数を使わないブッダブロ画像については前記事で調べてきた。
今回は、始点に乱数を使う本来の画像について再度試みた。(記事277も乱数を使っている)

Wikipedia掲載の簡単な解説に従って、BASIC/98でプログラミングしているのだが、今回、巡回回数を21万回(記事277では10万回)の画像を作ったが、どうもWikipedia掲載の画像のような画像が得られない。尤も、BASIC/98では色の濃淡が表現できず、16色の色でしか濃度:mを表せないから、その点が画像の微細な表現が出来ないのは仕方ない。

***
下図は今回作った画像の中央部を縦に切ったときのm( 正確には、2*LOG(m) )の分布図である。mのダイナミックレンジは、0~2*LOG(m)=15以上、即ち、m は 0 からe^15/2=1808以上もある。この図を、よく見ると、画像を構成しているmは、0から約1800以上の間に散在している。この散在したmの分布を16色で表現しようとすること自体無理があり、画像の微細さが表現できないのは当然と言える。



下図は、C=2*LOG(m)の画像である。巡回回数は21万回で、Nmax=500とした。



BASIC/98の色コードは、8以上は簡単には区別できない色で構成されているる。
そこで比較的区別しやすい、0~7のみ使用するため、C=2*LOG(m) MOD 7 とした画像が下図である。



これらの画像において、画像の微細さが表現できないのは、使用ツール(BASIC/98)の限界に依るのは仕方ないとしても、ちょっと理解できないのは、Wikipedia掲載の画像と根本のところで異なっているように見えることだ。

むしろ、前回の乱数を使用しない方法の画像(記事277の画像)のほうが、Wikipedia掲載の画像に近い。それらの画像で異なる点は始点の与え方のみであり、他の計算手順は全く同じである。

***
今回の画像において、乱数の与え方に問題があるのだろうか?

今回の画像において前回同様に、乱数はRND コマンドを使い、始点Z(X,Y)は、画像表示範囲を
Xs~Xe,Ys~Yeとすると、X=(Xe-Xs)RND-Xs,Y-(Ye-Ys)RND-Ys とした。

***
参考のために、BASIC/98での画像作成と表示のプログラムを以下に掲載しておく。

10 REM ブッダブロ画像作成プログラム
110 CONSOLE ,,0,1
120 COLOR 0,7,,,2
130 CLS 3
140 '
144 RANDOMIZE 50
180 CXS=-1.4 :CXE=0.6 :DX=(CXE-CXS)/480
190 CYS=-1 :CYE=1 :DY=(CYE-CYS)/480
200 M=1 :L=0
202 DIM Z(480,480):DIM SX(10000):DIM SY(10000)
204 FOR J=0 TO 480
206 FOR K=0 TO 480
208 Z(K,J)=0
210 NEXT K,J
212 K=0:J=0
228 OPEN "C:\BASIC1\TEST\DATA.DAT" FOR OUTPUT AS #3
248 REM CX,CY given
250 CY=2*RND-1
260 CX=2*RND-1.4
262 REM M:最大反復回数
264 IF M=1.2*10^6 THEN 600
266 LOCATE 0,0:PRINT M
270 X=0:Y=0
288 FOR N=1 TO 500
290 XX=X^2-Y^2+CX
300 Y=2*X*Y+CY
310 X=XX
320 Q=X^2+Y^2
324 IF Q>4 THEN 400
328 SX(L)=X: SY(L)=Y
330 L=L+1
340 NEXT N
350 GOTO 248
400 REM
411 IF N=1 THEN 590
420 FOR LL=0 TO L
422 X=SX(LL):Y=SY(LL)
444 KK=(X-CXS)/DX : JJ=(Y-CYS)/DY
445 IF KK<0 OR JJ<0 THEN 460
446 IF KK>480 OR JJ>480 THEN 460
448 K=INT(KK) : J=INT(JJ)
450 Z(K,J)=Z(K,J)+1
452 C= N MOD 16
454 PSET (K,J),C
460 NEXT LL
464 L=0
590 M=M+1:GOTO 248
600 REM DATA FILE の作成
610 FOR JJJ=0 TO 480
620 FOR KKK=0 TO 480
630 IF Z(KKK,JJJ)=0 THEN 650
640 WRITE #3,KKK,JJJ,Z(KKK,JJJ)
650 NEXT KKK
660 NEXT JJJ
670 END
*****************
10 REM ブッダブロ表示(K,J,Zmax)デタの表示プログラム
30 CONSOLE ,,0,1
40 COLOR 0,7,,,2
50 CLS 3
58 OPEN "C:\BASIC1\TEST\DATA.DAT" FOR INPUT AS #1
60 INPUT #1,K,J,Z
70 IF EOF(1) THEN 120
80 REM Zによる色の区別:サブルーチン
90 GOSUB 1000
100 PSET (J,K),C
110 GOTO 60
120 CLOSE #1
140 END
1000 REM Zによる色の区別
1010 IF Z=0 THEN 2000
1020 C=2*LOG(Z)
2000 RETURN







281 乱数を使わないブッダブロ画像(その4)

2014-07-21 09:49:39 | ブッダブロー画像
今回は、前記事のデータにおいて、濃度mをlog化した画像を作成する。
ここで注意すべき点は、BASIC/98でのPSET(K,J),C コマンドにおける C の取扱いである。C 最終的には正整数となるが、最初から C=INT(LOG(m))とすると画像データの損失を招く。C=LOG(m)としておいたほうが良い。




下図は、C=2*LOG(m)の分布図である。この図より、C=2*LOG(m)にしてもC値の飽和を招ず、C=LOG(m)より大きく、Cのダイナミック・レンジがとれる。




下図は、C=LOG(m) と C=2*LOG(m) の全データを、そのまま使用した画像である。
よく見ると分かるが、C=LOG(m)画像よりも、C=2*LOG(m)画像のほうが、より多い色で構成されている。これは、C のダイナミック・レンジが大きくなった効果である。





下図は、C=2*LOG(m)画像を適当に画像処理にしたものである。
単純な画像処理であるが、ボンヤリとではあるが座禅した仏像の姿が見えてきて面白い。私は画像処理の技術の知識は皆無であるが、簡単なことは出来そうだ。例えば、1ピクセルだけ孤立している点は簡単なプログラムで除去できそうだ。






279 乱数を使わないブッダブロ画像(その2)

2014-07-21 09:09:37 | ブッダブロー画像
前記事278では、画像表現にlog(m)を使用した。

複素平面の画像作成の始点Z(X,iY)に乱数を使用しない方法( 即ち、画像表示座標の横軸及び縦軸を順次、始点にしていく方法 )では、同一座標点となる個数( これを濃度と定義し、m で表わす )の最大数は13であった。(但し、ブッダブロ画像そのものに寄与しない
特異点は約50以上の点があったが、それらは無視した。)

****
mの最大値が13程度ならば、BASIC/98の16色で表現可能であるが、しかし、ブッダブロ画像自体にハッキリとしたmの規則性が見られず、そのままのデータを直接、色表示したのでは画像構造がハッキリと分からない。

****
その構造をハッキリさせる方法は、log(m)による画像表現も其の一つだが、生(なま)データを、より直接に使う方法:C=mについて今回は調べてみた。以下は、その検討結果である。









(訂正:下図の画像の縦軸は、|X|<1cm,横軸は、-1.5cm<Y<0.5cm)

278 乱数を使わないブッダブロ画像(その1)

2014-07-21 08:50:50 | ブッダブロー画像

ブッダブロ画像は点(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






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