情報基礎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角形が描けるように拡張しなさい。