C言語で使える3次元動画関数(クリスマスツリーの表示)




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



・道を山に向かって進み、道ばたの家に煙突からはいるとクリスマスツリーが回転します。
・このコーナーのプログラムはLogomotion作者の佐藤氏作または東京女子大マイコンサークルMOVEの皆さんのによって作成(オリジナルはLOGO言語で作成)されたものをC言語に書き換えたものです。
・Logomotionなどに関する詳細は3Dタートル美術館を参照してください。

山に向かって道を進む 煙突から家へ入る クリスマスツリーが回転

void	cube(double x, double y, double z);
void	house(void);
void	tree(void);
void	road(void);
void	star(void);
void	drive(void);
void	tree2(double x, int l);
void	penta(void);
void	chain(void);
void	kazari(void);
void	rolltree(void);
void	treeroll(void);


void	main()
{
	tg_openwin(640, 400);
	tg_init();
	tg_manual();
	star();
	house();
	road();
	drive();
	tg_init();
	rolltree();
	treeroll();
}

void	cube(double x, double y, double z)
{
	tg_save();
	tg_pd(); tg_fd(y); tg_mr(x); tg_bk(y); tg_mu(z);
	tg_fd(y); tg_ml(x); tg_bk(y); tg_md(z); tg_mr(x);
	tg_pu(); tg_fd(y); tg_pd(); tg_mu(z);
	tg_pu(); tg_ml(x); tg_pd(); tg_md(z);
	tg_pu(); tg_bk(y); tg_mu(z); tg_pd(); tg_mr(x); tg_pu();
	tg_restore();
}

void	house()
{
	int	i1;

//roof
	tg_setpc(5);
	tg_pu(); tg_home(); tg_rt(45.0);
	cube(200.0, 10.0, 260.0);
	tg_pu(); tg_home(); tg_lt(45 + 180.0);
	cube(200.0, 10.0, 260.0);
//wall
	tg_setpc(10);
	tg_pu(); tg_home(); tg_bk(100.0); tg_ml(100.0); tg_mu(30.0);
	for(i1 = 0; i1 < 4; i1++){tg_pd(); tg_bk(200.0); tg_mr(200.0); tg_pu(); tg_fd(200.0); tg_rl(90.0); }
//entotu
	tg_pu(); tg_home(); tg_bk(100.0); tg_ml(100.0); tg_mu(50.0);
	tg_pd(); tg_fd(100.0); tg_mu(30.0); tg_bk(100.0);
	tg_pu(); tg_fd(100.0); tg_pd(); tg_mr(30.0); tg_bk(70.0);
	tg_pu(); tg_fd(70.0); tg_pd(); tg_md(30.0); tg_bk(70.0);
	tg_pu(); tg_fd(70.0); tg_pd(); tg_ml(30.0);
//window
	tg_setpc(6);
	tg_pu(); tg_home(); tg_bk(250.0); tg_mr(100.0); tg_mu(100.0);
	tg_pd(); tg_mu(100.0); tg_fd(100.0); tg_md(100.0); tg_bk(100.0); tg_pu();
}

void	tree()
{
	tg_pu();
	tg_save();
	tg_pd();
	tg_setpc(2);
	tg_fd(100.0);
	tg_setpc(12);
	tg_ml(70.0);
	tg_rt(30.0); tg_fd(140.0);
	tg_rt(120.0); tg_fd(140.0);
	tg_rt(120.0); tg_fd(70.0);
	tg_pu(); 
	tg_restore();
}

void	road()
{
	int	i1;

	tg_setpc(1);
	tg_pu(); tg_home(); tg_mu(5000.0); tg_bk(280.0); tg_mr(500.0);
	tg_save();
	tg_pd();
	for(i1 = 0; i1 < 100; i1++){
		tg_md(100.0);
	}
	tg_restore();
	tg_save();
	tg_pu(); tg_ml(200.0);
	tg_pd();
	for(i1 = 0; i1 < 100; i1++){
		tg_md(100.0);
	}
	tg_restore();
	tg_save();
	tg_pu(); tg_mr(20.0);
	tg_setpc(15);
	for(i1 = 0; i1 < 20; i1++){
		tg_pu(); tg_md(500.0);
		tg_pd(); tg_fd(300.0);
		tg_pu(); tg_bk(300.0);
	}
	tg_restore();
	tg_pu(); tg_ml(250.0); tg_md(300.0);
	for(i1 = 0; i1 < 10; i1++){
		tg_pu(); tg_md(1000.0);
		tree();
	}
}

