Advertisement
Guest User

diamond square algorithm

a guest
Dec 18th, 2011
533
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.28 KB | None | 0 0
  1. #
  2. #   diamond square algorithm
  3. #
  4.  
  5. import random
  6.  
  7. class Point:
  8.     def __init__(self, X, Y, Height=0.0):
  9.         self.X = X
  10.         self.Y = Y
  11.         self.Height = Height
  12.  
  13. class Quad:
  14.     Points = {'NE':None, 'NW':None, 'SW':None, 'SE':None, 'N':None, 'S':None, 'E':None, 'W':None, 'Centre':None}
  15.     Children = {'NE':None, 'NW':None, 'SW': None, 'SE':None}
  16.     rangeMin = 0
  17.     rangeMax = 100
  18.  
  19.     def __init__(self, TL, TR, BL, BR, rangeMin, rangeMax):
  20.         self.Points['NW'] = TL
  21.         self.Points['NE'] = TR
  22.         self.Points['SW'] = BL
  23.         self.Points['SE'] = BR
  24.         centrePointX = self.getPoint('NE').X - self.getPoint('NW').X
  25.         centrePointY = self.Points['SE'].Y - self.getPoint('NE').Y
  26.         centrePoint = Point(centrePointX, centrePointY)
  27.         self.Points['Centre'] = centrePoint
  28.         self.rangeMin = rangeMin
  29.         self.rangeMax = rangeMax
  30.  
  31.     def getPoint(self, name):
  32.         try:
  33.             x = self.Points[name]
  34.             return x
  35.         except:
  36.             print()
  37.             print('''getPoint(name) > "name" must be: ''')
  38.             print('''"NE", "NW", "SE", "SW", "N", "S", "E", "W or "Centre"''')
  39.             print()
  40.  
  41.     def findPoint(self, X, Y):
  42.        
  43.         X = round(X)
  44.         Y = round(Y)
  45.        
  46.         tr = self.Points['NE']
  47.         tl = self.Points['NW']
  48.         br = self.Points['SE']
  49.         bl = self.Points['SW']
  50.         t = self.Points['N']
  51.         b = self.Points['S']
  52.         l = self.Points['W']
  53.         r = self.Points['E']
  54.         c = self.Points['Centre']
  55.  
  56.         if l == None:
  57.             self.generateChildren()
  58.  
  59.         if X >= l.X and X <= r.X and Y >= t.Y and Y <= b.Y:
  60.             for i in self.Points.values():
  61.                 if round(i.X) == X and round(i.Y) == Y:
  62.                     return i
  63.             if X < round(c.X) and Y < round(c.Y):
  64.                 return self.getChild('NW').findPoint(X,Y)
  65.             elif X > round(c.X) and Y < round(c.Y):
  66.                 return self.getChild('NE').findPoint(X,Y)
  67.             elif X < round(c.X) and Y > round(c.Y):
  68.                 return self.getChild('SW').findPoint(X,Y)
  69.             elif X > round(c.X) and Y > round(c.Y):
  70.                 return self.getChild('SE').findPoint(X,Y)
  71.  
  72.     def getChild(self, name):
  73.         try:
  74.             x = self.Children[name]
  75.             return x
  76.         except:
  77.             pass
  78.  
  79.     # Note: randomRange should be from 1-100
  80.     #   height of middle point = (tl+tr+bl+br+randrange(randomrangemin,randomrangemax)/100)/5
  81.     #                          = somewhere between 0 and 1 (float)
  82.     #   height of sides = (adjacent points + randrange(randomrangemin/2,randomrangemax/2)/100)/5
  83.     #                   = somewhere between 0 and 1 (float)
  84.     def generateChildren(self):
  85.         rangeMin = self.rangeMin
  86.         rangeMax = self.rangeMax
  87.        
  88.         tl = self.Points['NW']
  89.         tr = self.Points['NE']
  90.         bl = self.Points['SW']
  91.         br = self.Points['SE']
  92.         self.Points['Centre'].Height = (tl.Height + tr.Height + bl.Height + br.Height + random.randrange(int(rangeMin), int(rangeMax))/100.0)/5.0
  93.         c = self.Points['Centre']
  94.  
  95.         # north point
  96.         nX = (tr.X - tl.X)/2.0
  97.         print(self.getPoint('NW').X)
  98.         nY = tr.Y
  99.         nH = (tl.Height + tr.Height + c.Height + random.randrange(int(rangeMin/2), int(rangeMax/2))/100.0)/4.0
  100.         n = Point(nX, nY, nH)
  101.         self.Points['N'] = n
  102.  
  103.         # south point
  104.         sX = (br.X - bl.X)/2.0
  105.         sY = br.Y
  106.         sH = (br.Height + bl.Height + c.Height + random.randrange(int(rangeMin/2), int(rangeMax/2))/100.0)/4.0
  107.         s = Point(sX, sY, sH)
  108.         self.Points['S'] = s
  109.         print(self.getPoint('NW').X)
  110.  
  111.         # east point
  112.         eX = br.X
  113.         eY = (br.Y - tr.Y)/2
  114.         eH = (br.Height + tr.Height + c.Height + random.randrange(int(rangeMin/2), int(rangeMax/2))/100.0)/4.0
  115.         e = Point(eX, eY, eH)
  116.         self.Points['E'] = e
  117.         print(self.getPoint('NW').X)
  118.  
  119.         # west point
  120.         wX = bl.X
  121.         wY = (bl.Y - tl.Y)/2
  122.         wH = (bl.Height + tl.Height + c.Height + random.randrange(int(rangeMin/2), int(rangeMax/2))/100.0)/4.0
  123.         w = Point(wX, wY, wH)
  124.         self.Points['W'] = w
  125.         print(self.getPoint('NW').X)
  126.  
  127.         # random ranges
  128.         rmi = (self.rangeMin+self.rangeMax)/4.0
  129.         rma = rmi*3.0
  130.         print(self.getPoint('NW').X)
  131.  
  132.         #quads
  133.         self.Children['NW'] = Quad(tl, n, w, c, rmi, rma)
  134.         self.Children['NE'] = Quad(n, tr, c, e, rmi, rma)
  135.         self.Children['SW'] = Quad(w, c, bl, s, rmi, rma)
  136.         self.Children['SE'] = Quad(c, e, s, br, rmi, rma)
  137.         print(self.getPoint('NW').X)
  138.  
  139. # Creates 3 Generations of Quads, which means there are 64 Quads, and 576 points.
  140. # returning 'q' gives the programmer complete control over ALL points, and ALL quads.
  141. def main():
  142.    
  143.     # Create 4 points
  144.     tl = Point(0,0,0.5)
  145.     tr = Point(5,0,0.5)
  146.     bl = Point(0,5,0.5)
  147.     br = Point(5,5,0.5)
  148.  
  149.     # Create a quad of those 4 points
  150.     q = Quad(tl, tr, bl, br, 0, 100)
  151.  
  152.     # Generate it's 4 child quads
  153.     q.generateChildren()
  154.  
  155.     return q
  156.  
  157. newQuad = main()
  158. print (newQuad.getChild('NW').X)
  159. # This is 5 ^^^^^^^^^^^^^^^^^^^
  160. # It is 0 when I define it as 'tl' in main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement