|
!フラクタル画像の追跡 Ver.755 (ver.7.5.5 以降で動きます。)
! N=0 ~3 は、
! 0 階絵に、実数軸( 実線 )、虚数軸( 破線 )、原点( 描点順番 #path 経路の数列)
! の付いた 直角3角形を用い、0 階空間や、絵の 3 階までの、変形経路を、全て表示。
! N=4 ~ 以降は、
! 0 階絵の3角形を、grid と同色の薄い色で1つ表示。初期化の形も異なる。
! 0 階絵の3角形は、3つの頂点を、マウス 左ボタン押下げ、ドラッグして変形すると、
! リアルタイムに、変形の連鎖状態を、観察できる。 N=0 ~3 でも同様。
! (速度の点で、3 分岐型で N=7 、2 分岐型で N=11 ぐらいまで。) 操作パネルの
! 「題名」を変更、又は、重ねて左クリックすると、変形した3角形は、初期化する。
!----------------------------------------------------------------------------
OPTION ARITHMETIC COMPLEX
DECLARE EXTERNAL NUMERIC m.mlb, m.mrb, m.bms, m.o()
DECLARE EXTERNAL STRING m.fn$()
!
DIM m0(4,4), m1(4,4), m2(4,4), mc(4,4)
SET TEXT font "",18*bms
SET TEXT BACKGROUND "OPAQUE" !文字の背景を、色指標 0 で塗る。
SET POINT STYLE 1
!
LET algo=2 !Algorithm. 1:call F23 2:call F23x 3:draw D23 4:call dp23 5:call F23mx
!
CALL setN(2) !N2= 2, N3=2 、2分岐型,3分岐型のN
LET item=9 !1~13
!------------------------------------------- ●開始のスライド・ショーを止めるには、
LET item=101 !demo.101~113 (1~13) ! この2行を、削除する。
CALL setN(12) !N2=12, N3=N2*log(2)/log(3) !
!-------------------------------------------
!
!-----------------------------------
! 複素数z入力の Affine 写像式
!-----------------------------------
DEF f0(z)= a0*(z-o0) +b0*conj(z-o0) +o0
DEF f1(z)= a1*(z-o1) +b1*conj(z-o1) +o1
DEF f2(z)= a2*(z-o2) +b2*conj(z-o2) +o2
!-------------------
! 写像式 係数の設定
!-------------------
SUB Let02( a,b,o, v1,v2,v3)
LET a=v1
LET b=v2
LET o=v3
END SUB
! 複素数z入力を 画素( 行ベクトル1x4 ) 、写像式を 行列 m で表現。
!------------------------------------------
! 変形指示MAT文。 4x4 変形行列 m の作成
! z*m ← a*(z-o) +b*conj(z-o) +o
!------------------------------------------
SUB mat02( m(,), a, b, o)
MAT m= SCALE( a ) !a*z
MAT mc= SCALE(1,-1)*SCALE( b ) !b*conj(z)
MAT m= m+mc !f(z)= a*z + b*conj(z)
LET m(4,4)= 1 ! システム予約要素(倍率逆数)、加算しない。
MAT m= SHIFT(-o)*m*SHIFT(o) !f(z)= f(z-o)+o
END SUB
DO
SELECT CASE MOD(item,100)
CASE 1
!-----
!f0(z)= 0*(z ) +(3+SQR(3)*i)/6*conj(z )
!f1(z)= 0*(z-1) +(3-SQR(3)*i)/6*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0, COMPLEX(3,SQR(3))/6, 0)
CALL Let02( a1,b1,o1, 0, conj(b0) , 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("コッホの曲線", 0.5, 0.1, 0.6, 13)
CASE 2 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= (1+i)/2*(z ) +0*conj(z )
!f1(z)= (1-i)/2*(z-1) +0*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, COMPLEX(1,1)/2, 0, 0)
CALL Let02( a1,b1,o1, conj(a0) , 0, 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("レヴィのC曲線", 0.5, 0.3, 1.1, 16)
CASE 3 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= (1+i)/2*(z ) +0*conj(z )
!f1(z)= (1+i)/2*(z-1) +0*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, COMPLEX(1,1)/2, 0, 0)
CALL Let02( a1,b1,o1, a0 , 0, 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("ドラゴン集合", 0.5, -0.1, 1.2, 16)
CASE 4 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= 0*(z ) +(1+i)/2*conj(z )
!f1(z)= 0*(z-1) +(1-i)/2*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0, COMPLEX(1,1)/2, 0)
CALL Let02( a1,b1,o1, 0, conj(b0) , 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("ペアノの曲線", 0.5, 0.2, 0.6, 17)
CASE 5 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= 0*(z ) +EXP(i*PI/7)/SQR(3)*conj(z )
!f1(z)= 0*(z-1) + 2/3*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0, EXP(COMPLEX(0,PI/7))/SQR(3), 0)
CALL Let02( a1,b1,o1, 0, 2/3 , 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("葉脈曲線", 0.5, 0, 0.6, 14)
CASE 6 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= (1+i)/2*(z ) + 0*conj(z )
!f1(z)= 0*(z-1) +(1-i)/2*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, COMPLEX(1,1)/2, 0 , 0)
CALL Let02( a1,b1,o1, 0 , conj(a0), 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("カニの行列", 0.35, 0.2, 0.8, 17)
CASE 7 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= 0*(z ) +(1-EXP(-PI/5*i))*conj(z )
!f1(z)= 0*(z-1) +(1-EXP( PI/5*i))*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0, 1-EXP(COMPLEX(0,-PI/5)), 0)
CALL Let02( a1,b1,o1, 0, conj(b0) , 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("クリヌキ正五角形", 0.5, 0.25, 0.6, 15)
CASE 8 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= (1+i)/2*(z ) + 0*conj(z )
!f1(z)= 0*(z-1) -(1+i)/2*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, COMPLEX(1,1)/2, 0, 0)
CALL Let02( a1,b1,o1, 0 , -a0, 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("ブロッコリー", 0.6, 0.4, 1.3, 17)
CASE 9 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= (2+i)/4*(z ) +i/4*conj(z )
!f1(z)= (2-i)/4*(z-1) -i/4*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, COMPLEX(2,1)/4, COMPLEX(0,1)/4, 0)
CALL Let02( a1,b1,o1, conj(a0) , conj(b0) , 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("高木関数のグラフ", 0.5, 0.25, 0.6, 13)
CASE 10 !題名,中心X,中心Y,半幅,最大N
!----- a= 0.4614*(1+i)
!f0(z)= a *(z ) +0*conj(z )
!f1(z)= 1/(1+a)*(z-1) +0*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0.4614*COMPLEX(1,1), 0, 0)
CALL Let02( a1,b1,o1, 1/(1+a0) , 0, 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("Extra-1 雲", 0.4, 0.2, 0.8, 15)
CASE 11 !題名,中心X,中心Y,半幅,最大N
!----- a= 0.4614*(1+i)
!f0(z)= a*(z ) + 0*conj(z )
!f1(z)= 0*(z-1) +(1-a)/(1-conj(a)^2)*conj(z-1) +1
!-----
CALL Let02( a0,b0,o0, 0.4614*COMPLEX(1,1), 0, 0)
CALL Let02( a1,b1,o1, 0 , (1-a0)/(1-conj(a0)^2), 1)
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL Affine("Extra-2 雷", 0.35, 0.2, 0.8, 15)
CASE 12 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= exp(i*π/6)/√3*(z ) +0*conj(z )
!f1(z)= exp(i*π/6)/√3*(z-2) +0*conj(z-2) +2
!f2(z)= exp(i*π/6)/√3*(z-(1+i*√3)) +0*conj(z-(1+i*√3)) +(1+i*√3)
!-----
CALL Let02( a0,b0,o0, EXP(COMPLEX(0,PI/6))/SQR(3), 0, 0 )
CALL Let02( a1,b1,o1, a0, 0, 2 )
CALL Let02( a2,b2,o2, a0, 0, COMPLEX(1,SQR(3)) )
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL mat02( m2, a2,b2,o2 )
CALL Affine("Tragon トラゴン", .951, 0.45, 2, 11)
CASE 13 !題名,中心X,中心Y,半幅,最大N
!-----
!f0(z)= 1/2*(z ) +0*conj(z )
!f1(z)= 1/2*(z-2) +0*conj(z-2) +2
!f2(z)= 1/2*(z-(1+i*√3)) +0*conj(z-(1+i*√3)) +(1+i*√3)
!-----
CALL Let02( a0,b0,o0, 1/2, 0, 0 )
CALL Let02( a1,b1,o1, a0, 0, 2 )
CALL Let02( a2,b2,o2, a0, 0, COMPLEX(1,SQR(3)) )
!-----
CALL mat02( m0, a0,b0,o0 )
CALL mat02( m1, a1,b1,o1 )
CALL mat02( m2, a2,b2,o2 )
CALL Affine("シルピンスキーのガスケット", 1, 0.7, 1.5, 10)
CASE ELSE !題名,中心X,中心Y,半幅,最大N
LET item=9 !Start item after Demo.End
CALL setN(2) !Start N after - -
END SELECT
LOOP
!----------
SUB Affine(t$, xm, ym, h, N_max) !(題名, 中心X, 中心Y, 半幅, 最大N)
DO
LET Nmax=N_max
!
SET DRAW mode hidden
!-----------------------
! clear & restore key pannel
!-----------------------
CALL m.clear2
LET i=.2
LET j=.95
SET VIEWPORT 0,1, i,j
SET WINDOW xm-h,xm+h, ym-h*(.5-i)/.5,ym+h*(j-.5)/.5
DRAW grid(.5,.5)
!
!-----------------------
! adjust N at (Nmax, 3 分岐 in 2 分岐)
!-----------------------
IF o1=2 THEN LET N=N3 ELSE LET N=N2
IF Nmax< N THEN LET N=Nmax
IF Nmax<=N THEN LET N$=" Nmax=" ELSE LET N$=" N="
!
!-----------------------
! title
!-----------------------
CALL m.BG_col(1, MOD(item,100)+2, 5) !item 表示色・ON
CALL m.BG_col(2, N, 5) !N 表示色・ON
CALL m.BG_col(3, algo-1, 5) !algo 表示色・ON
PLOT TEXT,AT xm-h*0.9,ym+h*0.8:" BUSY."
PLOT TEXT,AT xm-h*0.5,ym+h*0.8:t$& N$& STR$(N)
!
!------------
! 0 階の描点
!------------
IF item<>ibak THEN
LET zo0=0
LET zr0=o1
LET zi0=o1*COMPLEX(0,.25)
IF 4<=N THEN
IF o1=2 THEN
LET zi0=o2
ELSEIF MOD(item,100)=3 THEN
LET zi0=COMPLEX(0.5,0.866)
ELSEIF MOD(item,100)=8 THEN
LET zi0=COMPLEX(0.5,0.5)
ELSE
LET zi0=COMPLEX(0.5,0.3)
END IF
END IF
LET ibak=item
END IF
!
LET Ns=N !trace real
LET Ne=N !trace end
IF 4<=N THEN
SET LINE COLOR 15
PLOT LINES: zo0; zr0; zi0; zo0 !0階の絵
ELSE
LET Ns=MAX(0, Ne-3) !trace from previous N
!-------------------------
! 0~3階の追跡
!-------------------------
! 1階の transform axis
SET TEXT font "",12*bms
SET LINE COLOR "red"
!
SET LINE STYLE 3
PLOT LINES: f0(o0-COMPLEX(0,.1)); f0(o0+COMPLEX(0,.5))
PLOT LINES: f1(o1-COMPLEX(0,.1)); f1(o1+COMPLEX(0,.5))
IF o1=2 THEN PLOT LINES: f2(o2-COMPLEX(0,.1)); f2(o2+COMPLEX(0,.5))
SET LINE STYLE 1
PLOT LINES: f0(o0-.1); f0(o0+.5)
PLOT LINES: f1(o1-.1); f1(o1+.5)
IF o1=2 THEN PLOT LINES: f2(o2-.1);f2(o2+.5)
!
PLOT label,AT o1: "o1"
IF o1=2 THEN PLOT label,AT o2: "o2"
SET TEXT font "",18*bms
END IF
!
!SET VIEWPORT 0,1, 0,1 !この2行は、ver.7.5.4 まで削除できない。
!SET WINDOW xm-h,xm+h, ym-h,ym+h ! 〃 〃
!
SET DRAW mode explicit
!-----------------------
! plot graph
!-----------------------
FOR N=Ns TO Ne !trace Ns~Ne
LET no=1
LET r$="#"
LET cx=0
!---
SELECT CASE algo
CASE 1
CALL F23(N, zo0, zr0, zi0) !3点 並列 N 階写像。
CASE 2
LET to0=f0(0) !0階での、第1分岐1階の 原点vector
LET ta0=f0(1)-to0 ! " " " の 実軸単位vector
LET tb0=f0(COMPLEX(0,1))-to0 ! " " " の 虚軸単位vector
LET to1=f1(0) !0階での、第2分岐1階の 原点vector
LET ta1=f1(1)-to1 ! " " "
LET tb1=f1(COMPLEX(0,1))-to1 ! " " "
LET to2=f2(0) ! " 第3分岐1階の 原点vector
LET ta2=f2(1)-to2 ! " " "
LET tb2=f2(COMPLEX(0,1))-to2 ! " " "
CALL F23x(N, 0, 1, COMPLEX(0,1)) !開始の 原点vector 実軸単位vector 虚軸単位vector
CASE 3
DRAW D23(N)
CASE 4
MAT mc=IDN
CALL dp23(N, mc)
CASE 5
MAT mc=IDN
CALL F23mx(N, mc)
CASE ELSE
END SELECT
NEXT N
IF Ne=Nmax THEN beep
SET LINE COLOR "black" !restore line color to normal
!
!--------------------Return with demo.
IF 100< item THEN
WAIT DELAY 0.5
LET item=item+1
EXIT DO
END IF
!
!--------------------Normal.
PLOT TEXT,AT xm-h*0.9,ym+h*0.8:" Ready "
DO
mouse poll mx,my,mlb,mrb
DO WHILE mlb=0 AND mrb=0
WAIT DELAY 0
mouse poll mx,my,mlb,mrb
LET z=COMPLEX(mx,my)
LET i$=""
IF mrb=1 THEN EXIT DO
IF ABS(z-zr0)<=1/20 AND ABS(z-zr0)<=ABS(z-zi0) AND ABS(z-zr0)<=ABS(z-zo0) THEN LET i$="a"
IF ABS(z-zi0)<=1/20 AND ABS(z-zi0)<=ABS(z-zr0) AND ABS(z-zi0)<=ABS(z-zo0) THEN LET i$="b"
IF ABS(z-zo0)<=1/20 AND ABS(z-zo0)<=ABS(z-zr0) AND ABS(z-zo0)<=ABS(z-zi0) THEN LET i$="o"
LOOP
LET z=COMPLEX(mx,my)
IF i$="a" THEN
LET zr0=z
ELSEIF i$="b" THEN
LET zi0=z
ELSEIF i$="o" THEN
LET zo0=z
ELSE
CALL m.keyin( ky, 6) !( Key_data, Click_Echo_back_color)
IF mrb=1 THEN LET ky=100
SELECT CASE ky
CASE 100
CALL m.BG_col(1, 0, 6) !END 表示色・ON
beep
STOP
CASE 103 TO 115 !New item "1"~"13"
LET item=MOD(ky,100)-2 !New item 更新
LET ibak=0
EXIT SUB
CASE 101
CALL setN(-100)
CASE 102
CALL setN(+100)
CASE 200 TO 217
CALL setN( MOD(ky,100))
CASE 300 TO 304
LET algo=MOD(ky,100)+1
CASE ELSE
END SELECT
END IF
LOOP UNTIL 0< ky OR i$<>""
LOOP
END SUB
SUB setN(s)
IF o1=2 THEN
IF 99< ABS(s) THEN LET s=Ne+SGN(s)
LET N3=MIN( MAX( 0,s),17)
IF 3< N3 THEN LET N2=MIN( ROUND( N3*LOG(3)/LOG(2)),17) ELSE LET N2=N3
ELSE
IF 99< ABS(s) THEN LET s=Ne+SGN(s)
LET N2=MIN( MAX( 0,s),17)
IF 3< N2 THEN LET N3=ROUND( N2*LOG(2)/LOG(3)) ELSE LET N3=N2
END IF
END SUB
!--------------------------------------------------------------
!1)0 階絵(zo0,zr0,zi0)を、N 階写像した座標値(zo,zr,zi)で描く。
!
! N 階重ねの行列で 一括変形、(zo,zr,zi) は、直接描画。
!--------------------------------------------------------------
SUB dp23(k, t(,))
local w(4,4)
IF 0< k THEN
MAT w=t*m0
LET r$=r$& "1"
CALL dp23(k-1, w) !各階の写像行列
MAT w=t*m1
LET r$=r$& "2"
CALL dp23(k-1, w) !2分岐型は ココまで
IF o1=2 THEN
MAT w=t*m2
LET r$=r$& "3"
CALL dp23(k-1, w) !3分岐型は ココまで
END IF
ELSE
IF o1=2 THEN LET col=MOD(cx,3^3)+1 ELSE LET col=MOD(cx,2^5)+1
DRAW f012_n( zo0,zr0,zi0) WITH t !0 階絵を、行列 t で変形
LET cx=cx+1 !t は、N 階重ねの写像行列 (m0~m1)*(m0~m1)*...
LET no=no+1
END IF
LET r$=r$(1:LEN(r$)-1)
END SUB
!--------------------------------------------------------------------
!2)0 階座標系を、N 階 変形させて、その中に、0 階の座標値で絵を描く。
!
! 0 階の絵定義の座標値は、固定されたまま、
! それが 使用している問題座標系の方を、軸方向や目盛について、行列で変形し、
! 変形した問題座標系の中で、0 階の絵定義を、元の座標値のまま、描画する。
! 以上を、多分岐、N 階に展開。それぞれの絵定義は、孤立した座標系。
!--------------------------------------------------------------------
PICTURE D23(k)
IF 0< k THEN
LET r$=r$& "1"
DRAW D23(k-1) WITH m0 !各階の空間変形
LET r$=r$& "2"
DRAW D23(k-1) WITH m1 !2分岐型は ココまで
IF o1=2 THEN
LET r$=r$& "3"
DRAW D23(k-1) WITH m2 !3分岐型は ココまで
END IF
ELSE
LET col=INT(cx)+1
DRAW f012_n( zo0,zr0,zi0) !0 階集合
IF o1=2 THEN LET cx=cx+3^(3-N) ELSE LET cx=cx+2^(5-N)
LET no=no+1
END IF
LET r$=r$(1:LEN(r$)-1)
END PICTURE
!------------------------------------------------------------------
!5)0 階座標系を、N階 写像して、その中に、0 階の座標値で絵を描く。
!
! F23x(,,,) を行列形式に替えたもの。
!------------------------------------------------------------------
!※m_*u を逆にすると、dp23(,) に一致。 D23() draw picture with ~と同じ。
SUB F23mx(k, u(,))
local w(4,4)
IF 0< k THEN
LET r$=r$& "1"
MAT w=m0*u
CALL F23mx(k-1, w) !各階、次の空間
LET r$=r$& "2"
MAT w=m1*u
CALL F23mx(k-1, w) !2分岐型は ココまで
IF o1=2 THEN
LET r$=r$& "3"
MAT w=m2*u
CALL F23mx(k-1, w) !3分岐型は ココまで
END IF
ELSE
LET col=INT(cx)+1 !u は、N 階座標系の、原点位置(と、各軸の単位ベクトル)
DRAW f012_n( zo0,zr0,zi0) WITH u !N 階座標系の中に、0 階座標値の絵
IF o1=2 THEN LET cx=cx+3^(3-N) ELSE LET cx=cx+2^(5-N)
LET no=no+1
END IF
LET r$=r$(1:LEN(r$)-1)
END SUB
!Page-2 へ続く
|
|