FacebookのIchigoJamグループで「円を描く」という課題が出たので、久々に数学っぽいプログラムに挑戦してみました(^_^)
高校の数学で学ぶ円の方程式
から
と計算できるので、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
2015/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歩進めば一周できます。