Interpolation
BlitzMax Forums/BlitzMax Programming/Interpolation
| ||
I have a piece of code meant to produce some perlin noise. Unfortunately, I can't seem to make the interpolation work correctly. This is what it looks like: ![]() The shading is supposed to be smooth between the corners. What am I doing wrong? Function Noise#(x%,y%=0) Local a@=(y~(51*x)+((x|y)~(x&y))*597673+(x~104399)*y+((x|(y*931949))~y)) Mod 256 Local b@=(562901*(x~y)+(x+y)*(x&y+78179)+((x*y)&x~y)) Mod 256 Local c@=((x~78179)*597673+(y~104399)*601981+x+y+((x~y)~(x&y))*931949) Mod 256 Local d@=(78179*(x&y)+(y~(x~(y*x*597673)))+(x&(y*96986))+(562901*y+(562901~x))) Mod 256 Local val%=Abs((a~b~c)+((b~c~d) Shl 8)+((c~d~a) Shl 16)+((d~a~b) Shl 24)) Return val/(2.0^31) End Function Function SmoothNoise#(x%,y%=0) Return (Noise(x,y)*6+Noise(x+1,y)+Noise(x-1,y))/8.0 End Function Function SmoothNoise2D#(x%,y%) Return (Noise(x,y)*12+Noise(x+1,y)+Noise(x-1,y)+Noise(x,y+1)+Noise(x,y-1))/16.0 End Function Function Interpolate#(a#,b#,x#) Local f#=(1-Cos(x*180))*.5 Return a*(1-f)+b*f End Function Function Interpolate2D#(a#,b#,c#,d#,x#,y#) Local f#=(1-Cos(x*180))*.5 Local g#=(1-Cos(y*180))*.5 Local o#=a*(1-f)+b*f Local p#=c*(1-g)+d*g Local q#=a*(1-f)+c*f Local r#=b*(1-g)+d*g Local j#=o*(1-g)+p*g Local k#=q*(1-f)+r*f Return (j+k)/2.0 End Function Function NoisePiece%(x%,factor#,change#,y%=0) Local xx%=x Mod factor Return Interpolate(SmoothNoise(Floor(x/Float(factor)),y),SmoothNoise(Ceil(x/Float(factor)),y),(xx/Float(factor)))*change End Function Function NoisePiece2D%(x%,y%,factor#,change#) Local xx%=x Mod factor Local yy%=y Mod factor Local a#= SmoothNoise2D(Floor(x/Float(factor)),Floor(y/Float(factor))) Local b#= SmoothNoise2D(Floor((x+1)/Float(factor)),Floor(y/Float(factor))) Local c#= SmoothNoise2D(Floor(x/Float(factor)),Floor((y+1)/Float(factor))) Local d#= SmoothNoise2D(Floor((x+1)/Float(factor)),Floor((y+1)/Float(factor))) Return Interpolate2D(a,b,c,d,(xx/Float(factor)),(yy/Float(factor)))*change End Function Graphics 512,512 For Local x%=0 To 511 For Local y%=0 To 511 Local val#=NoisePiece2D(x,y,64.0,256)'+NoisePiece2D(x,y,256.0,96)+NoisePiece2D(x,y,96.0,96)+NoisePiece2D(x,y,8.0,32) 'If val<200 val=0 SetColor val,val,val Plot x,y If (x Mod 128)=0 And (y Mod 128)=0 DrawRect x-4,y-4,8,8 Next 'End If x Mod 2=0 Flip Next Repeat Flip Until KeyDown(27) Last edited 2011 |