課題
ここでは,(タートルグラフィクスではなく)一般的な言葉の使い方として「消しゴムをかける」という表現を, 消しゴムを利用して紙面に書かれた線などを消すことの意味で用います.
さてこの課題では,白色を使って線を描くか領域を塗りつぶすことで「消しゴムをかける」機能を実現することにします. どこに消しゴムをかけるかは,メソッドにブロックを与えてブロック内で定めることにします. つまりブロックでの指示にしたがって消しゴムをかけるわけです.
消しゴムメソッドは,以下で示す仕様にしたがって定義してください. また描画する絵は,消しゴムを利用するという条件で自由に決めてください.
消しゴムメソッドの仕様
消しゴムメソッドは次の仕様を満たすように定義してください.
- 消しゴムをかける方法を次の2通りから選べるようにする
- 指定された線幅に従ってブロック内で亀が通った跡を消す
この場合,消しゴムメソッドに引数として線幅を渡すことを想定しています.w = 5 d = 100 # 幅wでブロック内で亀が通った跡を消す # (メソッド名をeraseとしています.また「:trace」で消し方を指定しています) erase(:trace,w) { forward(d) } - ブロック内で亀が囲んだ領域に消しゴムをかける
この場合,fillを利用することを想定しています. fillの内部では線幅は自動的に「1」に設定されます. またfillが終わると線幅はfillの直前の値に自動的に戻ります. fillで囲う領域の境界線を描く線の幅を気にする必要はありません.d = 100 # 正方形(1辺=d)の領域に消しゴムをかける # (メソッド名をeraseとしています.また「:region」で消し方を指定しています) erase(:region) do 4.times do forward(d) turn(90) end end
- 指定された線幅に従ってブロック内で亀が通った跡を消す
-
消しゴムをかける前後で描画色と線幅を保つようにする
つまり消しゴムメソッドを使った後に,消しゴムを使う直前の描画色と線幅に戻るようにします.set_color(0,32,91) # 描画色=京都大学のスクールカラー set_weight(2) # 線幅=2 # これ以降では描画色,線幅は変更していないとする : : d = 100 # 線幅=6で亀が通った跡に消しゴムをかける erase(:trace,6) do forward(2*d) turn(90) forward(2*d) end # 正方形(1辺=d)の領域に消しゴムをかける erase(:region) do 4.times do forward(d) turn(90) end end # 描画色=京都大学のスクールカラー # 線幅=2 forward(d)
- hover/fillとの組み合わせの併用は考えない
hoverまたはfillの中で消しゴムをかけること,消しゴムをかけているときにhoverまたはfillを実行することは考えないものとする.
消しゴムメソッドの名称は自由に決めてください. また上の仕様を満たす限り,引数の設定方法も自由に決めてください. なお上に示した例では「:trace」の場合と「:region」の場合とで引数の個数が一致していません. このような引数の指定を可能とするメソッド定義の方法については, 以下で説明します.
消しゴムの利用例
参考までに,消しゴムも利用して描いた絵の例を示します. 正三角形を描いてから対称軸の部分と中心の円形領域に消しゴムを適用しています. 正三角形の対称軸については線幅を指定して消しゴムをかけて, 中心の円形領域は円を描くことで内部に消しゴムをかけています.
これは一例に過ぎません.同じ絵にする必要はありません. 上で説明したとおり,消しゴムを利用するという条件で,描画する絵は自由に決めてください.
プログラムテンプレート
次に示すプログラムのテンプレート(雛型)を適宜名前を変えて使ってください.
技術要素
課題に関連する技術要素を示します. 必ずしもすべてを利用しないといけないわけではありません.
- ブロックの使い方
ブロック付きのメソッドにおいて,yield()を実行するとブロックの処理を実行するdef draw set_speed(10) set_color(255,0,0) s = 100 tour { forward(s); turn(120); forward(s); } end # tour: 与えられたブロックにmark...backを付加して実行するメソッド def tour # ブロックがなければ直ちに終了(unless == if not) return unless block_given? mark() # 開始位置を記憶 yield() # ブロックの処理を実行 back() # 開始位置に戻る(線を描く) end - 現在の描画色の取得:color
colorメソッドで描画色データを取得できる. 取得したデータはset_colorに適用できる.c = color() # 現在の描画色を取得する set_color(c) # 描画色をcに設定する
- 現在の線の太さの取得:weight
weightメソッドで線の太さの値を取得できる.w = weight() # 現在の線の太さを取得する set_weight(w) # 線の太さをwに設定する
- set_colorへの配列の適用
set_colorメソッドには配列(3要素)を引数として指定できるred = [255,0,0] set_color(red) # 描画色をredに設定する - メソッドの引数のデフォルト値の指定
メソッドの定義において,引数の値を予め指定しておくことができる. その場合,メソッドを呼び出したときにその引数が与えられなかった場合, 予め指定したおいた値(デフォルト値)が使われる.def power(x,n=2) # nのデフォルト値=2 x**n # xのn乗 end def powmod(x,y=3,z=4) # yのデフォルト値=3,zのデフォルト値=4 (x**y) % z end def eqnil?(a=nil) # aのデフォルト値=nil a == nil end power(2,3) # ==> 8 (x=2,n=3) power(4) # ==> 16 (x=4,n=2) powmod(3,5,7) # ==> 5 (x=3,y=5,z=7) powmod(3,5) # ==> 3 (x=3,y=5,z=4) powmod(5) # ==> 1 (x=5,y=3,z=4) eqnil?() # ==> true (a=nil) eqnil?(true) # ==> false (a=true)
上の例でも示しているように, デフォルト値を指定しない引数とデフォルト値を指定する引数を同時に利用できます. ただし引数の並べ方に制限があります. まずデフォルト値を指定しない引数をすべて並べた後に, デフォルト値を指定する引数を並べるようにしておけば問題ありません.
サンプルプログラム
次のページにサンプルプログラムを示します. プログラムをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.
日置尋久(HIOKI Hirohisa)
Last modified: Fri Dec 12 22:15:17 JST 2025