建築でコンピュータ、する?
2025年1月22日(水) 17:52 JST
#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; }