NetaTaneMenu? >>>> 羊歯 羊歯左図が下のソースで描いたもの。右図は正式なもの。 ソースがこれです。どこをどう手直しすれば右図に なるのでしょう? 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 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 SET POINT STYLE 1 SET POINT COLOR 3 PLOT POINTS: px, py NEXT i END その前にまずはソースの簡単な説明を。お願いします。 ではあまりにもぶっきらぼうですよね。 そこで,次のようなL-systemなんでしょうか? http://melusine.eu.org/syracuse/metapost/galeries/lsystems1/ 早とちりか,こちらですね,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 例えば !描画領域の設定 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*, なのでしょうか?三系列ある意味は? |