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