情報基礎A 「Cプログラミング」総合演習・図形の描画

ひととおりの操作が飲み込めたら、亀場のマニュアルサンプルプログラム集にも目を通すと、課題の解決に向けてのヒントが得られるかもしれない。

準備

まず、以下の準備を行なっておく:

  1. TurtleEditの「実行」メニューの中から「設定」を選び、「亀場を自動起動」にチェックを入れておく。
  2. turtle.hをダウンロードして、プログラミング作業用のフォルダに保存・移動する。

TurtleEditと亀場使い方についてはこちらのページも併せて参照のこと。

動作の確認

ダウンロードと解凍が完了したら、以下の手順で、動作確認を行う:

まず、亀場の解説の、タートルグラフィックスとは、と、 亀場の様子についての記述を読んでおく。

次いで、ステップ1:C言語でプログラムを作成するを参照して、掲載されているサンプルプログラムをエディタのコピーし、ファイルに保存する(square.c)。保存先のフォルダーに、先ほどダウンロードした turtle.h があることを確認する。

もう少し複雑なサンプルプログラムの例も用意されているので、こちらのページの中からひとつふたつ試してみてもよい。

ステップ1:C言語でプログラムを作成するの例題プログラムを実際に走らせ、亀場に赤い四角形が表示されることを確認する。


Cの関数を使って、図形を部品化する

tfield-icon亀場で練習:基本図形の描画を関数にまとめる

以下は、亀場に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) ; /* 関数の呼び出し */
 }
icon-hint ヒント

亀を座標(x,y)に移動させるには、関数 JUMP(x,y); を呼び出せばよい。 また、亀の方向を右向き(角度0)にリセットするために EAST(); 関数が使える。

tfield-icon亀場で練習:六角形がいっぱい

上記プログラムをさらに手直しして、下図のように、六角形を縦横に並べて描画しなさい。

tfield-capture-hexagon-array
icon-hint ヒント:塗りつぶし

関数定義のところを

void hexagon(float x, float y, float s) 
{
  int n ;     
  JUMP(x,y) ; 
  EAST() ;    
  FILL() ;  /* <== この行を追加 */
  PD() ;   
  ....
}             

と変更すると、四角形の領域が塗りつぶされる。

tfield-capture-filled-hexagon-array

icon-teacher スクリーンショットの撮り(取り)方

課題では、プログラム(何々.c)に加えて、亀場のスクリーンショットの提出が求められる。スクリーンショットを取る方法は以下のとおり:

  1. 亀場に図形などが表示されている状態で、亀場のウィンドウのどこかをクリックして、前面に出す
  2. その状態でキーボードの p キーを押す
  3. ホームディレクトリ(デスクトップではない)に 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$

tfield-triangle

ここまでの流れをプログラムにまとめると、以下のようになる:

#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() ;
}

tfield-icon亀場で練習:円に内接する正三角形および正N角形

上記プログラムの「ある角度」の箇所を適切に設定し、動作を確認しなさい。

うまく動いたら、さらに、線の色や太さなども調整してみなさい。

この例では「右向き」の頂点から描画を始めているが、それを「上向き」からに変更してみなさい。

正N角形のNを表す変数を用意し、その変数の値(3,4,5...)に応じてN角形が描けるように拡張しなさい。