// ■メンガーのスポンジ // 小さな箱を、以下の■印のように置いて描く。 // 描く順序は、下左端から右へ、後方、中央、前方の順に描く。 // // 後方 中央 前方     // ■■■  ■ ■ ■■■   // ■ ■       ■ ■ //  ■■■  ■ ■  ■■■ // #include "myWin.h" #include "math.h" int cTab[]={0x5555FF,0x55FFFF,0x770000}; static HDC hBuff; static HBITMAP hBM; void drawRect(double X1, double Y1, double X2, double Y2, int C){//正面表示用 HPEN hpen=CreatePen(PS_SOLID,1,cTab[C]); SelectObject(hBuff,hpen); HBRUSH hbrush=CreateSolidBrush(cTab[C]) ; SelectObject(hBuff,hbrush); Rectangle(hBuff, (int)X1, (int)Y1, (int)X2,(int)Y2); DeleteObject(hbrush);DeleteObject(hpen); } void drawPolygon(double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4,int C){//上面,側面表示用 POINT P[4]; P[0].x=(int)X1; P[0].y=(int)Y1;P[1].x=(int)X2; P[1].y=(int)Y2; P[2].x=(int)X3; P[2].y=(int)Y3;P[3].x=(int)X4; P[3].y=(int)Y4; HPEN hpen=CreatePen(PS_SOLID,1,cTab[C]); SelectObject(hBuff,hpen); HBRUSH hbrush=CreateSolidBrush(cTab[C]) ; SelectObject(hBuff,hbrush); Polygon(hBuff, P,4); DeleteObject(hbrush);DeleteObject(hpen); } void drawCell(double XX, double YY, double ZZ, double W){//セル表示 double X = XX + YY, Y = ZZ + XX, DL = W / 3; double X0 = X, X1 = X + DL, X2 = X + 3 * DL, X3 = X2 + DL; double Y0 = Y, Y1 = Y + DL, Y2 = Y + 3 * DL, Y3 = Y2 + DL; drawPolygon(200+X0, 300-Y2, 200+X1, 300-Y3, 200+X3, 300- Y3, 200+X2, 300-Y2, 1);// 上面 drawPolygon(200+X2, 300-Y2, 200+X3, 300-Y3, 200+X3, 300- Y1, 200+X2, 300-Y0, 2);// 側面 drawRect(200+X0, 300-Y0, 200+X2, 300- Y2, 0); // 正面 } void Menger(double X, double Y, double Z, double L){//メンガーのスポンジ if(L<7.5) {drawCell(X,Y,Z,L);return;} double LL=L/3, XX=X, YY, ZZ; int j,k; // 後方 for(YY=Y, j=0;j<3;j++, YY+=LL) for(ZZ=Z, k=0; k<3; k++, ZZ+=LL) if(j != 1 || k !=1) Menger(XX,YY,ZZ,LL); XX -= LL / 3; // 中央 for(YY=Y, j=0;j<3;j++, YY+=LL) for(ZZ=Z, k=0; k<3; k++, ZZ+=LL) if(j != 1 && k !=1) Menger(XX,YY,ZZ,LL); XX -= LL/ 3; // 後方 for(YY=Y, j=0;j<3;j++, YY+=LL) for(ZZ=Z, k=0; k<3; k++, ZZ+=LL) if(j != 1 || k !=1) Menger(XX,YY,ZZ,LL); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,600,500,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("メンガーのスポンジ")); MoveWindow(hw,0,0,600,500,TRUE); HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,700,700);// ビットマップ準備 hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,600,500,WHITENESS); ReleaseDC(hw,hdc); Menger(0.0,0.0,0.0, 270); //メンガーのスポンジをビットマップに描画 InvalidateRect(hw,NULL,TRUE); // ビットマップ表示開始 } 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); }