L-system(エルシステム) 山中和義 2007/09/05 17:42:05 (修正2回) └つづき 山中和義 2007/09/05 22:48:01 (修正1回) └サンプル図形 山中和義 2007/09/06 14:41:34 (修正1回)
L-system(エルシステム) 山中和義 2007/09/05 17:42:05 (修正2回) ツリーへ
L-system(エルシステム) |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/09/05 17:42:05 ** この記事は2回修正されてます | |
!L-system(エルシステム、Lindenmayer system)
OPTION BASE 0 DIM p$(255) SUB Lsystem(n,p$(),w$, v$) !パラメトリックL-system G={V,S,ω,P} LET v$=w$ !初期化 PRINT 0;v$ FOR i=1 TO n !成長させる LET nt$="" FOR k=1 TO LEN(v$) !順次置き換えてゆく LET t$=mid$(v$,k,1) LET nt$=nt$&p$(ORD(t$)) !規則を適用する NEXT k LET v$=nt$ !置換後 PRINT i;v$ NEXT i END SUB !シェルピンスキーの三角形 LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="A" !初期状態 LET p$(ORD("A"))="B-A-B" !置換規則 ※A→B-A-B LET p$(ORD("B"))="A+B+A" CALL Lsystem(6,p$,w$, v$) !コマンドを生成する !A,Bは直線の描画、+は左へ60°回転、-は右へ60°回転する事を意味する SET WINDOW -1,1,-1,1 !表示領域 CLEAR CALL turtle(v$, 0.02,60, -1,-1) !図形へ WAIT DELAY 2 !コッホ曲線(Koch) LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="F" !初期状態 LET p$(ORD("F"))="F+F--F+F" !置換規則 CALL Lsystem(4,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,60, -1,-1) !図形へ WAIT DELAY 2 !コッホ島(Koch) LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="F-F-F-F" !初期状態 LET p$(ORD("F"))="F-F+F+FF-F-F+F" !置換規則 CALL Lsystem(3,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,90, -0.5,0.5) !図形へ WAIT DELAY 2 !植物 LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("["))="[" LET p$(ORD("]"))="]" LET w$="++F" !初期状態 LET p$(ORD("F"))="F[-F]F[+F][F]" !置換規則 CALL Lsystem(4,p$,w$, v$) CLEAR CALL turtle(v$, 0.04,25, -1,-1) !図形へ WAIT DELAY 2 |
└つづき 山中和義 2007/09/05 22:48:01 (修正1回) ツリーへ
Re: L-system(エルシステム) |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/09/05 22:48:01 ** この記事は1回修正されてます | |
つづき
!簡易タートルグラフィックス(FRACTINT L-systems) DIM stk(300) !スタック LET sp=1 !スタックポインタ SUB turtle(v$, d,a,x,y) !点(x,y)から図形にする ※線分の長さd、回転角度a LET x0=x !開始点 LET y0=y LET th=0 !0度 FOR i=1 TO LEN(v$) !各コマンドに応じて LET t$=mid$(v$,i,1) !!!PRINT i;t$ SELECT CASE t$ CASE "+" LET th=th+a !左へ CASE "-" LET th=th-a !右へ CASE "[" IF sp+3>UBOUND(stk) THEN PRINT "スタック・オバーフロー" STOP END IF LET stk(sp)=x0 !スタックに保存する LET stk(sp+1)=y0 LET stk(sp+2)=th LET sp=sp+3 CASE "]" IF sp<3 THEN PRINT "スタックにデータはありません。" STOP END IF LET sp=sp-3 LET x0=stk(sp) !スタックから取り出す LET y0=stk(sp+1) LET th=stk(sp+2) CASE "F","G","A","B" LET xx=x0+d*COS(RAD(th)) !移動先を計算する LET yy=y0+d*SIN(RAD(th)) IF t$="G" THEN !移動のみ ELSE PLOT LINES: x0,y0; xx,yy !直線を描く END IF LET x0=xx !現在位置 LET y0=yy CASE ELSE END SELECT NEXT i END SUB END |
└サンプル図形 山中和義 2007/09/06 14:41:34 (修正1回) ツリーへ
Re: つづき |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/09/06 14:41:34 ** この記事は1回修正されてます | |
サンプル図形
!花 LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("["))="[" LET p$(ORD("]"))="]" LET p$(ORD("F"))="" LET w$="[X]++[X]++[X]++[X]++[X]" !初期状態 LET p$(ORD("W"))="YF++ZF----XF[-YF----WF]++" !置換規則 LET p$(ORD("X"))="+YF--ZF[---WF--XF]+" LET p$(ORD("Y"))="-WF++XF[+++YF++ZF]-" LET p$(ORD("Z"))="--YF++++WF[+ZF++++XF]--XF" CALL Lsystem(4,p$,w$, v$) CLEAR CALL turtle(v$, 0.06,36, 0,0) !図形へ WAIT DELAY 2 !クロスステッチ LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="F" !初期状態 LET p$(ORD("F"))="F+F-F-F+F" !置換規則 CALL Lsystem(4,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,90, -0.75,0) !図形へ WAIT DELAY 2 !C曲線 LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="F" !初期状態 LET p$(ORD("F"))="F+F-" !置換規則 CALL Lsystem(10,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,90, 0,-0.5) !図形へ WAIT DELAY 2 !ヒルベルト曲線(Hilbert) LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("F"))="F" LET w$="X" !初期状態 LET p$(ORD("X"))="-YF+XFX+FY-" !置換規則 LET p$(ORD("Y"))="+XF-YFY-FX+" CALL Lsystem(5,p$,w$, v$) CLEAR CALL turtle(v$, 0.04,90, -0.5,0.5) !図形へ WAIT DELAY 2 !シェルピンスキー曲線(Sierpinski) LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("F"))="F" LET w$="L--F--L--F" !初期状態 LET p$(ORD("L"))="+R-F-R+" !置換規則 LET p$(ORD("R"))="-L+F+L-" CALL Lsystem(7,p$,w$, v$) CLEAR CALL turtle(v$, 0.04,360/8, -0.5,0) !図形へ WAIT DELAY 2 !シェルピンスキーの三角形 LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("["))="[" LET p$(ORD("]"))="]" LET w$="F-F-F" !初期状態 LET p$(ORD("F"))="F[-F]F" !置換規則 CALL Lsystem(6,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,360/3, -0.75,0.5) !図形へ WAIT DELAY 2 !ドラゴン曲線(Dragon) LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET p$(ORD("F"))="F" LET w$="X" !初期状態 LET p$(ORD("X"))="X-YF-" !置換規則 LET p$(ORD("Y"))="+FX+Y" CALL Lsystem(11,p$,w$, v$) CLEAR CALL turtle(v$, 0.02,90, 0,0) !図形へ WAIT DELAY 2 !Terdragon LET v$="" !変数 LET p$(ORD("+"))="+" !定数 LET p$(ORD("-"))="-" LET w$="X" !初期状態 LET p$(ORD("F"))="X" !置換規則 LET p$(ORD("X"))="F+F-F" !置換規則 CALL Lsystem(2*6-1,p$,w$, v$) !6次元 ※2*n-1 CLEAR CALL turtle(v$, 0.04,120, 0.5,0) !図形へ WAIT DELAY 2 |