C曲線、ドラゴン曲線と2進法

 投稿者:山中和義  投稿日: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



 

Re: C曲線、ドラゴン曲線と2進法

 投稿者:山中和義  投稿日: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


 

Re: C曲線、ドラゴン曲線と2進法

 投稿者: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"の個数 が、奇数か偶数かで、
!                    ステップ差角を選ぶ。
!------------------------------------------------------------------------
 

戻る