SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

円を描く

FacebookIchigoJamグループで「円を描く」という課題が出たので、久々に数学っぽいプログラムに挑戦してみました(^_^)
高校の数学で学ぶ円の方程式

から

と計算できるので、xをスキャンしてyを算出して、座標(x,y)にドットをプロット。
そのままだとドットがスカスカになるので、逆にyをスキャンしてxを算出して、重ねてプロットしています。
IchigoJamではルートの計算ができないので、

級数展開して計算しています。
3項目までの級数で、ちゃんと円が描けました。
この辺りは大学の数学ですね。

半径Rは、最大R=11まで変化させられます。

10 '*CIRCLE*
20 CLS
30 R=11
40 O=R
50 FOR X=0 TO R
60 A=X
70 GOSUB 190
80 Y=B
90 GOSUB 280
100 NEXT
110 FOR Y=0 TO R
120 A=Y
130 GOSUB 190
140 X=B
150 GOSUB 280
160 NEXT
170 LOCATE 0,0
180 END
190 '@SQR
200 B=R
210 S=A*A
220 S=S/2/R
230 B=B-S
240 S=A*A*A*A
250 S=S/8/R/R/R
260 B=B-S
270 RETURN
280 '@PLOT
290 LOCATE O-X,O-Y:PRINT "*"
300 LOCATE O+X,O-Y:PRINT "*"
310 LOCATE O-X,O+Y:PRINT "*"
320 LOCATE O+X,O+Y:PRINT "*"
330 RETURN
応用編で「花火」。た〜まや〜!

10 '*HANABI*
20 CLS
30 O=11
40 '@UCHIAGE
50 BEEP 30,5
60 FOR Y=23 TO O STEP -1
70 LOCATE O,Y
80 PRINT "*";
90 WAIT 6
100 LOCATE O,Y
110 PRINT " ";
120 NEXT
130 '@DON
140 FOR R=1 TO 11 STEP 2
150 BEEP 30,5
160 GOSUB 200
170 NEXT
180 LOCATE 0,0
190 END
200 '@CIRCLE
210 FOR X=0 TO R
220 A=X
230 GOSUB 340
240 Y=B
250 GOSUB 430
260 NEXT
270 FOR Y=0 TO R
280 A=Y
290 GOSUB 340
300 X=B
310 GOSUB 430
320 NEXT
330 RETURN
340 '@SQR
350 B=R
360 S=A*A
370 T=2*R
380 B=B-S/T
390 S=S*S
400 T=T*T*T
410 B=B-S/T
420 RETURN
430 '@PLOT
440 LOCATE O-X,O-Y:PRINT "*"
450 LOCATE O+X,O-Y:PRINT "*"
460 LOCATE O-X,O+Y:PRINT "*"
470 LOCATE O+X,O+Y:PRINT "*"
480 RETURN

9/2追記

Facebookグループで、その昔「こんにちはマイコン」に出ていた円を描くプログラムの話題が出ました。かなり単純なプログラムでビックリしたのですが、それを私が一部改良したプログラムを掲載します。半径Rは最大11まで変化させられます。

10 'CIRCLE TURTLE
20 CLS
30 R=11
40 O=R
50 S=2048
60 X=R*S
70 Y=0
80 FOR I=0 TO 202
90 X=X-Y/32
100 Y=Y+X/32
110 LOCATE O+X/S,O-Y/S:PRINT "*"
120 NEXT
130 LOCATE 0,0
140 END
このプログラムは、円周上を動く動点の軌跡を一歩ずつ計算する、いわばタートルグラフィックスの手法です。
詳しくは下の画像のとおりですが、動点が一歩動く時の角度変化量をΔθとすると、x座標の変化量Δx、y座標の変化量Δyは、

Δx=−Δθ・y
Δy=Δθ・x

と計算できます。プログラムではΔθ=1/32として、202歩分を計算してプロットしています。
角度が1/32(ラジアン)ずつ進むと、一周360°=2πラジアンなので、2π÷(1/32)=64π=201.13… より、202歩進めば一周できます。