フラクタル画像の追跡 Ver.755

 投稿者:SECOND  投稿日:2011年 9月 1日(木)21時01分40秒
  !フラクタル画像の追跡 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 へ続く
 

!Page-2

 投稿者:SECOND  投稿日:2011年 9月 1日(木)21時00分38秒
  !Page-2 の始め

!------------------------------------------ u0 == IDN( 0 階空間の(実,虚,原)各・行vector)
!             m0                 u0         m0 == f0()
! |re(ta0),im(ta0), 0, 0|   |1, 0, 0, 0|       ta0 = f0()1階写像空間の実軸単位・行vector
! |re(tb0),im(tb0), 0, 0|   |0, 1, 0, 0|       tb0 = f0()  〃  〃  〃  虚軸単位・行vector
! |   0   ,   0   , X, 0|   |0, 0, X, 0|
! |re(to0),im(to0), 0, 1|   |0, 0, 0, 1|       to0 = f0()  〃  〃  〃  原点位置・行vector
!
!----------------------------------------------- mat u=t0*u
!             t0                  u                     u
! |re(ta0),im(ta0), 0, 0| |re(a) ,im(a) , 0, 0| |re(a) ,im(a) , 0, 0|
! |re(tb0),im(tb0), 0, 0|*|re(b) ,im(b) , 0, 0|=|re(b) ,im(b) , 0, 0|
! |   0   ,   0   , X, 0| |   0  ,   0  , X, 0| |   0  ,   0  , X, 0|
! |re(to0),im(to0), 0, 1| |re(zo),im(zo), 0, 1| |re(zo),im(zo), 0, 1|
!
!----------------------------------------------- draw picture(zo0,zr0,zi0) with u
!          picture in 0           u                     picture in u
! |re(zr0),im(zr0), 0, 1| |re(a) ,im(a) , 0, 0| |re(zr),im(zr), 0, 1|
! |re(zi0),im(zi0), 0, 1|*|re(b) ,im(b) , 0, 0|=|re(zi),im(zi), 0, 1|
! |re(zo0),im(zo0), 0, 1| |   0  ,   0  , 0, 0| |re(zo),im(zo), 0, 1|
!                         |re(zo),im(zo), 0, 1|
!
!------------------------------------------------------------------
!4)0 階座標系を、N階 写像して、その中に、0 階の座標値で絵を描く。
!
!  各階で、次の階の z0,a,b を、0階~1階の相対座標 to_,ta_,tb_ で送る。
!------------------------------------------------------------------
SUB F23x(k, zo,a,b)        ! 元空間の、zo=原点   a=実軸単位ベクトル   b=虚軸単位ベクトル
   IF 0< k THEN            !次階空間の、to_=原点 ta_=実軸単位ベクトル tb_=虚軸単位ベクトル
      LET r$=r$& "1"
      CALL F23x(k-1, re(to0)*a+im(to0)*b+zo, re(ta0)*a+im(ta0)*b, re(tb0)*a+im(tb0)*b) !次階のzo,a,b
      LET r$=r$& "2"
      CALL F23x(k-1, re(to1)*a+im(to1)*b+zo, re(ta1)*a+im(ta1)*b, re(tb1)*a+im(tb1)*b)
      IF o1=2 THEN
         LET r$=r$& "3"
         CALL F23x(k-1, re(to2)*a+im(to2)*b+zo, re(ta2)*a+im(ta2)*b, re(tb2)*a+im(tb2)*b)
      END IF
   ELSE
      LET col=INT(cx)+1    !N 階の、原点・座標軸で、0 階の絵を描く
      DRAW f012_n( re(zo0)*a+im(zo0)*b+zo, re(zr0)*a+im(zr0)*b+zo, re(zi0)*a+im(zi0)*b+zo )
      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

