#!/usr/bin/env python3 #-*- encoding: utf-8 -*- import random, math import atexit as _atexit import os as _os # output_style = 'text' output_style = 'svg' mapsize = 60 def text_chart(array, min_y=None, max_y=None): BARS = "▁▂▃▄▅▇█" if min_y is None: min_y = min(array) if max_y is None: max_y = max(array) array = [int(6 * (y-min_y) / (max_y-min_y)) for y in array] return "".join([BARS[y] for y in array]) def svg_chart(array, min_y=None, max_y=None): W = 9 if min_y is None: min_y = min(array) if max_y is None: max_y = max(array) array = [(1.5 + 14 * (y - min_y) / (max_y - min_y)) for y in array] def line(x, y): return """L %.1f %.1f l %d 0 """ % ( 1 + W*x, 17-y, W ) y0 = 1.5 + 14 * (-min_y) / (max_y - min_y) # fill to y=0 position y0 = 1.5 # fill to bottom of diagram return """
""" % ( 2 + W*len(array), 2 + W*len(array), 17 - y0, "".join([line(x, array[x]) for x in range(len(array))]), 1 + W*len(array), 17 - y0 ) chart = {'text': text_chart, 'svg': svg_chart}[output_style] if output_style == 'svg': print('
') _atexit.register(lambda: print('
')) def print_chart(i, array): if output_style == 'svg': i = '%s' % i print(i, chart(array)) def weighted_sum(amplitudes, noises): output = [0.0] * mapsize # make an array of length mapsize for k in range(len(noises)): for x in range(mapsize): output[x] += amplitudes[k] * noises[k][x] return output def noise(freq): phase = random.uniform(0, 2*math.pi) return [math.sin(2*math.pi * freq*x/mapsize + phase) for x in range(mapsize)] def random_ift(rows, amplitude): for i in range(rows): random.seed(i) frequencies = range(1, mapsize//2) amplitudes = [amplitude(f) for f in frequencies] noises = [noise(f) for f in frequencies] sum_of_noises = weighted_sum(amplitudes, noises) print_chart(i, sum_of_noises)