Interpolation

BlitzMax Forums/BlitzMax Programming/Interpolation

Pineapple(Posted 2011) [#1]
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