Ich hab dir mal einen kleinen Code zusammengeworfen.
Einfach ist es, solange du mit den Formeln experimentierst.
Komplizierter wird es, wenn du damit etwas bestimmtes erreichen willst
Achtung, der Code ist so gut wie nicht optimiert, am besten den Debugger zum testen ausschalten.
Es stehen jedoch Tipps drinnen, wie du mehr Geschwindigkeit herausholen kannst.
Code: Alles auswählen
UseJPEGImageDecoder()
InitSprite()
InitNetwork()
InitKeyboard()
#xres=800
#yres=600
#targetfile="image.jpg"
OpenScreen(#xres,#yres,32,"Plane Deformation",#PB_Screen_SmartSynchronization,10)
StartDrawing(ScreenOutput())
DrawText(100,100,"Initializing",$ffff,0)
StopDrawing()
FlipBuffers()
; Irgendein Bild das wir verwenden, Bilder die an den Rändern ineinander
; übergehen machen sich gut. Hier ein (nicht ganz langweiliges) Schachbrett
ReceiveHTTPFile("https://www.filterforge.com/filters/2031.jpg",#targetfile)
LoadImage(1,#targetfile)
ResizeImage(1,512,512)
Dim Color.l(512,512)
; Wir lesen das Bild in ein Array, damit das Programm nicht endlos langsam ist
StartDrawing(ImageOutput(1))
For y=0 To 511
For x=0 To 511
Color(x,y)=Point(x,y)
Next
Next
StopDrawing()
StartDrawing(ScreenOutput())
Box(0,0,1024,768)
StopDrawing()
FlipBuffers()
Repeat
FlipBuffers()
ExamineKeyboard()
r.d+0.005
StartDrawing(ScreenOutput())
For y=0 To #yres-1
For x=0 To #xres-1
; Mit leichter Modifikation aus dem zweiten Artikel übernommen
; Achtung, du fütterst Cos und Sin in Programmiersprachen mit Radians Werten
; Also 0 bis 2*#PI , die 360° entsprechen. D.h. deine Werte dürfen sich nicht schnell ändern
u = x*Cos(2*r)*Sin(y/100)-y*Sin(2*r)
v = y*Cos(2*r) + x*Sin(r*1.9)
; Hier kann viel an Geschwindigkeit gewonnen werden, sieh dir die mal Drawingbuffer Befehle an
; Und eine Look Up Table holt auch nochmal einiges raus.
Plot(x,y,Color(u&511,v&511))
Next
Next
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape)
DeleteFile(#targetfile)