課題
以下の説明にしたがって,タートルグラフィクスで,指定されたパラメトリック平面曲線を描くメソッドを作成し,同じファイルの中でそのメソッドを使って適当な曲線を描くプログラムを作成して,プログラムを提出してください.
もくじ
パラメトリック平面曲線
パラメトリック平面曲線は, パラメタの値を定めるとそれに対する曲線上の点が1点決まるように表現されます. たとえばtをパラメタとしてp(t)を次のように定義すると,原点中心の楕円が表現できます(a≧b>0).
p(t) = (x(t),y(t))
x(t) = a・cos(t)
y(t) = b・sin(t)
p(t) = (x(t),y(t))がパラメタの値がtのときの楕円上の点の位置を表しています.
注意:: ここでは数学での式として記述しています.プログラムでは上のようには表記できません
曲線描画メソッドの仕様
曲線描画メソッドは,次の3つをデータとして受け取るものとします.
- 曲線を表すデータ(Procあるいはブロック)
- 描画対象とするパラメタの区間
- 描画の精度を表す数(区間の分割数)
具体的には次の[1],[2]のどちらかの形式で定義することにします(どちらか一方で構いません). ここではメソッド名をcurveとしています.
# [1] 曲線をProcで予め定義して,メソッドの引数として指定する # a,bは別途定義してあるものとする f = proc { |t| [a*Math.cos(t),b*Math.sin(t)] } curve(f,t0,t1,m) # [2] 曲線をブロックで指定する # a,bは別途定義してあるものとする curve(t0,t1,m) { |t| [a*Math.cos(t),b*Math.sin(t)] }
引数t0,t1,mの意味は次の通りとします.
| t0 | 曲線の描画開始位置に対応するパラメタの値 |
|---|---|
| t1 | 曲線の描画終了位置に対応するパラメタの値 |
| m | パラメタ区間の分割数 |
dt=(t1-t0)/mとして, パラメタtについて,t0≦t≦t1の区間において,t = t0,t0+dt,t0+2dt,...に対応する曲線上の点を線分で順につないでいくことで近似的に曲線を描くことにします.
なおt=t0のときの曲線上の点(P0とします)の位置と,曲線描画メソッドを呼び出したときの亀の位置が異なっている場合には,曲線描画メソッドにおいて, 点P0まで線を描かずに移動してから,曲線の描画を開始することにします.
曲線の描き方に関する補足(座標系の設定)
亀の向きに関わらずキャンバスの座標軸をx軸,y軸として キャンバスの左下角を原点として曲線を描けばよいことにします.
亀の向きを基準として座標軸をとって,原点は描画開始時の亀の位置として描いてもよいでしょう.
プログラムテンプレート
次に示すプログラムのテンプレート(雛型)を適宜名前を変えて使ってください.
Tips
- ブロックの使い方
- yield式の引数でブロックにデータを渡す(ブロック変数に値を代入する)
- yield式の値=ブロックで最後に評価した式の値
def sum_up_with_block(ary) return 0 unless block_given? s = 0 ary.each do |a| # ブロックにaを渡して,ブロックでの処理の結果をyとして受け取る y = yield(a) s += y end s end a = Array.new(4) { |i| i+1 } # a == [1,2,3,4] b = sum_up_with_block(a) { |x| x*x } # b == 12 + 22 + 32 + 42 == 30 - Procの使い方
- callメソッドでProcの処理を行って結果を受け取る
def sum_up_with_proc(ary,f) s = 0 ary.each do |a| # Proc fに引数aを渡して処理した結果をyとして受け取る y = f.call(a) s += y end s end a = Array.new(4) { |i| i+1 } # a == [1,2,3,4] f = proc { |x| x*x } b = sum_up_with_proc(a,f) # b == 12 + 22 + 32 + 42 == 30
サンプルプログラム
次のページにサンプルプログラムを示します. プログラムをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.
日置尋久(HIOKI Hirohisa)
Last modified: Fri Dec 12 22:16:14 JST 2025