情報基礎A 「Cプログラミング」総合演習・図形の描画
ひととおりの操作が飲み込めたら、亀場のマニュアルや サンプルプログラム集にも目を通すと、課題の解決に向けてのヒントが得られるかもしれない。
準備
まず、以下の準備を行なっておく:
- TurtleEditの「実行」メニューの中から「設定」を選び、「亀場を自動起動」にチェックを入れておく。
- turtle.hをダウンロードして、プログラミング作業用のフォルダに保存・移動する。
TurtleEditと亀場使い方についてはこちらのページも併せて参照のこと。
動作の確認
ダウンロードと解凍が完了したら、以下の手順で、動作確認を行う:
まず、亀場の解説の、タートルグラフィックスとは、と、 亀場の様子についての記述を読んでおく。
次いで、ステップ1:C言語でプログラムを作成するを参照して、掲載されているサンプルプログラムをエディタのコピーし、ファイルに保存する(square.c)。保存先のフォルダーに、先ほどダウンロードした turtle.h があることを確認する。
もう少し複雑なサンプルプログラムの例も用意されているので、こちらのページの中からひとつふたつ試してみてもよい。
ステップ1:C言語でプログラムを作成するの例題プログラムを実際に走らせ、亀場に赤い四角形が表示されることを確認する。
Cの関数を使って、図形を部品化する
亀場で練習:基本図形の描画を関数にまとめる
以下は、亀場に1辺の長さが100の六角形を描くプログラムの例である。
#include <stdio.h> #include <math.h> #include "turtle.h" main() { int n ; CON("localhost") ; /* 亀場と接続 */ CLR() ; /* 画面をクリア */ RST() ; /* 亀を中央・右向きにリセット */ PD() ; /* ペンを下ろす */ for (n=0; n<6; n=n+1) { FD(100) ; /* 100前進 */ LT(60) ; /* 左に60度回転 */ } PU() ; /* ペンを上げる */ }
このプログラムを発展させて、一辺の長さが s の6角形を座標 (x,y) を出発点にして描く関数 hexagon(float x, float y, float s)
を設計し、動作を確認せよ。以下をひな形とするとよい:
#include <stdio.h> #include <math.h> #include "turtle.h" void hexagon(float x, float y, float s) { ????? } main() { int n ; CON("localhost") ; CLR() ; hexagon(0,0,50) ; /* 関数の呼び出し */ }
ヒント
亀を座標(x,y)に移動させるには、関数 JUMP(x,y);
を呼び出せばよい。
また、亀の方向を右向き(角度0)にリセットするために EAST();
関数が使える。
亀場で練習:六角形がいっぱい
上記プログラムをさらに手直しして、下図のように、六角形を縦横に並べて描画しなさい。
ヒント:塗りつぶし
関数定義のところを
void hexagon(float x, float y, float s) { int n ; JUMP(x,y) ; EAST() ; FILL() ; /* <== この行を追加 */ PD() ; .... }
と変更すると、四角形の領域が塗りつぶされる。
スクリーンショットの撮り(取り)方
課題では、プログラム(何々.c)に加えて、亀場のスクリーンショットの提出が求められる。スクリーンショットを取る方法は以下のとおり:
- 亀場に図形などが表示されている状態で、亀場のウィンドウのどこかをクリックして、前面に出す
- その状態でキーボードの p キーを押す
- ホームディレクトリ(デスクトップではない)に tfield-capture-xxxxx.png という画像ファイルが作成されているので、適宜、名前を変更する
図形の位置をさらに緻密に制御する
まず、タートルグラフィックスの解説のページの「亀で描く基本的な図形」の「正N角形」の解説をよく読んでおく。
上記の解説に書かれているとおり、正三角形の場合、半径200の円に内接する正三角形の辺の長さ$s$は
$$
s = 2 \times 200 \sin\left( \frac{2 \pi}{2 \times 3} \right) = 2 \times 200 \sin\left( \frac{\pi}{3} \right)
$$
である。これをCプログラム風に書けば s = 2*200*sin(M_PI/3) ;
となる。
原点を中心とした半径200の円に内接する正三角形を描くには、まず、ひとつ目の頂点に移動しておく必要がある。そのためには
JUMP(0,0); /* 原点に移動する */ EAST() ; /* 右横方向に向きを整える */ FD(200) ; /* 200前進する */
すれば良い。
その後、「しかるべき」角度だけ左回転した後、ペンを下ろし、
FD(s) ; /* sだけ前進 */ LT(360.0/3) ; /* 120°左回転 */
を三回繰り返せば、所望の三角形が描けるはずだ(下図を参照)。
N角形の内角の和は $180 (N-2)$°
正N角形のひとつの頂点の内角は$180(N-2)/N$
ここまでの流れをプログラムにまとめると、以下のようになる:
#include <math.h> #include <stdio.h> #include "turtle.h" main() { int i ; float s ; CON("localhost") ; CLR() ; JUMP(0,0) ; EAST() ; FD(200) ; LT(ある角度); /* <=== ここを考える */ s = 2*200*sin(M_PI/3) ; PD() ; for (i=0; i<3 ; i=i+1) { FD(s) ; LT(360.0/3) ; } PU() ; }
亀場で練習:円に内接する正三角形および正N角形
上記プログラムの「ある角度」の箇所を適切に設定し、動作を確認しなさい。
うまく動いたら、さらに、線の色や太さなども調整してみなさい。
この例では「右向き」の頂点から描画を始めているが、それを「上向き」からに変更してみなさい。
正N角形のNを表す変数を用意し、その変数の値(3,4,5...)に応じてN角形が描けるように拡張しなさい。