#include "myWin.h" #include "stdlib.h" #define frand() ((double)rand()/(RAND_MAX+1)) //アンモナイト //double SC=100, XST=500,YST=200; //int NMAX=3; //double A[][2][3]={ {{-0.29, 0, 0.59},{0, 0.2, -0.32}}, // {{-0.07,-0.02,0.79},{-0.01,0.29, -0.06}}, // {{0.94,-0.22,-0.05},{0.21,0.96,0.01}}}; //double rdA[]={0.06, 0.08,1.0}; //double X0=0, Y0=0; //int colorID[]={0x114444,0x224444,0x225555}; //-------------------------------------------------------------------- // シダ double SC=400, XST=200,YST=400; int NMAX=4; double A[][2][3]={ {{ 0.836, 0.044, 0.0},{-0.044, 0.836, 0.169}}, {{-0.141, 0.302, 0.0},{ 0.302, 0.141,0.127}}, {{ 0.141,-0.302, 0.0},{ 0.302, 0.141, 0.169}}, {{ 0.000, 0.0000, 0},{ 0.0, 0.175337, 0.0}}}; double rdA[]={0.73, 0.86, 0.99,1.0}; double X0=1, Y0=1; int colorID[]={0x005500,0x005500,0x005522,0x005522}; //-------------------------------------------------------------------- // ぶどうの葉 //double SC=400, XST=200,YST=400; //int NMAX=4; //double A[][2][3]={ {{ 0.8 , 0.0 , 0.100},{ 0.0 , 0.800, 0.040}}, // {{ 0.5 , 0.0 , 0.250},{ 0.0 , 0.500, 0.400}}, // {{ 0.355, -0.355, 0.266},{ 0.355, 0.355, 0.078}}, // {{ 0.355, 0.355, 0.378},{-0.355, 0.355, 0.434}}}; //double rdA[]={0.5, 0.668, 0.834,1.0}; //double X0=1, Y0=1; //int colorID[]={0x005522,0x005500,0x005522,0x005522}; //-------------------------------------------------------------------- // 立木 /* double SC=200, XST=300,YST=450; int NMAX=6; double A[][2][3]={ {{ 0.05, 0.0 , 0.0},{ 0.0 , 0.6 , 0.0}}, {{ 0.05, 0.0 , 0.0},{ 0.0 ,-0.5 , 1.0}}, {{ 0.46,-0.32, 0.0},{ 0.39, 0.38, 0.6}}, {{ 0.47,-0.15, 0.0},{ 0.17, 0.42, 1.1}}, {{ 0.43, 0.28, 0.0},{-0.25, 0.45, 1.0}}, {{ 0.42, 0.26, 0.0},{-0.35, 0.31, 0.7}}}; double rdA[]={0.1, 0.3, 0.5, 0.7, 0.9, 1.0}; double X0=1, Y0=1; int colorID[]={0x005555,0x002255,0x005522,0x005522,0x0055220,0x005522}; */ //-------------------------------------------------------------------- double XX, YY; static HDC hbuf; static HBITMAP hBM; int cmpIter(){// 反復関数系の計算 double R=frand(); XX = X0 ; YY = Y0; int i; for(i = 0; i < NMAX; i++)if(R < rdA[i]) break; X0=XX*A[i][0][0]+YY*A[i][0][1]+A[i][0][2]; Y0=XX*A[i][1][0]+YY*A[i][1][1]+A[i][1][2]; return i; } void initBitMap(HWND hw){// ビットマップ作成とメモリデバイスコンテキスト作成 HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,2000,1000); hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM); SelectObject(hbuf,GetStockObject(NULL_PEN)); PatBlt(hbuf,0,0,2000,1000,WHITENESS); ReleaseDC(hw, hdc); } void procCreate(HWND hw, WPARAM wp, LPARAM lp){ SetWindowText(hw,TEXT("反復関数系(Iterated Function System)")); initBitMap(hw); for(int i=0;i<50000;i++){ int ID=cmpIter(); int XP = (int)(XST + X0 * SC+0.5), YP=(int)(YST - Y0 * SC+0.5); SetPixel(hbuf,XP,YP,colorID[ID]); } InvalidateRect(hw,NULL,FALSE); Sleep(10); } void procPaint(HWND hw, WPARAM wp, LPARAM lp){// ビットマップを画面に表示 PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc,0,0,2000,1000,hbuf,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw,wp,lp) ; return 0; case WM_PAINT : procPaint (hw, wp, lp); return 0; } return DefWindowProc(hw, msg, wp, lp); }