!--------------------------------------------------------------
!3)0 階絵(zo0,zr0,zi0)を、N 階写像した座標値(zo,zr,zi)で描く。
!--------------------------------------------------------------
SUB F23(k, zo,zr,zi)                          !初期値( zo,zr,zi ) は 0 階集合
   IF 0< k THEN
      LET r$=r$& "1"
      CALL F23(k-1, f0(zo),f0(zr),f0(zi))     !1~N 階目集合 の呼出し
      LET r$=r$& "2"
      CALL F23(k-1, f1(zo),f1(zr),f1(zi))     !2分岐型は ココまで
      IF o1=2 THEN
         LET r$=r$& "3"
         CALL F23(k-1, f2(zo),f2(zr),f2(zi))  !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( zo,zr,zi )                 !N 階集合
      LET cx=cx+1
      LET no=no+1
   END IF
   LET r$=r$(1:LEN(r$)-1)
END SUB

!----------- 3角形 △(zo,zr,zi) を描く。zo に * の印と、no#route(path) を付ける。
! プロッター
!-----------
PICTURE f012_n(zo,zr,zi)
   IF Nmax<=N THEN
      SET POINT COLOR col
      PLOT POINTS: zo
   ELSEIF 4<=N THEN
      SET LINE COLOR col
      PLOT LINES: zo; zr; zi; zo
   ELSE
      SET LINE COLOR N+1
      IF N=Ne THEN SET LINE width 2
      PLOT LINES: zo; zr; zi
      SET LINE width 1
      !---
      SET LINE STYLE 3
      PLOT LINES: zo; zi
      SET LINE STYLE 1
      !---
      SET POINT STYLE 3
      SET POINT COLOR N+1
      PLOT POINTS: zo
      SET POINT STYLE 1
      !---
      IF N=Ne THEN
         SET TEXT font "", 9*bms
         PLOT label,AT zo:STR$(no)& r$
         SET TEXT font "",18*bms
      END IF
   END IF
END PICTURE

END

!---------------
!  key pannel
!---------------
MODULE m
MODULE OPTION ARITHMETIC COMPLEX
PUBLIC STRING fn$(60)
PUBLIC NUMERIC mlb,mrb, bms, o(5)
SHARE NUMERIC bx0(5),bxw(5),by0(5),byw(5),Hn(5),Tn(5), bcol(60), chE
!
ASK bitmap SIZE i,j   !(ask bitmap size)=(ask pixel size)-1
LET bms=MIN(i,j)/500
!
! ch.1
DATA END           , "N=N-1"         , "N=N+1"        , コッホの曲線
DATA レヴィのC曲線, ドラゴン集合    , ペアノの曲線   , 葉脈曲線
DATA カニの行列    , クリヌキ正五角形, ブロッコリー   , 高木関数
DATA Extra-1 雲    , Extra-2 雷      , Tragon トラゴン, シルピンスキーの…  !ガスケット
DATA ""
! ch.2
DATA "N=0","N=1",  2,  3
DATA     4,   5 ,  6,  7
DATA     8,   9 , 10, 11
DATA    12,  13 , 14, 15
DATA    16,  17
DATA  ""
! ch.3
DATA call F23, call F23x, draw D23, call dp23, call F23mx
DATA ""
!
LET i=1
DO
   READ IF MISSING THEN EXIT DO: fn$(i)
   IF fn$(i)="" THEN EXIT DO
   LET chE=chE+1
   LET o(chE)=i                                   !top pointer( channel)
   DO
      LET i=i+1
      READ fn$(i)
      IF fn$(i)="" THEN EXIT DO
   LOOP
LOOP
!
CALL m.init( 1, .01,.05,  4,16, .98/ 4,.14/4)  !(ch, x0,y0, H,T, xw,yw)
CALL m.init( 2, .01,.01, 18,18, .98/18,.14/4)  !組ch, top_cell位置(x0,y0), 横数H,総数T, cell幅(xw,yw)
CALL m.init( 3, .01,.96,  5, 5, .98/ 5,.14/4)
!stop

