Code archives/Graphics/Quad mapping function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Roughly remaps any image to any arbitrary quad shape. Doesn't perform any filtering, nor does it resize the pixels for you. Not the most elegant or pretty, but it's a good starting point. | |||||
Const top = 0, bottom = 1 AppTitle "Quad function demo" Graphics 640,480 Dim xp#(1, bottom) , yp#(1,bottom) Dim xdelta#(1), ydelta#(1) image = LoadImage ("cat.png") Global imagew = ImageWidth(image), imageh = ImageHeight(image) Dim imageRGB(ImageW-1,ImageH-1) Dim position(ImageW-1,ImageH-1) LockBuffer (ImageBuffer(image)) For x = 0 To imagew-1 For y = 0 To imageh-1 imageRGB(x,y) = ReadPixelFast(x,y, ImageBuffer(image)) And $FFFFFF position(x,y) = 0 Next Next UnlockBuffer(ImageBuffer(image)) Dim xp#(ImageW, bottom) Dim yp#(imagew, bottom) Dim xdelta#(imagew) Dim ydelta#(imagew) SetBuffer BackBuffer() angle = 0 MoveMouse width/2, height/2 Repeat angle = (angle + 3) Mod 360 cosang = Cos(angle)*100 sinang = Sin(angle)*100 quad (image, 130+sinang / 3,130+cosang / 3, 400+sinang / 2,90+cosang / 2, 460,260, MouseX(), MouseY()) Color 255,255,255 Text 5,460, "Quad Mapping by Beaker 2001" Flip:Cls Until KeyHit(1) End Function Quad (image, x0#,y0#, x1#,y1#, x2#,y2#, x3#,y3#) xpdtop# = (x1 - x0) / (imagew - 1) ypdtop# = (y1 - y0) / (imagew - 1) xpdbott# = (x2 - x3) / (imagew - 1) ypdbott# = (y2 - y3) / (imagew - 1) For x = 0 To ImageW xp(x,top) = x0 + (x * xpdtop) yp(x,top) = y0 + (x * ypdtop) xp(x,bottom) = x3 + (x * xpdbott) yp(x,bottom) = y3 + (x * ypdbott) Next For x = 0 To imagew xdelta(x) = ((xp(x,bottom) - xp(x,top)) / (imageh - 1)) ydelta(x) = ((yp(x,bottom) - yp(x,top)) / (imageh - 1)) Next For x = 0 To imagew - 1 For y = 0 To imageh - 1 If imageRGB(x,y) > 0 xadderTL = (xdelta(x) * y) position(x,y) = (xp(x,top) + (y * xdelta(x)) Shr 16) Or yp(x,top) + (y * ydelta(x)) Color imageRGB(x,y) Shr 16 And $ff, imageRGB(x,y) Shr 8 And $ff, imageRGB(x,y) And $ff Oval xp(x,top) + (y * xdelta(x)), yp(x,top) + (y * ydelta(x)), 6,6 EndIf Next Next End Function |
Comments
None.
Code Archives Forum