Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def square(surface, x, y, edge_length, displacement_statement):
- displacement = eval(displacement_statement)
- height_sum = 0
- for dx in [-edge_length // 2, edge_length // 2]:
- for dy in [-edge_length // 2, edge_length // 2]:
- height_sum += surface[x + dx, y + dy]
- height_average = height_sum / 4
- surface[x, y] = height_average + displacement
- def diamond(surface, x, y, edge_length, displacement_statement):
- dimension = len(surface)
- displacement = eval(displacement_statement)
- height_sum = 0
- points_count = 0
- for dx in [-edge_length // 2, 0, edge_length // 2]:
- for dy in [-edge_length // 2, 0, edge_length // 2]:
- if (dx == 0 or dy == 0) and not (dx == 0 and dy == 0):
- if 0 <= x + dx < dimension and 0 <= y + dy < dimension:
- height_sum += surface[x + dx, y + dy]
- points_count += 1
- elif not 0 <= x + dx < dimension:
- height_sum -= surface[x - dx, y + dy]
- points_count -= 1
- else:
- height_sum -= surface[x + dx, y - dy]
- points_count -= 1
- height_average = height_sum / points_count
- surface[x, y] = height_average + displacement
- def main():
- surfaces = []
- dimension = 2**dimension_exponent + 1
- surface = numpy.zeros((dimension, dimension))
- surface[0, 0] = bottom_left
- surface[dimension - 1, 0] = bottom_right
- surface[0, dimension - 1] = top_left
- surface[dimension - 1, dimension - 1] = top_right
- edge_length = dimension - 1
- surfaces.append(surface[::edge_length, ::edge_length].copy())
- while edge_length > 1:
- # Square step
- for x in range(edge_length // 2, dimension - 1, edge_length):
- for y in range(edge_length // 2, dimension - 1, edge_length):
- square(surface, x, y, edge_length, displacement_statement)
- # Diamond step
- for x in range(edge_length // 2, dimension - 1, edge_length):
- for y in range(edge_length // 2, dimension - 1, edge_length):
- diamond(surface, x - edge_length //2, y, edge_length, displacement_statement)
- diamond(surface, x, y - edge_length // 2, edge_length, displacement_statement)
- for x in range(edge_length // 2, dimension - 1, edge_length):
- diamond(surface, x, dimension - 1, edge_length, displacement_statement)
- for y in range(edge_length // 2, dimension - 1, edge_length):
- diamond(surface, dimension - 1, y, edge_length, displacement_statement)
- surfaces.append(surface[::(edge_length // 2), ::(edge_length // 2)].copy())
- edge_length = edge_length // 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement