再帰曲線の設計図 山中和義 2007/08/20 14:20:45 └サンプル 山中和義 2007/08/20 14:21:41 (修正1回) └アフィン変換行列:シダの葉 山中和義 2007/08/22 09:45:07 └線分を始点、終点で指定する場合 山中和義 2007/08/23 20:33:04
再帰曲線の設計図 山中和義 2007/08/20 14:20:45 ツリーへ
再帰曲線の設計図 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/20 14:20:45 | |
C曲線の場合
基線(原点から長さ1、向き0°の赤色線分)から 1本目:原点から長さ1/√2、向き45°の線分 2本目:点(1/2,1/2)から長さ1/√2、向き-45°の線分 の2本の黒色線分が生成されると定義される。特に「向き」が重要なため、矢印で表現する。 DRAW d(1) !作図 で確認できる。(編集モード) 図形の再帰作図(連続してアフィン変換する)を使って、 生成された線分が新たに基線となって、次々と細分化される。(作図モード) DRAW d(6) !作図 ※n次 で確認できる。 基線作図部分 SET LINE COLOR 4 PLOT LINES: 0,0; 1,0; 0.8,0.1; 0.8,-0.1; 1,0 !n次の基線 ※原点から長さ1、向き0°の線分 を、コメントアウトして 生成する線分の作図部分 ELSE PLOT LINES: 0,0; 1,0 END IF を、「線分」にすれば求める再帰曲線のプログラムとなる。 GUIを使って、矢印を編集できるようにすれば簡単に作図できる。(今後の課題) PICTURE d(n) !再帰曲線の定義 IF n>0 THEN SET LINE COLOR 4 PLOT LINES: 0,0; 1,0; 0.8,0.1; 0.8,-0.1; 1,0 !n次の基線 ※原点から長さ1、向き0°の線分 !-----↓↓↓↓↓----- 生成する線分(アフィン変換) !1本目:原点から長さ1/√2、向き45°の線分を引く DRAW d(n-1) WITH SCALE(1/SQR(2))*ROTATE(PI/4) !2本目:点(1/2,1/2)から長さ1/√2、向き-45°の線分を引く DRAW d(n-1) WITH SCALE(1/SQR(2))*ROTATE(-PI/4)*SHIFT(1/2,1/2) !3本目:・・・・ の線分を引く ※必要に応じて !-----↑↑↑↑↑----- ELSE SET LINE COLOR 1 PLOT LINES: 0,0; 1,0; 0.8,0.1; 0.8,-0.1; 1,0 !矢印 !!!PLOT LINES: 0,0; 1,0 END IF END PICTURE SET WINDOW -0.5,1.5,-0.5,1.5 !表示領域 DRAW grid(0.2,0.2) !目盛り DRAW d(1) !作図 ※1は編集モード END |
└サンプル 山中和義 2007/08/20 14:21:41 (修正1回) ツリーへ
Re: 再帰曲線の設計図 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/20 14:21:41 ** この記事は1回修正されてます | |
サンプル
●ドラゴン曲線 !1本目:原点から長さ1/√2、向き45°の線分 DRAW d(n-1) WITH SCALE(1/SQR(2))*ROTATE(PI/4) !2本目:点(1,0)から長さ1/√2、向き135°の線分 DRAW d(n-1) WITH SCALE(1/SQR(2))*ROTATE(3*PI/4)*SHIFT(1,0) ※C曲線と似ているが、2本目の向きが違う。 ●コッホ曲線 !1本目:原点から長さ1/3、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/3) !2本目:点(1/3,0)から長さ1/3、向き60°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*ROTATE(PI/3)*SHIFT(1/3,0) !3本目:点(1/2,SQR(3)/6)から長さ1/3、向き-60°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*ROTATE(-PI/3)*SHIFT(1/2,SQR(3)/6) !4本目:点(2/3,0)から長さ1/3、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*SHIFT(2/3,0) ●樹木 !1本目:原点から長さ1/2、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/2) !2本目:点(1/2,0)から長さ1/2、向き45°の線分を引く DRAW d(n-1) WITH SCALE(1/2)*ROTATE(PI/4)*SHIFT(1/2,0) !3本目:点(3/4,0)から長さ1/2、向き-30°の線分を引く DRAW d(n-1) WITH SCALE(1/2)*ROTATE(-PI/6)*SHIFT(3/4,0) ●クロスステッチ !1本目:原点から長さ1/3、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/3) !2本目:点(1/3,0)から長さ1/3、向き90°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*ROTATE(PI/2)*SHIFT(1/3,0) !3本目:点(1/3,1/3)から長さ1/3、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*SHIFT(1/3,1/3) !4本目:点(2/3,1/3)から長さ1/3、向き-90°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*ROTATE(-PI/2)*SHIFT(2/3,1/3) !5本目:点(2/3,0)から長さ1/3、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/3)*SHIFT(2/3,0) ●シルピンスキー曲線 !1本目:点(1/4,SQR(3)/4)から長さ1/2、向き-120°の線分を引く DRAW d(n-1) WITH SCALE(1/2)*ROTATE(-2*PI/3)*SHIFT(1/4,SQR(3)/4) !2本目:点(1/4,SQR(3)/4)から長さ1/2、向き0°の線分を引く DRAW d(n-1) WITH SCALE(1/2)*SHIFT(1/4,SQR(3)/4) !3本目:点(1,0)から長さ1/2、向き120°の線分を引く DRAW d(n-1) WITH SCALE(1/2)*ROTATE(2*PI/3)*SHIFT(1,0) |
└アフィン変換行列:シダの葉 山中和義 2007/08/22 09:45:07 ツリーへ
Re: サンプル |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/22 09:45:07 | |
アフィン変換行列:シダの葉
!再帰曲線の設計図 DIM M(4,4) !アフィン変換行列 PICTURE d(n) !再帰曲線の定義 IF n>0 THEN !SET LINE COLOR 4 !PLOT LINES: 0,0; 1,0; 0.8,0.1; 0.8,-0.1; 1,0 !n次の基線 ※原点から長さ1、向き0°の線分 !-----↓↓↓↓↓----- 生成する線分(アフィン変換) CALL setM(0.85,0.04,-0.04,0.85,0,1.6, M) DRAW d(n-1) WITH M CALL setM(0.2,-0.26,0.23,0.22,0,1.6, M) DRAW d(n-1) WITH M CALL setM(-0.15,0.28,0.26,0.24,0,0.44, M) DRAW d(n-1) WITH M CALL setM(0,0,0,0.16,0,0, M) DRAW d(n-1) WITH M !-----↑↑↑↑↑----- ELSE !0次の場合、基線を描く !SET LINE COLOR 1 !PLOT LINES: 0,0; 1,0; 0.8,0.1; 0.8,-0.1; 1,0 !矢印 PLOT LINES: 0,0; 1,0 !線分 !!!SET POINT STYLE 1 !!!PLOT POINTS: 0,0 END IF END PICTURE !アフィン変換 ! x'=a*x+b*y+e ! y'=c*x+d*y+f ! !行列で表現すると ! [ x' y' 0 1 ]=[ x y 0 1 ]┌ a c 0 0 ┐ ! │ b d 0 0 │ ! │ 0 0 1 0 │ ! └ e f 0 1 ┘ SUB setM(a,b,c,d,e,f, M(,)) !アフィン変換行列の設定 MAT M=IDN LET M(1,1)=a LET M(1,2)=c LET M(2,1)=b LET M(2,2)=d LET M(4,1)=e LET M(4,2)=f END SUB SET WINDOW -5,5,-1,9 !表示領域 DRAW grid(0.5,0.5) !目盛り DRAW d(9) !作図 ※1は編集モード END |
└線分を始点、終点で指定する場合 山中和義 2007/08/23 20:33:04 ツリーへ
Re: アフィン変換行列:シダの葉 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/23 20:33:04 | |
線分を始点、終点で指定する場合
たとえばC曲線のなら 1本目:原点から長さ1/√2、向き45°の線分 2本目:点(1/2,1/2)から長さ1/√2、向き-45°の線分 としていたが、これを 1本目:原点から点(1/2,1/2)への線分 2本目:点(1/2,1/2)から点(1,0)への線分 として指定したい場合、次のように記述すればよい。 LET x0=0 !始点 LET y0=0 LET x1=1/2 !終点 LET y1=1/2 LET xx=x1-x0 !直交座標系を極座標系に変換する LET yy=y1-y0 DRAW d(n-1) WITH SCALE(SQR(xx*xx+yy*yy))*ROTATE(ANGLE(xx,yy))*SHIFT(x0,y0) LET x0=1/2 !始点 LET y0=1/2 LET x1=1 !終点 LET y1=0 LET xx=x1-x0 !直交座標系を極座標系に変換する LET yy=y1-y0 DRAW d(n-1) WITH SCALE(SQR(xx*xx+yy*yy))*ROTATE(ANGLE(xx,yy))*SHIFT(x0,y0) ※速度を要求する場合、SACLE、ROTATEの値は予め計算しておく必要がある。 |