課題
![]() |
|
| (a) | (b) |
この図形は上図(b)のように構成されています.
- 半径rの円の中に半径r/2の円を2つ並べて収める
- 半径r/2の円のそれぞれに正三角形を内接させる
- それぞれの正三角形は頂点の一つを半径rの円の円周上に配置する
この課題ではメソッドを定義,利用してプログラムが簡潔になるように工夫してください. 円と正三角形の色および半径rは自由に決めてください. また描画の手順は適宜決めてください.どこからどう描いても構いません.
[OPTION] アレンジバージョン
余裕があれば,次の図(c)の図形を描くようにしてみてください. このアレンジバージョンの作成は必須ではありません.
アレンジバージョンを作成する場合には,まず最初の基本バージョン(上図(b)の構成のもの)を描くプログラムを作成して,そのプログラムをコピーしてください.その後,コピーしたプログラムを変更してアレンジバージョンを作成した上で, 基本バージョンとアレンジバージョンのプログラムの両方を提出してください.
![]() |
![]() |
| (c) | (d) |
このアレンジバージョンでは基本バージョンの図形を次のように変更しています.
- 各図形を縁取りしている
- 正三角形の頂点部分を丸めている
2.では,円に内接する正三角形の頂点部分を丸く切り取るように描画しています(切り取る部分の大きさは適当に定めています).
アレンジバージョンを作るとして,1(縁取り)と2(丸め)の両方ではなく,どちらかだけを実現したものを作っても構いません.
図(d)はアレンジバージョンの図形を並べて作成しています. アレンジバージョンの図形の描画手順をうまく記述すれば, 図(d)も簡単に描けるはずです.
プログラムテンプレート
次に示すプログラムのテンプレート(雛型)を使ってください. このプログラムは名前を適宜変えた上で保存して利用してください.
サンプルプログラム
メソッドを用いたサンプルプログラムを用意しています(サンプルコード>メソッド).
これらをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.
Tips
以下,課題に取り組むにあたって,知っておくとよさそうなtips(hint)を示します.
- markとback
- 「mark」すると,その時点での亀の位置と向きが記憶されます. 亀が自分の目印になるものを配置するイメージです.
- 後で「back」すると,「mark」した場所と向きに戻ります.そのとき線を描画します. 線を描かずに戻るには「hover」と組み合わせます. 「back」すると「mark」はなくなります. 配置した目印を回収するイメージです.
- 「mark」は2つ以上設置できます.2つ以上markされている状態で「back」すると, その時点で最後に設置したmarkに戻ります. backするたびに設置したときと逆順でmarkをたどって戻っていくことになります(回収したmarkはなくなることに注意してください).
s = 100 mark() # マーク1 forward(s); turn(90); forward(s) # 「;」で区切れば1行に複数の式を並べられる mark() # マーク2 turn(30); forward(s); turn(120); forward(s) mark() # マーク3 turn(-120); forward(s); turn(120); forward(s) back() # 線を描きつつマーク3に戻る(マーク3を回収する) back() # 線を描きつつマーク2に戻る(マーク2を回収する) hover { back() } # 線を描かずにマーク1に戻る(マーク1を回収する)
- 描画色・線幅の取得と再利用
以下のようにcolor,weightメソッドによって,現在の描画色,線幅を取得できます. また取得した色,幅はset_color,set_weightでそれぞれ利用できます.c = color() # 現在の描画色を取得してcとする w = weight() # 現在の線幅を取得してwとする set_color(255,0,0) # 描画色を赤に設定する set_weight(3) # 線幅を3に設定する forward(100) set_color(c) # 描画色をcに戻す set_weight(w) # 線幅をwに戻す forward(100)
- 数学関数,定数
数学で使われる関数や定数はRubyでは「Math.関数名(パラメタ)」,「Math::定数名」のように記述して使います.sin x Math.sin(x) cos x Math.cos(x) tan x Math.tan(x) xの平方根 Math.sqrt(x) ex Math.exp(x) log x Math.log(x) π Math::PI
三角関数のパラメタはラジアンで与えます. 円周率の定義「Math::PI」の「PI」は大文字のアルファベットです. - タートルグラフィクスでの三角関数
利便性のため,「タートルグラフィクス」の動作の記述においては,次のようにして,「度」(degree)をパラメタに指定する三角関数(sin,cos,tan)が利用できるようになっています.class Turtle def draw d = 100 theta = 45 move(d*cos(theta),d*sin(theta)) # キャンバスのx軸正の方向から左回りでtheta度の方向へd進む end endMath.cos(x),Math.sin(x),Math.tan(x)のパラメタは弧度(radian)ですので注意してください. - 同じ計算式を何度も書くのは避ける→変数を適切に活用する
- 変数に代入すればデータを再利用できる
- 変数で記述→プログラムが短くなる
- 何度も計算→計算処理のコストがかかる
- 数値リテラル(数字列)で辻褄合わせするのは避ける→変数を適切に活用する
- 変数の値を変えると辻褄が合わなくなる
- プログラムに汎用性がなくなる
- 数値リテラルはデータの意味が分かりにくい
- 関係性のあるデータは変数の関係式から導出する
- プログラムには適切にインデントを付ける(半角の空白で字下げする)
- プログラムの構造をインデントで視覚的に示す
→構造が見えやすくなって,間違いも見つけやすくなる - Emacsの場合,自動的にインデントが付けられる
インデントがおかしくなった?→上から順に各行で[TAB]
(手動でインデントを付けるのは避ける)
- プログラムの構造をインデントで視覚的に示す



日置尋久(HIOKI Hirohisa)
Last modified: Mon Oct 27 11:18:40 JST 2025