2018年12月13日(木) 09:24 JST

List8-4(新)

#include 	// ファイル入出力のために必要なファイル

class Vert
{
	public:
	double x,y,z;
	Vert(){};
	Vert(double _x,double _y, double _z)
	{
		x = _x;	y = _y; z = _z;
	}
};

Vert InnerDividing(Vert base, Vert another,double rate)
{
	return Vert( base.x + (another.x-base.x)*rate, 
				 base.y + (another.y-base.y)*rate, 
				 base.z + (another.z-base.z)*rate );
}

class Panel
{
public:
	Vert v1,v2,v3,v4;		//頂点
	unsigned int generation;//世代数

	Panel(){}
	Panel(const Vert &_v1,const Vert &_v2,const Vert &_v3,const Vert &_v4,const unsigned int &_generation)
	{
		v1 = _v1;	v2 = _v2;	v3 = _v3;	v4 = _v4;
		generation = _generation - 1;
	}
};

void GDL_PRISM4(FILE *fp,double h, Vert v1, Vert v2, Vert v3,Vert v4)//PLANEコマンドを出力する関数
{
	fprintf( fp, "PRISM 4,%lf,  %lf,%lf,%lf,%lf,%lf,%lf,%lf,%lfn",h,v1.x,v1.y,v2.x,v2.y,v3.x,v3.y,v4.x,v4.y);
}

void DivideWall(FILE *fp, Panel &panel, unsigned int &n_panel)
{	
	if( panel.generation < 1 ){
		GDL_PRISM4(fp, 0.3, panel.v1, panel.v2, panel.v3,panel.v4);	//変更1
		return;
	}

	Vert v[16];
	v[0]  = InnerDividing( panel.v1, panel.v2, 0.0/3.0 );
	v[1]  = InnerDividing( panel.v1, panel.v2, 1.0/3.0 );
	v[2]  = InnerDividing( panel.v1, panel.v2, 2.0/3.0 );
	v[3]  = InnerDividing( panel.v1, panel.v2, 3.0/3.0 );
	v[12] = InnerDividing( panel.v4, panel.v3, 0.0/3.0 );
	v[13] = InnerDividing( panel.v4, panel.v3, 1.0/3.0 );
	v[14] = InnerDividing( panel.v4, panel.v3, 2.0/3.0 );
	v[15] = InnerDividing( panel.v4, panel.v3, 3.0/3.0 );

	v[4]  = InnerDividing( v[0], v[12], 1.0/3.0 );
	v[5]  = InnerDividing( v[1], v[13], 1.0/3.0 );
	v[6]  = InnerDividing( v[2], v[14], 1.0/3.0 );
	v[7]  = InnerDividing( v[3], v[15], 1.0/3.0 );

	v[8]  = InnerDividing( v[0], v[12], 2.0/3.0 );
	v[9]  = InnerDividing( v[1], v[13], 2.0/3.0 );
	v[10] = InnerDividing( v[2], v[14], 2.0/3.0 );
	v[11] = InnerDividing( v[3], v[15], 2.0/3.0 );

	for(unsigned int i = 0 ; i < 12 ; i++ )
	{
		if( i%4 == 3  || i == 5 ) continue;
		Panel new_panel(v[i], v[i+1], v[i+5], v[i+4] ,panel.generation);	//変更2
		n_panel++;
		printf("%d,gen %dn" ,n_panel, panel.generation);
		DivideWall(fp, new_panel,n_panel);
	}
}

void main()
{
	char filename[128] = "fractal_wall.txt";	//出力ファイル名
	double panel_t = 0.3;
	unsigned int n_panel = 0;
	unsigned times = 5;	//変更3

	Panel panel( Vert( 0.0, 0.0, 0.0), 
					   Vert(10.0, 0.0, 0.0),
					   Vert(10.0,10.0, 0.0),
					   Vert( 0.0,10.0, 0.0), times);					
	n_panel++;
	FILE* fp;
	fopen_s(&fp, filename,"w");
	if(	fp == NULL )//うまくファイルを開けなかったら、ここでプログラムを終了する。
	{	
		printf("can't open "%s"",filename);
		return;
	}

	DivideWall(fp, panel, n_panel);

	fclose(fp);

	return;
}

最終更新日:: 2015年5月19日(火) 23:35 JST|表示回数: 590 印刷用ページ


Twitter ・ Facebook

Twitter 平沢研究室アカウント FaceBook 平沢研究室ページ

アクセスカウンタ

7,413,467