void	star()
{
	int i, j, i1;

	tg_pu();
	tg_setpc(7);
	tg_home(); tg_md(5000.0); tg_ml(5000.0);
	tg_rt(60.0); tg_pd(); tg_fd(4000.0); tg_rt(90.0);
	tg_fd(1000.0); tg_lt(90.0); tg_fd(2000.0); tg_rt(60.0); tg_fd(4000.0);

//stop

	tg_pu(); tg_setpc(6);
	i = 0;
	j = 0;
	for(i1 = 0; i1 < 100; i1++){
		i = (i * 7 + 13) % 17;
		j = j + 1;
		tg_pu(); tg_home(); tg_mu(5000.0); tg_md(j * 100.0); tg_ml(5000.0); tg_mr(i * 600.0); tg_fd(2000.0);
		tg_pd(); tg_ml(5.0);
	}

} 

void	drive()
{
	int	i1;

	tg_view(); tg_pu(); tg_manual();
	tg_home(); tg_mu(5000.0); tg_mr(400.0); tg_bk(260.0); tg_dn(90.0);
#if 1
	for(i1 = 0; i1 < 220; i1++){
		tg_fd(20.0); tg_refresh();
	}
	for(i1 = 0; i1 < 20; i1++){
		tg_fd(5.0); tg_refresh();
	}
#else
	tg_fd(2 * 20 + 220 * 20.0);
#endif
	for(i1 = 0; i1 < 10; i1++){ tg_lt(5.0); tg_fd(5.0); tg_refresh(); }
	for(i1 = 0; i1 < 10; i1++){ tg_fd(20.0); tg_refresh(); }
	for(i1 = 0; i1 < 10; i1++){tg_up(6.0); tg_refresh(); }
	for(i1 = 0; i1 < 10; i1++){tg_fd(50.0); tg_refresh(); }
	for(i1 = 0; i1 < 10; i1++){tg_up(3.0); tg_fd(10.0); tg_refresh(); }
	tg_home(); tg_fd(500.0); tg_ml(85.0); tg_mu(65.0); tg_refresh();
	for(i1 = 0; i1 < 10; i1++){tg_dn(18.0); tg_refresh(); }
	for(i1 = 0; i1 < 20; i1++){tg_fd(30.0); tg_rr(10.0); tg_refresh(); }
}

void	tree2(double x, int l)
{
	if(l > 1){
		tg_save();
		tg_pd(); tg_fd(x); tg_pu(); tree2(x, l - 1);
		tg_restore();
		tg_rr(120.0);
		tg_save();
		tg_fd(x * 0.3);
		tg_rt(30.0); tg_pd(); tg_fd(x); tg_pu(); tree2(x * 0.7, l - 1);
		tg_restore();
		tg_rr(120.0);
		tg_save();
		tg_fd(x * 0.6);
		tg_rt(30.0); tg_pd(); tg_fd(x); tg_pu(); tree2(x * 0.5, l - 1);
		tg_restore();
		tg_rr(120.0);
		tg_save();
		tg_fd(x * 0.9);
		tg_rt(30.0); tg_pd(); tg_fd(x); tg_pu(); tree2(x * 0.6, l - 1);
		tg_restore();
		tg_rr(120.0);
	}
}

void	penta()
{
	int	i1;

	tg_save();
	tg_setpc(6);
	tg_pd();
	for(i1 = 0; i1 < 5; i1++){ tg_fd(20.0); tg_rt(144.0);}
	tg_restore();
}

