Code archives/Algorithms/Midpoint Displacement Algorithm

This code has been declared by its author to be Public Domain code.

Download source code

Midpoint Displacement Algorithm by Pakz2014


I found this code more then 10 years ago and used it a couple of times after converting it from c++ I think. I converted it to Blitz, java and back to blitz just yet. I hope I did not break it.

The code makes heightmaps.
; Midpoint Displacement
Graphics 640,480,32,2
SetBuffer BackBuffer()

Global mapwidth = 100
Global mapheight = 100
Dim map(mapwidth,mapheight)

domidpoint
tw = GraphicsWidth()/mapwidth
th = GraphicsHeight()/mapheight
For y=0 To mapheight
For x=0 To mapwidth
	Color map(x,y),map(x,y),map(x,y)
	Rect x*tw,y*th,tw,th,True
Next
Next

Flip
WaitKey
End

; Here the midpoint code begins.
Function domidpoint()
  ; Erase the old map array..
  For y = 0 To mapheight
  For x = 0 To mapwidth
    map(x,y)=0
  Next
  Next
  ; Setup points in the 4 corners of the map.
  map(0,0) = 128
  map(mapwidth,0) = 128
  map(mapwidth,mapheight) = 128
  map(0,mapheight) = 128
  ; Do the midpoint
  midpoint(0,0,mapwidth,mapheight)
End Function 

 ; This is the actual Mid point displacement code.
 Function midpoint(x1,y1,x2,y2)
   	; If this is pointing at just on pixel, Exit because
 	; it doesn't need doing}
   	If x2-x1<2 And y2-y1<2 Then Return False

 	; Find distance between points And
  	;use when generating a random number.
    dist=(x2-x1+y2-y1)
    hdist=dist / 2
  	;Find Middle Point
    midx=(x1+x2) / 2
    midy=(y1+y2) / 2
  	;Get pixel colors of corners
    c1=map(x1,y1)
    c2=map(x2,y1)
    c3=map(x2,y2)
    c4=map(x1,y2)

  	; If Not already defined, work out the midpoints of the corners of
  	; the rectangle by means of an average plus a random number.
    If(map(midx,y1)=0) Then map(midx,y1)=((c1+c2+Rand(dist)-hdist) / 2)
    If(map(midx,y2)=0) Then map(midx,y2)=((c4+c3+Rand(dist)-hdist) / 2)
    If(map(x1,midy)=0) Then map(x1,midy)=((c1+c4+Rand(dist)-hdist) / 2)
    If(map(x2,midy)=0) Then map(x2,midy)=((c2+c3+Rand(dist)-hdist) / 2)

  	; Work out the middle point...
    map(midx,midy) = ((c1+c2+c3+c4+Rand(dist)-hdist)/4)

  	; Now divide this rectangle into 4, And call again For Each smaller
  	; rectangle
    midpoint(x1,y1,midx,midy);
    midpoint(midx,y1,x2,midy);
    midpoint(x1,midy,midx,y2);
    midpoint(midx,midy,x2,y2);

End Function

Comments

None.

Code Archives Forum