投稿者:山中和義
投稿日:2014年10月22日(水)16時42分39秒
|
|
|
!C曲線と2進法
LET N=7 !n次
SET WINDOW -15,10,-20,5
!!DRAW grid
LET X=0 !開始位置を原点とする
LET Y=0
PLOT LINES: X,Y;
FOR i=0 TO 2^N-1
LET T=i
LET S=0 !1の個数 mod 4
DO WHILE T>0
LET S=MOD(S+MOD(T,2),4)
LET T=INT(T/2)
LOOP
PRINT S
SELECT CASE S !各方向へ移動する
CASE 0 !左
LET X=X-1
CASE 1 !上
LET Y=Y+1
CASE 2 !右
LET X=X+1
CASE 3 !下
LET Y=Y-1
CASE ELSE
END SELECT
PLOT LINES: X,Y;
NEXT i
END
!ドラゴン曲線と2進法
LET N=8 !n次
SET WINDOW -20,10,-15,15
!!DRAW grid
LET X=0 !開始位置を原点とする
LET Y=0
PLOT LINES: X,Y;
FOR i=0 TO 2^N-1
LET T=i
LET S=0 !桁数 mod 4
LET W0=-1
DO WHILE T>0
LET W=MOD(T,2)
IF W<>W0 THEN !ただし、同じ数字が連続する場合、まとめて1桁と数える
LET S=MOD(S+1,4)
LET W0=W
END IF
LET T=INT(T/2)
LOOP
PRINT S
SELECT CASE S !各方向へ移動する
CASE 0 !左
LET X=X-1
CASE 1 !上
LET Y=Y+1
CASE 2 !右
LET X=X+1
CASE 3 !下
LET Y=Y-1
CASE ELSE
END SELECT
PLOT LINES: X,Y;
NEXT i
END
|
|
|
投稿者:山中和義
投稿日:2014年10月24日(金)10時22分27秒
|
|
|
> No.3536[元記事へ]
作図の処理を簡素化するため、複素平面で考えます。
C曲線
!C曲線と2進法
OPTION ARITHMETIC COMPLEX !複素平面
LET N=7 !n次
SET WINDOW -10,15,-20,5
!!DRAW grid
LET Z=0 !開始位置を原点とする
PLOT LINES: Z;
FOR i=0 TO 2^N-1
LET T=i
LET S=0 !1の個数
DO WHILE T>0
LET S=S+MOD(T,2)
LET T=INT(T/2)
LOOP
PRINT i; S; BSTR$(i,2)
LET Z=Z+EXP(COMPLEX(0,1)*2*PI*S/4) !各方向へ移動する
PLOT LINES: Z;
NEXT i
END
ドラゴン曲線
!ドラゴン曲線と2進法
OPTION ARITHMETIC COMPLEX !複素平面
LET N=8 !n次
SET WINDOW -10,20,-15,15
!!DRAW grid
LET Z=0 !開始位置を原点とする
PLOT LINES: Z;
FOR i=0 TO 2^N-1
LET T=i
LET S=0 !桁数
LET W0=-1 !1つ前の数字
DO WHILE T>0
LET W=MOD(T,2)
IF W<>W0 THEN !ただし、同じ数字が連続する場合、まとめて1桁と数える
LET S=S+1
LET W0=W
END IF
LET T=INT(T/2)
LOOP
PRINT i; S; BSTR$(i,2)
LET Z=Z+EXP(COMPLEX(0,1)*2*PI*S/4) !各方向へ移動する
PLOT LINES: Z;
NEXT i
END
その2
!ドラゴン曲線と2進法
OPTION ARITHMETIC COMPLEX !複素平面
LET N=8 !n次
SET WINDOW -10,20,-15,15
!!DRAW grid
LET Z=0 !開始位置を原点とする
PLOT LINES: Z;
FOR i=0 TO 2^N-1
LET T=i
IF T>0 THEN
DO WHILE MOD(T,2)=0 !2で割り切れる間は割っていく
LET T=T/2
LOOP
IF MOD(T,4)=1 THEN LET S=S+1 ELSE LET S=S-1
ELSE
LET S=0 !桁数 ※0から連続処理する場合
END IF
PRINT i; S; BSTR$(i,2)
LET Z=Z+EXP(COMPLEX(0,1)*2*PI*S/4) !各方向へ移動する
PLOT LINES: Z;
NEXT i
END
その3 k番目の折り目に着目する
!ドラゴン曲線と2進法
OPTION ARITHMETIC COMPLEX !複素平面
LET N=8 !n次
SET WINDOW -10,20,-15,15
!!DRAW grid
LET Z=0 !開始位置を原点とする
PLOT LINES: Z;
LET S=0
FOR K=1 TO 2^N
LET Z=Z+EXP(COMPLEX(0,1)*2*PI*S/4) !各方向へ移動する
PLOT LINES: Z;
LET P=BITAND(K,-K) !k番目の折り目 1:山折り、0:谷折り
LET T=BITAND(P,BITNOT(INT(K/2)))/P !※32bit整数の範囲
IF T=1 THEN LET S=S+1 ELSE LET S=S-1
PRINT K; T; S; BSTR$(K,2)
NEXT K
END
|
|
|
投稿者:SECOND
投稿日:2014年11月 1日(土)17時40分0秒
|
|
|
> No.3538[元記事へ]
!2進数による、コッホの曲線
OPTION ARITHMETIC COMPLEX
SET WINDOW -.05, 1.05, -.15, .4
FOR n=0 TO 10
CLEAR
!----------------------
! 2進数 描画(上)
!----------------------
SET VIEWPORT 0,1, 1/2,1
DRAW grid(.1,.1)
LET Rn=1/SQR(3)^n !n次の縮小率
LET rot0= EXP(COMPLEX(0, PI/6*MOD(n,2))) !奇偶n次の、始点角 単位ベクトル
LET rot= EXP(COMPLEX(0, PI/3*(1-2*MOD(n,2)))) ! 〃 ステップ角 単位ベクトル
!---
LET s=rot0 !始点角
LET z=s
PLOT LINES: 0; z*Rn; !始点0~z(i=0)
FOR i=1 TO 2^n-1
IF MOD( LOG(bitAND(i,-i))/LOG(2), 2)=0 THEN LET s=s*rot ELSE LET s=s/rot^2
LET z=z+s
PLOT LINES: z*Rn; !z*(縮小率)
NEXT i
!----------------------
! 比較の 再帰描画(下)
!----------------------
SET VIEWPORT 0,1, 0,1/2
DRAW grid(.1,.1)
PLOT label,AT.03,.3:"比較の再帰 次数 "& STR$(n)
DRAW koch(n)
pause 1
NEXT n
PICTURE koch(k)
IF 0< k THEN
DRAW koch(k-1) WITH SCALE(1,-1)*ROTATE(PI/6)*SCALE(1/SQR(3))
DRAW koch(k-1) WITH SHIFT(-1)*ROTATE(PI/6)*SCALE(1,-1)*SCALE(1/SQR(3))*SHIFT(1)
ELSE
PLOT LINES: 0;1
END IF
END PICTURE
END
!------------------------------------------------------------------------
! o1o11ooo = (i)
! 1o1o1ooo = (-i) ・・・(NOT i)+1 と同。
! oooo1ooo = bitAND(i,-i) ・・・(i) の右端から数え、最初の「1」だけ残る。
! log( bitAND(i,-i))/log(2) ・・・「1」の右側の"0"の個数
!
! コッホの曲線 「1」の右側の"0"の個数 が、奇数か偶数かで、
! ステップ差角を選ぶ。
!------------------------------------------------------------------------
|
|
|
戻る