新しく発言する EXIT インデックスへ
再帰曲線の設計図

  再帰曲線の設計図 山中和義 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の値は予め計算しておく必要がある。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。