2006/09/12(火)触発

きりがなくなってきたからこの辺で終わりにしよう。
二種類のサイクロイドをつかって描く曲線。
#define PATTERN 1 // 0,1,2
#if PATTERN!=0!=1 // PATTERN 0
#define scale 10.0f // 図の大きさ
#define ratio 1.0f // 周回ごとの大きさ補正値
#define clearance 4 // 角形の間隔
#define resolution 1536 // 一周あたりの分解能
#define laps 6 // 周回数
#define pcolor hsvcolor 192f*p, 64, 255 // 色
#define PenR1 3.00f // 外サイクロイドの外接円半径に対するペン半径の割合
#define PenR2 1.50f // 内サイクロイドの内接円半径に対するペン半径の割合
#endif
#if PATTERN!=1!=1 // PATTERN 1 : 花
#define scale 11.0f
#define ratio 1.0f
#define clearance 2
#define resolution 8192
#define laps 8
#define PenR1 3.00f
#define PenR2 0.50f
#endif
#if PATTERN!=2!=1 // PATTERN 2 : なんか模様
#define scale 0.8f
#define ratio 0.0f
#define clearance 4
#define resolution 512
#define laps 357
#define PenR1 2.00f
#define PenR2 0.50f
#endif
#module // antialiased pset(てきとーw)
#deffunc apset int x,int y
r=ginfo_r:g=ginfo_g:b=ginfo_b
pset x, y
pget x+1,y : color (r+ginfo_r)/2,(g+ginfo_g)/2,(b+ginfo_b)/2 : pset x+1,y
pget x-1,y : color (r+ginfo_r)/2,(g+ginfo_g)/2,(b+ginfo_b)/2 : pset x-1,y
pget x,y+1 : color (r+ginfo_r)/2,(g+ginfo_g)/2,(b+ginfo_b)/2 : pset x,y+1
pget x,y-1 : color (r+ginfo_r)/2,(g+ginfo_g)/2,(b+ginfo_b)/2 : pset x,y-1
color r,g,b
return
#global
#define PI 3.14159265358979f
#define wPI 6.28318530717959f
#const waitsw 0
#ifndef pcolor
#define pcolor
#endif
bgscr ,ginfo_dispx,ginfo_dispy,,0,0 : cls 4
repeat laps, 0
n = (cnt+1)*clearance+1 // n角形
r = double(scale)*(double(ratio)/(cnt+1)*cnt+1) // とりあえず半径基準値
// エピサイクロイド(外サイクロイド)
a = r*n // 円半径
b = r // 外接円半径
c = b*PenR1 // ペン半径
repeat resolution
p = 1f * cnt/resolution // 周に対する割合
t = wPI*p+n
x = 1f* (a+b)*cos(t)-c*cos(((a+b)/b)*t)
y = 1f* (a+b)*sin(t)-c*sin(((a+b)/b)*t)
hsvcolor 192f*cnt/resolution, 255f*n*p+64, 255f*n*p+64
pcolor
apset x + ginfo_winx/2, y + ginfo_winy/2
await waitsw
loop
// ハイポサイクロイド(内サイクロイド)
a = r*n // 円半径
b = r*2 // 内接円半径
c = b*PenR2 // ペン半径
repeat resolution
p = 1f * cnt/resolution // 周に対する割合
t = wPI*p*2+n
x = 1f* (a-b)*cos(t)+c*cos(((a-b)/b)*t)
y = 1f* (a-b)*sin(t)-c*sin(((a-b)/b)*t)
hsvcolor 192f*cnt/resolution, 255f*n*p-64, 255f*n*p-64
pcolor
apset x + ginfo_winx/2, y + ginfo_winy/2
await waitsw
loop
loop