#include "myWin.h" #include "Complex.h" #include "stdio.h" #include "math.h" #define LOOP 100 static HDC hbuf; static HBITMAP hBM; void clearBitmap(int width, int height){ SelectObject(hbuf,GetStockObject(NULL_PEN)); PatBlt(hbuf,0,0,width,height,WHITENESS); } void initBitmap(HWND hw, int width, int height){ HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,width,height); hbuf=CreateCompatibleDC(hdc);SelectObject(hbuf,hBM); ReleaseDC(hw, hdc); } Complex A, B,C,D; Complex f0(Complex Z){//演算子(~)は共役複素数 return A*Z+ B*~Z; } Complex f1(Complex Z){ return C*(Z-1)+D*(~Z-1)+1; } void dspValue(){ TCHAR str[256]; HFONT hf=CreateFont(12,0,0,0,FW_NORMAL,FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN, NULL); SelectObject(hbuf,hf); TEXTMETRIC tm;GetTextMetrics(hbuf, &tm);int h=tm.tmHeight; SetTextColor(hbuf,0); SetBkMode(hbuf,TRANSPARENT); strDsp(TEXT("A = "), A, str); TextOut(hbuf,20, 20 ,str,lstrlen(str)); strDsp(TEXT("B = "), B, str); TextOut(hbuf,20, 20+h ,str,lstrlen(str)); strDsp(TEXT("C = "), C, str); TextOut(hbuf,20, 20+2*h,str,lstrlen(str)); strDsp(TEXT("D = "), D, str); TextOut(hbuf,20, 20+3*h,str,lstrlen(str)); } int SC=40, XST=20, YST=300, CP=0x007700, CM=0x007700; void drawPoint(double X, double Y){ int C=CP; if(Y<0) C=CM; SetPixel(hbuf,(int)(XST + X *SC+0.5),(int)(YST - Y *SC+0.5),C); } void drawRec(int N, Complex Z){ if(N==0) drawPoint(Z.r, Z.i); else {drawRec(N-1,f0(Z));drawRec(N-1,f1(Z));} } void drawRec(){//畑政義写像 Complex Z=Complex(0); //コッホ曲線 SC=400;XST=20, YST=250; CP=0xFF; CM=0xFF; A=Complex(0); B=Complex(0.5, sqrt(3.0)/6); C=Complex(0); D=Complex(0.5, -sqrt(3.0)/6); //幾何学模様 /* SC=400; XST=20, YST=350; CP=0xFF0000; CM=0xFF0000; A=Complex(0); B=Complex(0.45,0.5); C=Complex(0); D=Complex(0.45,-0.5); */ //C曲線 /* SC=200;XST=150; YST=150; CP=0xFF5555; CM=0xFF5555; A=Complex(0); B=Complex(-0.5, -0.5); C=Complex(0); D=Complex(-0.5, 0.5); */ //ドラゴン曲線 /* SC=150;XST=150; YST=250; CP=0x007700; CM=0x007700; A=Complex(0.5, -0.5); B=Complex(0); C=Complex(-0.5, -0.5); D=Complex(0); */ //倒れた杉の木 /* SC=300;XST=150; YST=250; CP=0x7700; CM=0xFF7777; A=Complex(-0.25, 0.5); B=Complex(0); C=Complex(0); D=Complex(0.75); */ //上下の枯れ木木立 /* SC=300;XST=150; YST=250; CP=0x7700; CM=0xFF7777; A=Complex(0, 0.5); B=Complex(0); C=Complex(0); D=Complex(0.75); */ //三頭龍 /* SC=100;XST=150; YST=250; CP=0x007700; CM=0x007700; A=Complex(-0.5, 0.5); B=Complex(0); C=Complex(0); D=Complex(0, 0.5); */ //草 /* SC=100;XST=150; YST=250; CP=0x007700; CM=0x007700; A=Complex(-0.7, 0.5); B=Complex(0); C=Complex(0); D=Complex(0, 0.4); */ //6と9の繰り返し /* SC=200;XST=100; YST=200; CP=0x007700; CM=0x007700; A=Complex(0.5, -0.5); B=Complex(0.2); C=Complex(-0.25, 0.5); D=Complex(0); */ //雲のような /* SC=200;XST=150; YST=200; CP=0xFF5555; CM=0xFF5555; A=Complex(0.55, -0.45); B=Complex(0); C=Complex(0.8, 0.2); D=Complex(0); */ //何だろう? /* SC=150;XST=150; YST=200; CP=0x007700; CM=0x007700; A=Complex(0.67, -0.5); B=Complex(0); C=Complex(-0.25, 0.5); D=Complex(0); */ //葉っぱ /* SC=400;XST=50;YST=250; CP=0x227722; CM=0x227722; A=Complex(0.7,0.2); B=Complex(0); C=Complex(0); D=Complex(0.67,0); */ //壊れたギャスケット /* SC=100;XST=150; YST=200; CP=0xFF0000; CM=0xFF0000; A=Complex(-0.25, 0.5); B=Complex(0); C=Complex(0); D=Complex(0, 0.7); */ //木の枝 /* SC=400;XST=50; YST=250; CP=0x007700; CM=0x007755; A=Complex(0); B=Complex(0.5,0.3); C=Complex(0); D=Complex(0.67); */ //木の葉2 /* SC=300;XST=100; YST=300; CP=0x007700; CM=0x007700; A=Complex(0); B=Complex(0.5,0.7); C=Complex(0); D=Complex(0.7); */ //草2 /* SC=400;XST=50;YST=250; CP=0x227722; CM=0x227722; A=Complex(0.6,0.2); B=Complex(0); C=Complex(0); D=Complex(0.67); */ //波打つカントールの塵 /* SC=250;XST=50;YST=250; CP=0xFF0000; CM=0xFF0000; A=Complex(0.7,0.1); B=Complex(0,0.3); C=Complex(0,0.2); D=Complex(0.7); */ //インディアンのカツラ /* SC=200;XST=150;YST=250; CP=0xFF; CM=0xFF; A=Complex(0.8,0.2); B=Complex(0,0.2); C=Complex(0,0.2); D=Complex(0.6,0.1); */ //羽根2 /* SC=200;XST=150;YST=250; CP=0xFF0000; CM=0xFF0000; A=Complex(0.8,0.2); B=Complex(0.1,0.1); C=Complex(0.1,0.2); D=Complex(0.6,0.1); */ //髪の毛ボウボウ /* SC=200;XST=150;YST=250; CP=0xFF0000; CM=0xFF0000; A=Complex(0.8,0.2); B=Complex(0.1,0.1); C=Complex(0.1,-0.2); D=Complex(0.6,-0.2); */ //羽根3 /* SC=200;XST=150;YST=250; CP=0xFF0000; CM=0xFF0000; A=Complex(0.8,-0.2); B=Complex(0.1,0.1); C=Complex(0.1,-0.2); D=Complex(0.6,-0.2); */ //小さな山 /* SC=100;XST=150;YST=250; CP=0xFF0000; CM=0xFF0000; A=Complex(0.5,0.4); B=Complex(0, 0.4); C=Complex(0.5,-0.4); D=Complex(0,-0.4); */ //C曲線の回転 /* SC=200;XST=200; YST=250; CP=0x007700; CM=0x007700; A=Complex(0.5, -0.5); B=Complex(0); C=Complex(0); D=Complex(0.5, -0.5); */ //刻んだニガウリ /* SC=200;XST=100; YST=250; CP=0x007700; CM=0x007700; A=Complex(0.4, -0.5); B=Complex(0, 0.1); C=Complex(0); D=Complex(-0.4, -0.5); */ drawRec(16, Z); dspValue(); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps);//ビットマップを画面に表示 BitBlt(hdc,0,0,500,500,hbuf,0,0,SRCCOPY); EndPaint(hw,&ps); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("フラクタル")); MoveWindow(hw,0,0,500,500,TRUE); initBitmap(hw,500,500);clearBitmap(500,500); drawRec(); 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); }