diff --git a/waves.py b/waves.py index 1d5a594..c56aac9 100755 --- a/waves.py +++ b/waves.py @@ -6,71 +6,75 @@ from datetime import datetime import calendar import random import colorsys -from utils import random_color # dimensions of the output image # how much should the phases be offset? -WAVE_OFFSET = math.pi / random.choice([1, 2, 4]) #-1.9 +WAVE_OFFSET = math.pi / random.choice([1, 2, 4]) # -1.9 # background black? White otherwise: DARK_BG = True # precision of the calculation PRECISION = 10000 + def get_color_from_date(date: datetime) -> tuple[float, float, float]: - '''Return a color based on the progress through the year.''' + """Return a color based on the progress through the year.""" # a day between 1 and 365 (inclusive) today = date.timetuple().tm_yday days_in_year = 365 + calendar.isleap(date.year) # between 0 and 1, how far through the year are we? - progress = today/days_in_year + progress = today / days_in_year return colorsys.hsv_to_rgb(progress, 1, 0.9) + def get_amplitude_from_date(date: datetime, waves) -> float: - '''Return the amplitude of waves, based on progress through the month.''' + """Return the amplitude of waves, based on progress through the month.""" days_in_month = calendar.monthrange(date.year, date.month)[1] - max_amp = 1/waves/2 - return date.day/days_in_month * max_amp + max_amp = 1 / waves / 2 + return date.day / days_in_month * max_amp -def create_wpotd(width: int, height: int, date: datetime = datetime.now(), dark: bool = True) -> cairo.ImageSurface: + +def create_wpotd( + width: int, height: int, date: datetime = datetime.now(), dark: bool = True +) -> cairo.ImageSurface: surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) ctx = cairo.Context(surface) ctx.scale(width, height) # Normalizing the canvas - #ctx.set_antialias(cairo.Antialias.BEST) + # ctx.set_antialias(cairo.Antialias.BEST) - lastpoints = [(x/PRECISION, 0) for x in range(PRECISION+1)] + lastpoints = [(x / PRECISION, 0) for x in range(PRECISION + 1)] frequency = random.randint(10, 40) waves = date.month amplitude = get_amplitude_from_date(date, waves) r, g, b = get_color_from_date(date) - alpha_step = 1/waves + alpha_step = 1 / waves - ctx.rectangle(0, 0, 1, 1) + # background color if dark: - # make bg black ctx.set_source_rgb(0, 0, 0) else: ctx.set_source_rgb(255, 255, 255) + ctx.rectangle(0, 0, 1, 1) ctx.fill() - wave_height = 1/waves - step_size = 1/PRECISION + wave_height = 1 / waves + step_size = 1 / PRECISION - for wave_index in range(waves+1): + for wave_index in range(waves + 1): points = [] x = 0 while x < 1: # step along, create points along the wave y = amplitude * math.sin(frequency * x + (wave_index * WAVE_OFFSET)) - points.append((x, (y + (0.5 + wave_index)*wave_height))) + points.append((x, (y + (0.5 + wave_index) * wave_height))) x += step_size - #print(f'Draw {len(points)} points for curve {num}') + # print(f'Draw {len(points)} points for curve {num}') else: # make more transparent toward bottom - ctx.set_source_rgba(r, g, b, 1 - (alpha_step * wave_index)) + ctx.set_source_rgba(r, g, b, 1 - (alpha_step * wave_index)) # draw waves ctx.move_to(*points[0]) for p in points[1:]: @@ -83,11 +87,13 @@ def create_wpotd(width: int, height: int, date: datetime = datetime.now(), dark: ctx.fill() lastpoints = points return surface - #surface.write_to_png(output) # Output to PNG + # surface.write_to_png(output) # Output to PNG + def main(): output = create_wpotd(1920, 1080, dark=False) - output.write_to_png('out/waves.png') + output.write_to_png("out/waves.png") + -if __name__ == '__main__': +if __name__ == "__main__": main()