// ■複素数で描く // |Z^2+C|の値で絵を描きます。ただし、Cの値を時間で変化させます。 // C=CR+CI*j(j:虚数単位)とします。 #include "myWin.h" #include "math.h" #define frand() ((double) rand()/(RAND_MAX+1)) int timerFlag; double CR = 100, CI = 100, dR=1, dI=1, dX=0.1, SC=10; int cTab[8]= {0xFF0000, 0x0000FF, 0x00FFFF,0x770077, 0x00FF00, 0x773300, 0xFFFFFF, 0x000000}; static HDC hBuff; static HBITMAP hBM; void draw(){ for(double X = -10; X <= 10; X += dX) for(double Y=-10; Y<10; Y += dX){ double R = X * X - Y * Y + CR, I = 2 * X * Y + CI; int ID = (int)(sqrt(R * R + I * I)+0.5) % 8; int IX=120+(int)(X * SC), IY=110+(int)(Y * SC); SetPixel(hBuff,IX,IY, cTab[ID]); } } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,260,260,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ CR += dR, CI += dR, dR=0.1;; draw(); InvalidateRect(hw,NULL,TRUE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("複素数で描く")); MoveWindow(hw,0,0,260,260,TRUE); HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,260,260); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,260,260,WHITENESS); ReleaseDC(hw,hdc); SetTimer(hw,1,10,NULL);timerFlag=true; draw(); } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ timerFlag= !timerFlag; if(timerFlag) SetTimer(hw,1,10,NULL); else KillTimer(hw,1); } void procTimer(HWND hw, WPARAM wp,LPARAM lp){ procLButtonDown(hw,wp,lp); } 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; //次をコメントにすると左ボタンクリックで描画 case WM_TIMER : procTimer(hw,wp,lp) ; return 0; case WM_LBUTTONDOWN : procLButtonDown(hw,wp,lp) ; return 0; case WM_RBUTTONDOWN : procRButtonDown(hw,wp,lp) ; return 0; } return DefWindowProc(hw,msg,wp,lp); }