たまには、プログラムでものっけてみよう。
そんな気分でございます。
リサージュ曲線。
聞いたことありますか?
数学Cの分野でやりました。オレは。
それを実際にプログラムで走らせて見よう!
そんな感じです。
では、やってみます。
Dim hMemDC As HDC
Dim hMemBmp As HBITMAP
グローバル変数で、デバイスコンテキスト(オレはデバコンと略している)を定義。
メモリDC(メモリデバイスコンテキスト)に描写して、それをウインドウに描写する、そういう形。
なお、ウインドウはRADツールで製作しています。
サイズは640*480
Sub MainWnd_Destroy()
DeleteDC(hMemDC)
DeleteObject(hMemBmp)
curve_DestroyObjects()
PostQuitMessage(0)
End Sub
デストロイイベント。
DeleteDC(hMemDC)
DeleteObject(hMemBmp)
これを入れないと、メモリを確保したままになる。
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
SetWindowCenter(hMainWnd,0,0)
SetWindowPos(hMainWnd,NULL,0,0,640,480,SWP_NOMOVE)
'デバコンの設定
Dim hDC As HDC
hDC=GetDC(hMainWnd)
hMemDC=CreateCompatibleDC(hDC)
hMemBmp=CreateCompatibleBitmap(hDC,640,480)
SelectObject(hMemDC,hMemBmp)
ReleaseDC(hMainWnd,hDC)
Dim dw As Long
CreateThread(ByVal 0,0,AddressOf(PaintPic),0,0,VarPtr(dw))
End Sub
ウインドウのクリエイトイベント。
SetWindowCenter(hMainWnd,0,0)
これは、オレが勝手に定義したルーチン。
ウインドウを画面中央に持っています。(外部より読み出し。ここでは省略)
Sub MainWnd_Paint(hDC As HDC)
BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY)
End Sub
ペイントイベント。
ウインドウにメモリDCを描写
Sub PaintPic()
Dim x As Long
Dim y As Long
Dim t As Double
Dim a As Long
Dim b As Long
Dim i As Double
Dim rgbc As DWord
a=3
b=5
t=(3.141592653589793/180)
Randomize
rgbc=RGB(255,255,255)
For i=0.1 to 3600000 Step 0.1
x=Cos(a*t*i)*100+320
y=Sin(b*t*i)*100+240
SetPixel(hMemDC,x,y,rgbc)
InvalidateRect(hMainWnd,ByVal 0,FALSE)
Sleep(1)
Next
End Sub
今回の要。
リサージュ曲線の計算。
というより、ドットを描写してますね。
まとめ。
Sub MainWnd_Destroy()
DeleteDC(hMemDC)
DeleteObject(hMemBmp)
curve_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
SetWindowPos(hMainWnd,NULL,0,0,640,480,SWP_NOMOVE)
'デバコンの設定
Dim hDC As HDC
hDC=GetDC(hMainWnd)
hMemDC=CreateCompatibleDC(hDC)
hMemBmp=CreateCompatibleBitmap(hDC,640,480)
SelectObject(hMemDC,hMemBmp)
ReleaseDC(hMainWnd,hDC)
Dim dw As Long
CreateThread(ByVal 0,0,AddressOf(PaintPic),0,0,VarPtr(dw))
End Sub
Sub MainWnd_Paint(hDC As HDC)
BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY)
End Sub
Sub PaintPic()
Dim x As Long
Dim y As Long
Dim t As Double
Dim a As Long
Dim b As Long
Dim i As Double
Dim rgbc As DWord
a=3
b=5
t=(3.141592653589793/180)
Randomize
rgbc=RGB(255,255,255)
For i=0.1 to 3600000 Step 0.1
x=Cos(a*t*i)*100+320
y=Sin(b*t*i)*100+240
SetPixel(hMemDC,x,y,rgbc)
InvalidateRect(hMainWnd,ByVal 0,FALSE)
Sleep(1)
Next
End Sub
実行結果。