#!/usr/bin/env python3 import cairo import math from utils import random_color # dimensions of the output image WIDTH, HEIGHT = 1024, 1024 # numbers of waves WAVES = 10 # how much should the phases be offset? WAVE_OFFSET = -0.7 # amplitude of the sine wave AMPLITUDE = 25 # only 1 color with shades? MONOCHROME = True # background black? White otherwise: DARK_BG = True # precision of the calculation PRECISION = 10000 def main(): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT) ctx = cairo.Context(surface) ctx.scale(WIDTH, HEIGHT) # Normalizing the canvas wave_height = 1/WAVES step_size = 1/PRECISION lastpoints = [(x/PRECISION, 0) for x in range(PRECISION+1)] if DARK_BG: # make bg black ctx.rectangle(0, 0, 1, 1) ctx.set_source_rgb(0, 0, 0) ctx.fill() if MONOCHROME: r, g, b = random_color() alpha_step = 1/WAVES for num in range(WAVES+1): if not MONOCHROME: r, g, b = random_color() points = [] x = 0 while x < 1: y = math.sin(x*AMPLITUDE + (num * WAVE_OFFSET) ) * 0.1 points.append((x, ( (y/4) + ((0.5+num)*wave_height)))) x += step_size print(f'Draw {len(points)} points for curve {num}') if not MONOCHROME: ctx.set_source_rgb(r, g, b) else: ctx.set_source_rgba(r, g, b, 1 - (alpha_step * num)) # make more transparent toward bottom # draw waves ctx.move_to(*points[0]) for p in points[1:]: ctx.line_to(*p) ctx.set_line_width(step_size) #0.002) ctx.stroke() # fill area above ctx.set_line_width(step_size) for pos in range(len(points)): ctx.move_to(*points[pos]) ctx.line_to(*lastpoints[pos]) ctx.stroke() lastpoints = points surface.write_to_png("out/waves.png") # Output to PNG if __name__ == '__main__': main()