EXTERNAL SUB keyin( ky,col)
   ASK VIEWPORT a,b,c,d
   ASK WINDOW e,f,g,h
   SET VIEWPORT 0,1,0,1
   SET WINDOW 0,1,0,1
   LET ky=0
   DO WHILE mlb=1
      CALL sensor(i,col)
      IF i<>ky THEN
         IF 0< ky THEN CALL colkey(IP(ky/100), MOD(ky,100), bcol(o(IP(ky/100))+MOD(ky,100)))
         IF 0< i   THEN CALL colkey(IP(i/100)  , MOD(i,100)  , col)
         LET ky=i
      END IF
      WAIT DELAY 0
   LOOP
   WAIT DELAY .1
   IF 0< ky THEN CALL colkey(IP(ky/100), MOD(ky,100), bcol(o(IP(ky/100))+MOD(ky,100)))
   SET VIEWPORT a,b,c,d
   SET WINDOW e,f,g,h
END SUB

EXTERNAL SUB sensor(i,col)
   MOUSE POLL mx,my,mlb,mrb
   FOR ch=1 TO chE
      LET j=INT((mx-bx0(ch))/bxw(ch))
      LET i=INT((my-by0(ch))/byw(ch)) *Hn(ch) +j
      IF 0<=j AND j< Hn(ch) AND 0<=i AND i< Tn(ch) THEN
         LET i=i+ch*100
         EXIT SUB
      END IF
   NEXT ch
   LET i=0
END SUB

EXTERNAL SUB colkey(ch, k, col)
   ASK TEXT HEIGHT w0
   LET w0=pixely(w0)-pixely(w0/17)  !11pt.w0/9~23  18pt.w0/13~38
   ASK TEXT JUSTIFY w1$,w2$
   !---
   SET TEXT font "MS UI Gothic",11*bms
   SET TEXT JUSTIFY "center","half"
   SET TEXT background "transparent"
   SET AREA COLOR col
   DRAW box(ch, k) WITH SHIFT( MOD(k,Hn(ch))*bxw(ch)+bx0(ch), INT(k/Hn(ch))*byw(ch)+by0(ch))
   SET TEXT background "opaque"
   SET TEXT JUSTIFY w1$,w2$
   SET TEXT font "",w0              !w0 は save/restore の繰返しで、小さめ→消滅、大きめ→発散。
END SUB

!   ├ bxw  ┤
!  ─┏━━━┓
!  byw┃   ┃
! by0→┗━━━┛
!   ↑
!   bx0

EXTERNAL PICTURE box(ch, k )
   PLOT AREA  :0,0; bxw(ch),0; bxw(ch),byw(ch); 0,byw(ch)
   PLOT LINES :0,0; bxw(ch),0; bxw(ch),byw(ch); 0,byw(ch); 0,0
   PLOT TEXT,AT .5*bxw(ch), .5*byw(ch) :fn$(o(ch)+k)
END PICTURE

EXTERNAL SUB BG_col(ch, k, col)
   ASK VIEWPORT a,b,c,d
   ASK WINDOW e,f,g,h
   SET VIEWPORT 0,1,0,1
   SET WINDOW 0,1,0,1
   LET bcol(o(ch)+k)=col
   CALL colkey(ch, k, col)
   SET VIEWPORT a,b,c,d
   SET WINDOW e,f,g,h
END SUB

EXTERNAL SUB init(ch, x0,y0, H,T, xw,yw)
   LET Hn(ch)=H
   LET Tn(ch)=T
   LET bx0(ch)=worldy(pixelx(x0))
   LET by0(ch)=worldy(pixely(y0))
   LET bxw(ch)=worldy(pixelx(xw))-worldy(pixelx(0))
   LET byw(ch)=worldy(pixely(yw))-worldy(pixely(0))
   FOR k=0 TO Tn(ch)-1
      LET bcol(o(ch)+k)=0
      CALL colkey(ch, k, 0)
   NEXT k
END SUB

EXTERNAL SUB clear2
   ASK VIEWPORT a,b,c,d
   ASK WINDOW e,f,g,h
   SET VIEWPORT 0,1,0,1
   SET WINDOW 0,1,0,1
   CLEAR
   FOR ch=1 TO chE
      FOR k=0 TO Tn(ch)-1
         LET bcol(o(ch)+k)=0
         CALL colkey(ch, k, 0)
      NEXT k
   NEXT ch
   SET VIEWPORT a,b,c,d
   SET WINDOW e,f,g,h
END SUB

END MODULE
 

戻る