void	chain()
{
	int c, i1;

	tg_save();
	tg_dn(100.0);
	c = 0;
	for(i1 = 0; i1 < 20; i1++){
		tg_setpc(c + 1);
		c = (c + 1) % 7;
		tg_pd(); tg_fd(20.0); tg_mr(10.0); tg_bk(20.0); tg_ml(10.0); tg_pu(); tg_fd(20.0); tg_rr(90.0);
		tg_setpc(c + 1);
		c = (c + 1) % 7;
		tg_pd(); tg_fd(20.0); tg_mr(10.0); tg_bk(20.0); tg_ml(10.0); tg_pu(); tg_fd(20.0); tg_rl(90.0);
		tg_up(2.0);
	}
	tg_restore();
}

void	kazari()
{
	int	i1;
	double r;
//kazari

	tg_pu(); tg_home(); tg_fd(200.0);
	r = 100;
	for(i1 = 0; i1 < 10; i1++){
		tg_pu(); tg_fd(20.0);
		tg_rr(36.0); tg_mu(r);
		tg_pd(); penta();
		tg_pu(); tg_md(r);
		r = r - 10;
	}
	tg_pu(); tg_home(); tg_fd(200.0);
	tg_setpc(3);
	for(i1 = 0; i1 < 5; i1++){
		tg_pu(); tg_fd(20.0); tg_rr(50.0); tg_mu(120.0);
		cube(20.0, 20.0, 20.0);
		tg_pu(); tg_md(120.0);
	}
	tg_pu(); tg_home(); tg_fd(200.0);
	tg_setpc(7);
	r = 120;
	for(i1 = 0; i1 < 10; i1++){
		tg_pu(); tg_fd(20.0); tg_rl(35.0); tg_mu(r);
		tg_pd(); tg_ml(50.0); tg_pu(); tg_mr(50.0);
		tg_md(r);
		r = r - 10;
	}
	tg_pu(); tg_home(); tg_fd(400.0);
	for(i1 = 0; i1 < 3; i1++){
		tg_rr(120.0);
		chain();
	}
}

void	rolltree()
{
	int	i1;

	tg_view(); tg_pu(); tg_mu(300.0);
	tg_draw();
//uekibachi
	tg_setpc(10); tg_pu();
	tg_home(); tg_dn(90.0);
	for(i1 = 0; i1 < 36; i1++){
		tg_save();
		tg_pd(); tg_fd(25.0); tg_up(80.0); tg_fd(50.0);
		tg_pu();
		tg_restore();
		tg_rt(10.0);
	}
//tree
	tg_pu(); tg_home();
	tg_setpc(4);
	tg_fd(45.0); tg_pd(); tg_fd(60.0);
	tree2(90.0, 4);

	kazari();
}

void	treeroll()
{
	int	i1;

	tg_view(); tg_pu(); tg_manual();
	tg_fd(800.0);
	for(i1 = 0; i1 < 200; i1++){
		tg_rt(5.0); tg_bk(800.0);
		tg_refresh();
		tg_fd(800.0);
	}
}
> Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
・XMAS(ソースプログラムのダウンロード)

cube関数 直方体を描画します。
house関数 家(外から見た)を描画します。
tree関数 道端の木を秒がします。
road関数 道を描画します
star関数 星(点)を描画します。
drive関数 視点を移動して家の方へ近づきます。
tree2関数 木(TREE)を描きます。tree2関数は再帰的に呼び出されています。再帰的というのはtree2関数内から自分自身(tree2)を再び呼び出しているという使い方です。
penta関数 5角形の星を描画します。
chain関数 木についている鎖を描画します。
kazari関数 木の飾りをchain、penta、cube関数を呼び出して描画していきます。
rolltree関数 クリスマスツリーをtree2、kazari関数呼び出して描いていきます。
treeroll関数   視点を移動してクリスマスツリーを回転させます。

・XMASをコンパイルしたEXEファイルのダウンロード
3DタートルをVisual C++やBorland Cからも使用できるようにするためのライブラリを作成しました(特別C言語講座にアクセス可能な方は、こちらからダウンロードしてください)。 コンパイルしたEXEを上記からダウンロードできます(普通のEXEファイルなのでそのまま実行することができます)。 詳細はダウンロードのページをご覧ください。
[an error occurred while processing this directive]