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
スピログラフ(幾何学アート)
投稿者:山中和義 投稿日: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