Source code for serge.blocks.fractals

"""Some fractal utilities"""

import random
from serge.simplevecs import Vec2d

[docs]def fractalLine(start, end, number_steps, distance_per_step, decay): """Return a fractal line, broken into # steps with each step being a random distance""" center_point = (Vec2d(start) + Vec2d(end))/2 movement_parallel = (Vec2d(end)-Vec2d(start)).normalized() # # Decide which direction to move angle = 90 if random.random() > 0.5 else -90 movement_perpendicular = movement_parallel.rotated_degrees(angle) # # Distance movement = movement_perpendicular * distance_per_step #*random.random() # # New point new_point = center_point + movement # # Now do other centers if needed if number_steps > 1: return fractalLine(start, new_point, number_steps-1, distance_per_step/decay, decay) + \ fractalLine(new_point, end, number_steps-1, distance_per_step/decay, decay)[1:] else: return [start, new_point, end]
[docs]def fractalShape(points, number_steps, distance_per_step, decay): """Return a shape where the straight lines are converted to fractal lines""" # # Ready to stop? if len(points) <= 1: return points # # Convert the shape return fractalLine(points[0], points[1], number_steps, distance_per_step, decay)[:-1] + \ fractalShape(points[1:], number_steps, distance_per_step, decay)