シミュレータで学ぶC言語[繰り返し]

ピラミッド:ホームワークの答え

ピラミッド:ホームワーク6の答え

C言語の繰り返しにはfor文, while文,do while文がありましたね.ここではfor文を使い,図のようなピラミッドを作ってみましょう.
まず、球と直方体の表示方法を学びます。

球の表示方法

#include "dm.h"
#include "stdio.h"

double x = 0.0, y = 0.0, z = 1.0; // 重心位置 [m]
double r = 0.2;                   // 半径 [m]

void command(int cmd)
{
    switch (cmd) {
        case 'z':   z += 0.1;  break; // zキーを押すと zの値が0.1ずつ増加する
        default:     printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ ***/
{
    dmDrawSphere(x,y-1,z,r); // 球の描画
}

int main()         /*** main関数 ***/
{
    dmInit();   // ODEの初期化
    dmLoop(800, 600, simLoop, command);  // シミュレーションループ ウインドウの幅,高
    dmClose();  // ODEの終了
    return 0;
}

 

main()関数のdmInit()はシミュレータの初期化です。dmLoop()がシミュレーションで繰り返し実行される関数です。この関数は引数を4つとり、1、2番目はウインドウの横、縦のサイズ[ピクセル]、3番目はdmLoopの中で使用するsimLoop関数、4番目はキーボード処理に使用するcommand関数です。関数も関数の引数になることができます。ちなみに、関数名はその関数のメモリ上でのアドレスとなります。dmClose()でシミュレータの終了処理をします。

simLoop関数はこのソースコードではわかりませんが、whileループの中に入っており、シミュレーションループ毎呼び出されます。 dmDrawSphere(x,y-1,z,r)が球を描画する関数です。引数は、4つあり、始めの3つは重心の位置x, y, z座標成分、最後は球の半径となっています。

command関数はキーの入力処理をしています。zキーが押される度に、zの値が0.1ずつ増加します。これは球のz座標なので押す度に球が上昇します。プログラムを事項して確認してください。

  • 演習1
    • このプログラム week6-1.zipをc:\ode-0.11.1\myprogにダウンロード、解凍、ビルドして実行してください。
    • 直方体を(0, -1, 1)の位置に表示させるプログラムを書きなさい。なお、直方体を表示させる関数は次です。
      • dmDrawBox(double x,  double y, double z,  double sx, double sy, double sz);
      • ここで、x, y ,zは重心の位置、sx, sy, szは直方体の各軸成分の長さ。

// 直方体を一列に並べるプログラム
#include "dm.h"
#include "stdio.h"

double x = 0.0, y = 0.0, z = 0.05;   // 位置(x,y,z)[m]
double sx = 0.1, sy = 0.1, sz = 0.1; // 直方体のサイズ(x, y, z)[m]

void simLoop(int pause)        /***  シミュレーションループ ***/
{
    int i, num = 11;             // 直方体の数
    dsSetColor(1.0, 0.0, 0.0);   // 赤色の設定(赤,緑,青)
    for (i = 0; i < num; i++)
    {
        y = i * 0.2;          // 直方体重心のy軸成分
        dmDrawBox(x,y,z,sx,sy,sz); // 直方体の表示         
    }
}

11行目のdsSetColor()は色を設定する関数です.引数は光の3原色の値を3個取り,1番目は赤,2番目は緑,3番目は青成分で0以上1以下の値となります.ちなみに,全部0だと黒,全部1.0だと白です.
12から16行目がfor文です.繰り返し回数はnum回,ここでは10行目でnumが11になっているので,11回ループが回ることになります.14行目でループ毎に直方体のy軸成分の位置を変化させています。ここで、x座標は地面の中央マーカーから赤マーカーの方向,y座標は中央マーカーから青マーカーの方向,z座標は中央マーカーから上空方向になります.
15行目は直方体の描画です.

これで今回は終わりです.タスクは少しハードです。難しいものもあるので必ずしも全部やる必要はありません.

演習2: week6-2.zipをダウンロードして実行しよう.

タスク6

  1. 赤い直方体(この例では立方体)の色を青に変えよう.
    • dsSetColor(float r, float g, float b)
      r, g, bは光の3原色の赤、緑、青成分。値は0以上1以下のfloat型。例えば、緑にしたかったらrとbは0.0、gには1.0を代入する。
  2. 赤い直方体の位置を左にずらし,中央の直方体が原点に来るようにしましょう.
  3. 上の問題で,一番左にある直方体の色を白にし、それから右(y軸正方向)へ向かうにつれ徐々に赤に変化させよう.
  4. forループを2重にし,x軸方向にも直方体を描画し,合計121個の直方体を表示しよう.
  5. forループを3重にし、z軸方向(上空方向)にも直方体を10段(合計11段)描画し、大きな立方体を表示しよう。
  6. forループを3重にし,z軸方向にも直方体を描画し,直方体の間隔も調整して上図のようなピラミッドを作ろう.
  7. 白い直方体(サイズは上の直方体と同じ)を半径2mの円周上に6度ずつ60個並べよ。
  8. 上を時計と考えて、シミュレーションのループが進むたびに、白い直方体が一つだけ時計周りに順番に変化するプログラムを作りなさい。
  9. らせん階段状に直方体(サイズは任意)を100個並べなさい
  10. 100段のトランプタワーを作りなさい。直方体のサイズは実際のトランプと同じにすること。
    • ヒント:week6-3.zipのソースコードを読み実行する。

 

でむ

コメントを残す

メールアドレスが公開されることはありません。