2006後期
情報グラフィックス論U
担当 鳥海有紀
授業資料 情報グラフィックス論U
戻る(プログラムを書く3)

補足

gclear()を使わないアニメーション

絵を描き、描いた絵を消して、少し違う次の絵を描く、描いた絵を消して・・の 繰り返しでアニメーションを作る。
絵を消すには画面全体を消すgclear()がよいが、この方法だと動かす必要のない絵も消してしまう。 動かす部分が少ししかない場合は、背景色で描きなおすと消したことと同じになる。 次の2つのサンプルは、同じアニメーションだが、gclear()を使った場合と使わない場合の2つの方法を使っている。

gclear()を使った場合


#include <stdio.h>
#include <math.h>

void tree(int x, int y, int length, int degree)
/*            x : 木の幹が始まる座標のx
              y : 木の幹が始まる座標のy
              length : 最初の木の幹の長さ
              degree : 最初の木の伸びていく方向   */
{
    int ex, ey;

    /* 長さが短くなったら終了する */
    if (length < 5) {
        return;
    }
    /* それ以外、木の幹を描いて次の木を描く呼び出しをする */
    else {
        /* 幹の始点は引数の値、終点は角度と長さから計算する */
        ex = x + length * cos(3.1415 / 180 * degree);
        ey = y + length * sin(3.1415 / 180 * degree);
        gline(x, y, ex, ey, 255, 255, 255);
 
        /* 右側の幹を描くための呼び出し */
        tree(ex, ey, length / 10 * 7, degree+30);
        /* 左側の幹を描くための呼び出し */
        tree(ex, ey, length / 10 * 7, degree-30);
    }
}

int main(void)
{
    int  i;
    int  x1, x2, x3, x4;
    int  y1, y2, y3, y4;
    int  dum;   /*  待ち時間のための変数  */
    int  j;     /*  待ち時間のためのカウンタ */

    gopen(200, 200);
    for (i=0; i < 130; i++) {
        gclear();

        tree(100, 0, 50, 90);

        y1 = 180 - i;
        if (0 == (i % 2))  x1 = 20 - 1;
        else               x1 = 20 + 1; 
        gline(x1 + 10, y1 +  5, x1 + 10, y1 + 15, 255, 255, 255);
        gline(x1 +  6, y1 +  6, x1 + 14, y1 + 14, 255, 255, 255);
        gline(x1 +  6, y1 + 14, x1 + 14, y1 +  6, 255, 255, 255);
        
        y2 = 150 - i;
        if (0 == (i % 2))  x2 = 150 + 2;
        else               x2 = 150 - 1; 
        gline(x2 + 10, y2 +  5, x2 + 10, y2 + 15, 255, 255, 255);
        gline(x2 +  6, y2 +  6, x2 + 14, y2 + 14, 255, 255, 255);
        gline(x2 +  6, y2 + 14, x2 + 14, y2 +  6, 255, 255, 255);

        /*  待ち時間 */
        for (j = 0; j < 20000; j++)
            dum = cos(j);
    }
    gclose();

    return 0;
}

tree()はフラクタルを使った描画方法である。 フラクタルとは自己相似図形のことでコンピュータグラフィックで自然を表現する場合などによく使われる手法である。

s9.c

gclear()を使わない場合



/*     略   */

int main(void)
{
    int  i;
    int  x1, x2, x3, x4;
    int  y1, y2, y3, y4;
    int  dum;   /*  待ち時間のための変数  */
    int  j;     /*  待ち時間のためのカウンタ */

    gopen(200, 200);

    tree(100, 0, 50, 90); /*  木を描く これは動かないのでループの外 */

    for (i=0; i < 130; i++) {

        /*  描く */
        y1 = 180 - i;
        if (0 == (i % 2))  x1 = 20 - 1;
        else               x1 = 20 + 1; 
        gline(x1 + 10, y1 +  5, x1 + 10, y1 + 15, 255, 255, 255);
        gline(x1 +  6, y1 +  6, x1 + 14, y1 + 14, 255, 255, 255);
        gline(x1 +  6, y1 + 14, x1 + 14, y1 +  6, 255, 255, 255);
        
        y2 = 150 - i;
        if (0 == (i % 2))  x2 = 150 + 2;
        else               x2 = 150 - 1; 
        gline(x2 + 10, y2 +  5, x2 + 10, y2 + 15, 255, 255, 255);
        gline(x2 +  6, y2 +  6, x2 + 14, y2 + 14, 255, 255, 255);
        gline(x2 +  6, y2 + 14, x2 + 14, y2 +  6, 255, 255, 255);

        /*  待ち時間 */
        for (j = 0; j < 20000; j++)
            dum = cos(j);

        /*  消す */
        y1 = 180 - i;
        if (0 == (i % 2))   x1 = 20 - 1;
        else                x1 = 20 + 1; 
        gline(x1 + 10, y1 +  5, x1 + 10, y1 + 15, 0, 0, 0);
        gline(x1 +  6, y1 +  6, x1 + 14, y1 + 14, 0, 0, 0);
        gline(x1 +  6, y1 + 14, x1 + 14, y1 +  6, 0, 0, 0);
        
        y2 = 150 - i;
        if (0 == (i % 2))   x2 = 150 + 2;
        else                x2 = 150 - 1; 
        gline(x2 + 10, y2 +  5, x2 + 10, y2 + 15, 0, 0, 0);
        gline(x2 +  6, y2 +  6, x2 + 14, y2 + 14, 0, 0, 0);
        gline(x2 +  6, y2 + 14, x2 + 14, y2 +  6, 0, 0, 0);
    }
    gclose();

    return 0;
}

s10.c

トップへ


授業資料 情報グラフィックス論U 戻る(プログラムを書く3) ForPrint

Copyright 2002-2006 Yuki Toriumi