#freeze
NetaTaneMenu >>>> 羊歯
*羊歯
----
左図は,これです。右図は正式なもの。
左図が下のソースで描いたもの。右図は正式なもの。

ソースがこれです。
#ref(shida.JPG,center)

!--------羊歯の行列の各成分---------
DATA 0.836,0.044,-0.044,0.836,0,0.619
READ a1,b1,c1,d1,e1,f1
DATA -0.144,0.302,0.302,0.141,0,0.127
READ a2,b2,c2,d2,e2,f2
DATA 0.141,-0.302,0.302,0.141,0,0.619
READ a3,b3,c3,d3,e3,f3
DATA 0,0,0,0.175,0,0
READ a4,b4,c4,d4,e4,f4
!----------------基点と範囲--------------
SET POINT STYLE 4
LET  px = 1
LET  py = 1
SET WINDOW -1,1.1,-1,4
PLOT POINTS: px,py
!----------------------------------
FOR i=0 TO 100000
ソースがこれです。どこをどう手直しすれば右図に
なるのでしょう?

 DATA 0.836,0.044,-0.044,0.836,0,0.619
 READ a1,b1,c1,d1,e1,f1 
 DATA -0.144,0.302,0.302,0.141,0,0.127
 READ a2,b2,c2,d2,e2,f2
 DATA 0.141,-0.302,0.302,0.141,0,0.619
 READ a3,b3,c3,d3,e3,f3
 DATA 0,0,0,0.175,0,0
 READ a4,b4,c4,d4,e4,f4
 SET POINT STYLE 4
 LET  px = 1
 LET  py = 1
 !描画領域の設定
 SET WINDOW -1,1.1,-1,4
 PLOT POINTS: px,py
 FOR i=0 TO 100000
   LET  k = RND
   IF k=<0.7 THEN
      LET px = a1*px+b1*py+e1
      LET py = c1*px+d1*py+f1
   ELSEIF k=<0.8 THEN
      LET px = a2*px+b2*py+e2
LET py = c2*px+d2*py+f2
 LET py = c2*px+d2*py+f2
   ELSEIF k=<0.9 THEN
      LET px = a3*px+b3*py+e3
      LET py = c3*px+d3*py+f3
   ELSE
      LET px = a4*px+b4*py+e4
      LET py = c4*px+d4*py+f4
   END IF
   END IF 
   SET POINT STYLE 1
   SET POINT COLOR 3
   PLOT POINTS: px, py
NEXT i
END
   PLOT POINTS: px, py 
 NEXT i
 END

COLOR(#fe891c){その前にまずは}ソースの簡単な説明を。お願いします。
ではあまりにもぶっきらぼうですよね。
そこで,次のようなL-systemなんでしょうか?

http://melusine.eu.org/syracuse/metapost/galeries/lsystems1/

COLOR(#fe891c){早とちりか},こちらですね,spleen fern。iterated function system?(反復関数系?)

http://www.zeuscat.com/andrew/chaos/spleenwort.fern.html

というわけで,理屈は兎も角,上記ページを参照に組んでみました。
折角の十進ベーシックなので,アフィン変換は行列の仕様を用いました。
 ! *******************************************************
 ! Spleenwort Fern 
 ! fractal generated by the IFS (Iterated Function System) method
 ! *******************************************************
 RANDOMIZE
 ! Set Four Transfomations
 DIM A(2,2),B(2,2),C(2,2),D(2,2)
 DATA 0.00, 0.00, 0.00, 0.16
 DATA 0.85, 0.04, -0.04, 0.85
 DATA 0.20, -0.26, 0.23, 0.22
 DATA -0.15, 0.28, 0.26, 0.24
 MAT READ A,B,C,D
 ! Set Four Translations
 DIM AA(2),BB(2),CC(2),DD(2)
 DATA 0   ,0   ,0   ,1.6 ,0   ,1.6 ,0   ,0.44
 MAT READ AA,BB,CC,DD
 ! Set Four Probability
 DATA 0.03,0.73,0.13,0.11
 READ pa,pb,pc,pd
 ! 初期設定
 SET POINT STYLE 4
 DIM p(2)
 DATA 1,1
 MAT READ p
 ! 描画領域の設定
 SET WINDOW -4,8,-1,11
 PLOT POINTS: p(1),p(2)
 ! main
 FOR i=0 TO 100000
    LET  k = RND
 ! 乱数により定められた確率でアフィン変換を施す。
    IF k=<pb THEN
       MAT p=B*p
       MAT p=p+BB
    ELSEIF k=<pb+pc THEN
       MAT p=C*p
       MAT p=p+CC
    ELSEIF k=<pb+pc+pd THEN
       MAT p=D*p
       MAT p=p+DD
    ELSE
       MAT p=A*p
       MAT p=p+AA
    END IF 
    SET POINT STYLE 1
    SET POINT COLOR 3
    PLOT POINTS: p(1),p(2)
 NEXT i
 END

#ref(shida2.png,center)
----
COLOR(#fe891c){例えば}
 !描画領域の設定
 SET WINDOW -1,1.1,-1,4
の部分を
 SET WINDOW -2,3,-1,4
のように縦横比を1:1にするだけで,プロポーションはご要望通りになります。

 DATA -0.144,0.302,0.302,0.141,0,0.127
 READ a2,b2,c2,d2,e2,f2
の部分を
 DATA -0.144,0.302,0.302,0.141,0,0.5
 READ a2,b2,c2,d2,e2,f2
のように最後の数値を変えれば,枝の出る場所が望み通りに。

誰が元のプログラムを描いたのか知りませんが,
 DATA 0.836,0.044,-0.044,0.836,0,0.619
 READ a1,b1,c1,d1,e1,f1 
 DATA -0.144,0.302,0.302,0.141,0,0.127
 READ a2,b2,c2,d2,e2,f2
 DATA 0.141,-0.302,0.302,0.141,0,0.619
 READ a3,b3,c3,d3,e3,f3
 DATA 0,0,0,0.175,0,0
 READ a4,b4,c4,d4,e4,f4
というデータ部が冗長です。データの自由度が不明。
例えば,
 c*=-b*, d*=a*,
なのでしょうか?三系列ある意味は?


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS