計算式で、円を描くための座標を計算してみます。
#0.計算したいこと
平面上に円を描くための座標を求めたい
#1.Rubyで計算式をプログラムしてみる
プログラム名はmath03.rbとします。
puts "x,y"
0.step( Math::PI*2, 0.5 ) do |rad|
x = Math.sin( rad )
y = Math.cos( rad )
puts "#{x},#{y}"
end
#2.実行してみる
今回は、座標を見てもピンとこないので(今回だけじゃないかも)、結果をファイルに出力します。
結果を出力するファイルは、仮にmath03.csvとします。
ruby math03.rb > math03.csv
#3.図形を描く
エクセルかLibreOfficeを呼び出して、結果を保存したファイルを開きます。ファイルの種類をテキストファイルやCSVに切り替えないとうまく見つけられないかも知れません。結果の値をカンマ(,)で区切ったので、表計算ソフトで開くときも区切りにカンマ(コンマ)を指定しないと、うまくxとyの値が分かれてくれないので注意します。エクセルはファイルをダブルクリックして開くだけでうまく分けてくれるハズです。
表計算ソフトでうまく値が表示されたら、2行目以降のxとy値の部分だけを範囲選択します。
エクセルの場合は、メニューの挿入から、散布図(直線)を選択します。
LibreOffceの場合は、メニューのグラフボタンでグラフウィザードを開いて、散布図の線のみを選択し、種類で直線を選択して完了ボタンをクリックするとグラフが表示されます。
ぱっと見た感じ、3つ気になる点があります。
1つ目は、描いたグラフがつぶれて、横長や縦長になっていること。これは、グラフの外枠を縦や横に伸ばしたりすることで、ある程度調整できます。
2つ目は、そもそも円じゃない事。直線で描く指定にしたのでガタガタです。もしガタガタに見えないのは、グラフを描く条件で、直線を指定せず平滑化を選択している場合です。
3つ目は、閉じていない事。輪っかにならないなら円じゃなくて円弧です。
#4.プログラムの修正
一旦、表計算ソフトは終了して、プログラムを見直そうと思います。
まずは、気になる点の2つ目をどうにかしたいので、stepメソッドの中のステップ数を0.5から0.1にしてみます。
puts "x,y"
0.step( Math::PI*2, 0.1 ) do |rad|
x = Math.sin( rad )
y = Math.cos( rad )
puts "#{x},#{y}"
end
#5.再度、実行
ruby math03.rb > math03-2.csv
#6.再度、図形を描く
表計算ソフトで、結果を保存したファイルを開いて、先ほどと同じように、xとyの値を範囲選択し、グラフを描きます。今度は、さっきよりも滑らかに描かれていると思います。これは、プログラムから出力するデータを増やして、円を描くために必要な頂点の数を増やしたからです。
でも、円弧のままですね。最後に描く頂点を最初の頂点と同じ座標にすれば、円になると思いますので、データを少し加工しましょう。最後の行(多分64行目だと思います)の下に、最初の頂点の座標となる2行目と同じデータを追加してしまいましょう。具体的には、65行目に0と1を追加します。
#7.円完成!
6で描いたグラフは、邪魔にならなければそのままでも良いですし、削除しても構いません。もう一度、xとyの値を範囲選択しグラフを描いてみましょう。今度は気になる点の3つ目も解消されたと思います。
プログラムから、データとして揃った座標を出力する場合は、
puts "x,y"
0.step( Math::PI*2, 0.1 ) do |rad|
x = Math.sin( rad )
y = Math.cos( rad )
puts "#{x},#{y}"
end
x = Math.sin( 0 )
y = Math.cos( 0 )
puts "#{x},#{y}"
と、最後の行に最初の値(0)で計算した結果を出力すれば、データの修正は不要です。
今回は、開始を0、終了を2πとして円を描きましたが、開始と終了を好きな値にすることで、円弧を描くこともできます。また、stepメソッドの引数を0.1にしましたが、描く円の大きさによって、頂点の数が多いこと、少ないことも考えられます。その時は、数値を調整してみてください。