Code archives/Miscellaneous/Kaleidoscope
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Run the program and select an image from the requester. Move the mouse across the image top see a kaleidoscope effect | |||||
SuperStrict Framework BRL.D3D7Max2D Import BRL.System Import BRL.Pixmap ' modules which may be required: Import BRL.PNGLoader Import BRL.BMPLoader Import BRL.TGALoader Import BRL.JPGLoader SetGraphicsDriver D3D7Max2DDriver() Local Filename:String = RequestFile("Load Image File") 'request the image file If Not Filename Then End Local Pixmap:TPixmap = LoadPixmap(Filename) If Not pixmap Then RuntimeError("Cannot open file "+Filename) pixmap = ResizePixmap(pixmap,800,600) 'resize the image to the screen Local Image:TImage = CreateImage(256,256) 'create the kaleidiscope "window" MidHandleImage Image Local Angle:Double = 0 'Angle of the Window Graphics 800,600 'Set the graphics mode Local Time:Int = MilliSecs() + 1000 'for displaying frame rate Local Frame:Int = 0 Local FPS:Int While Not KeyHit(KEY_ESCAPE) And Not AppTerminate() Local xo:Int = MouseX() 'get mouse position Local yo:Int = MouseY() If xo < 128 Then xo = 128 If xo > 671 Then xo = 671 If yo < 128 Then yo = 128 If yo > 471 Then yo = 471 'set the mouse within a certain region to prevent out-of-bounds errors Local Lock:TPixmap = LockImage(Image) 'lock the image memset_(PixmapPixelPtr(Lock),0,256*256*4) 'zero all the pixels For Local x:Int = -128 To 127 'go through the image pixel by pixel For Local y:Int = -128 To 127 Local Dist:Double = Sqr(x*x+y*y) 'we are only interested in a radius of 128 pixels If Dist<128 Local PixAngle:Double = ATan2(y,x) 'find the angle of the pixel If Pixangle < 0 Then Pixangle :+ 360 'convert -180x180 to 0x360 Pixangle :- Angle 'subtract the window's angle from the pixels angle If PixAngle >= 360 Then PixAngle :- 360 If PixAngle < 0 Then PixAngle :+ 360 Select True Case PixAngle < 45 And Pixangle >= 0 'first 45 degrees get copied WritePixel(Lock,x+128,y+128,ReadPixel(Pixmap,x+xo,y+yo)) Case PixAngle <= 90 And PixAngle >= 45 'next 45 degrees get mirrored WritePixel(Lock,x+128,y+128,ReadPixel(Pixmap,Cos((89-pixangle)+Angle)*Dist+xo,Sin((89-pixangle)+angle)*dist+yo)) End Select End If Next Next UnlockImage Image Cls For Local i:Int = 0 To 359 Step 90 'we will draw the 90' rendered above 4 times for an entire 360 image SetRotation i DrawImage Image,xo,yo Next SetRotation 0 DrawText FPS,10,10 'FPS Flip Angle :+ 1 'add 1 to the window's angle If Angle >= 360 Then Angle :- 360 If MouseHit(1) 'Left mouse button = hide cursor HideMouse End If If MouseHit(2) 'Right mouse button = show cursor ShowMouse End If Frame :+ 1 If MilliSecs() >= Time 'Update FPS Time :+ 1000 FPS = Frame Frame = 0 End If Wend |
Comments
| ||
Very cool! |
Code Archives Forum