- #!/usr/bin/env python
- from sys import stdout
- from math import exp
- from numpy import zeros
- from array import array
- import random
- from sys import exit
- #base classes
- class Grid:
- def __init__(self, sizeX, sizeY):
- self.grid = []
- for i in range(sizeX):
- newGrid = []
- for j in range(sizeY):
- newGrid.append(Cell())
- self.grid.append(newGrid)
- def printGrid(self):
- for line in self.grid:
- #newString = ''
- for item in line:
- stdout.write(str(item.getGrid()) + ' ')
- print ''
- def getCellLine(self, i, j, k):
- return self.grid[i][j].getLine(k)
- def setCell(self, i, j, value):
- self.grid[i][j].setCell(value)
- def setSubCell(self, i, j, k, L, value):
- self.grid[i][j].setSubCell(k, L, value)
- class Cell:
- def __init__(self, sizeX=10, sizeY=10):
- self.grid = (zeros((10, 10), dtype=int))
- def getGrid(self):
- return self.grid
- def getLine(self, index):
- return self.grid[index]
- def setSubCell(self, i, j, value):
- self.grid[i][j] = value
- def setCell(self, value):
- for i in range(len(self.grid)):
- for j in range(len(self.grid)):
- self.grid[i][j] = value
- #functions
- def createRocksExp(grid, sizeX, sizeY, s=-8.30, L=6.84):
- rockSizes = [0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
- numRocks = []
- prevTotal = 0
- rockSizes.reverse()
- for i in rockSizes:
- numRocks.append((L * exp(i * s)) - prevTotal)
- prevTotal = (L * exp(i * s)) + prevTotal
- # rockSizes.reverse()
- # numRocks.reverse()
- #print numRocks
- for i in range(sizeX):
- for j in range(sizeY):
- random.seed()
- #if(random.random() < numRocks[0]):
- # grid.setCell(i, j, 5)
- for size in rockSizes:
- rockIndex = rockSizes.index(size)
- if(random.random() < numRocks[rockIndex]):
- #add code for if indices spill over an edge and can't be
- #corrected
- acceptable = False
- rangeX = []
- rangeY = []
- while(acceptable == False):
- shapeX = random.randint(1, (10 * rockSizes[rockIndex]))
- shapeY = int((10 * rockSizes[rockIndex]) / shapeX)
- remainder = (10 * rockSizes[rockIndex]) - (shapeX * shapeY)
- indexX = random.randint(0, 9)
- indexY = random.randint(0, 9)
- if(indexX + shapeX < 10):
- rangeX = ([index for index in range(indexX, indexX + shapeX)]
- if [index for index in range(indexX, indexX + shapeX)]
- else [indexX])
- elif(indexX - shapeX >= 0):
- rangeX = ([index for index in range(indexX - shapeX, indexX)]
- if [index for index in range(indexX - shapeX, indexX)]
- else [indexX])
- else:
- continue
- if(indexY + shapeY < 10):
- rangeY = ([index for index in range(indexY, indexY + shapeY)]
- if [index for index in range(indexY, indexY + shapeY)]
- else [indexY])
- elif(indexY - shapeY >= 0):
- rangeY = ([index for index in range(indexY - shapeY, indexY)]
- if [index for index in range(indexY - shapeY, indexY)]
- else [indexY])
- else:
- continue
- acceptable = True
- ##print 'Editing Block ' + str(i) + ', ' + str(j)
- for k in rangeX:
- for m in rangeY:
- grid.setSubCell(i, j, k, m, 5)
- # #we'll ignore the remainder for now, this is enough hurt as
- # #is
- def createFile(writeFile, sizeX, sizeY, grid):
- for i in range(sizeX):
- for k in range(10):
- for j in range(sizeY):
- writeFile.write(str(grid.getCellLine(i, j, k)).replace('[', '')
- .replace(']', ' '))
- writeFile.write('\n')
- if __name__ == '__main__':
- sizeX = 84
- sizeY = 84
- newWorld = Grid(sizeX,sizeY)
- createRocksExp(newWorld, sizeX, sizeY)
- #newWorld.printGrid()
- with open('world.pgm', 'w') as writeFile:
- writeFile.write('P2\n# world.pgm\n' + str(sizeX * 10) + ' '
- + str(sizeY * 10) +'\n5\n')
- createFile(writeFile, sizeX, sizeY, newWorld)
- exit()