スピログラフ(幾何学アート)

 投稿者:山中和義  投稿日:2008年10月13日(月)22時35分55秒
  !参考. リンク集より

FUNCTION GCD(a,b) !最大公約数
   IF b=0 THEN LET GCD=a ELSE LET GCD=GCD(b, MOD(a,b))
END FUNCTION


LET r1=8 !固定円の半径
LET r2=5 !動く円の半径 ※r1*r2>0なら内側、r1*r2<0なら外側
LET r3=4 !点Pの位置(動く円の中心から) ※r3=r2ならサイクロイド、r3≠r2ならトロコイド

IF r1*r2>0 THEN
   LET sz=ABS(r1)+ABS(r3)+1
ELSE
   LET sz=ABS(r1)+ABS(r2)+ABS(r3)+1
END IF
SET WINDOW -sz,sz,-sz,sz !表示領域

DRAW grid !座標
DRAW circle WITH SCALE(r1) !大きな円

LET iter=r2/GCD(r1,r2) !周回数

FOR th=0 TO 360*iter !STEP 0.2 !※疎になるなら調整
   DRAW p WITH ROTATE(r1/r2*RAD(th))*SHIFT(r1-r2,0)*ROTATE(-RAD(th)) !点P
NEXT th


PICTURE p !原点(動く円の中心)を基準に点Pを描く
   DRAW disk WITH SCALE(0.1)*SHIFT(r3,0) !点P
END PICTURE

END
 

Re: スピログラフ(幾何学アート)

 投稿者:山中和義  投稿日:2008年10月14日(火)07時54分28秒
  > No.19[元記事へ]

作画の様子をアニメーションさせてみました。


FUNCTION GCD(a,b) !最大公約数
   IF b=0 THEN LET GCD=a ELSE LET GCD=GCD(b, MOD(a,b))
END FUNCTION


LET r1=8 !固定円の半径
LET r2=5 !動く円の半径 ※r1*r2>0なら内側、r1*r2<0なら外側
LET r3=4 !点Pの位置(動く円の中心から) ※r3=r2ならサイクロイド、r3≠r2ならトロコイド

!LET r1=8 !固定円の直径 r1:r2=2:1
!LET r2=4
!LET r3=r2

!LET r1=12 !アステロイド 4:1
!LET r2=3
!LET r3=r2

!LET r1=5 !カージオイド 1:1
!LET r2=-5
!LET r3=ABS(r2)

!LET r1=4 !ネフロイド 2:1
!LET r2=-2
!LET r3=ABS(r2)


IF r1*r2>0 THEN
   IF ABS(r1)>ABS(r2) THEN
      LET sz=MAX(ABS(r1),ABS(r1-r2)+ABS(r3))+1
   ELSE
      LET sz=ABS(r1)+ABS(r3)+1
   END IF
ELSE
   LET sz=ABS(r1)+ABS(r2)+ABS(r3)+1
END IF
SET WINDOW -sz,sz,-sz,sz !表示領域

DRAW grid !座標
DRAW circle WITH SCALE(r1) !大きな円

LET iter=r2/GCD(r1,r2) !周回数

SET DRAW MODE NOTXOR

DIM w(4,4) !ローカル座標をワールド座標に変換する
MAT w=SHIFT(r1-r2,0) !1つ前
DRAW p(0) WITH w

FOR th=0 TO 360*iter !STEP 0.2 !※疎になるなら調整
   DRAW p(0) WITH w !1つ前を消す

   MAT w=ROTATE(-r1/r2*RAD(th)) * SHIFT(r1-r2,0)*ROTATE(RAD(th)) !姿勢と位置
   DRAW p(1) WITH w !ワールド座標に、動く円と点Pを描く

   WAIT DELAY 0.02
NEXT th


PICTURE p(f) !ローカル座標の原点を基準に、動く円と点Pを描く
   IF f=1 THEN !描画順を考慮して、先に点Pを描く
      SET DRAW MODE OVERWRITE !描画diskにNOTXORを反映させない
      DRAW disk WITH SCALE(0.2)*SHIFT(r3,0)
      SET DRAW MODE NOTXOR
   END IF
   DRAW circle WITH SCALE(r2) !動く円
   PLOT LINES: 0,0; r3,0
END PICTURE

END
 

戻る