#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;
}
http://www.hlab-arch.jp/staticpages/index.php/20150519225616829