more params, refactor

main
Felix Pankratz 2 months ago
parent 5c1d524ee0
commit 0282fa1123

@ -10,23 +10,14 @@ from utils import random_color
# dimensions of the output image # dimensions of the output image
WIDTH, HEIGHT = 1920, 1080
# how much should the phases be offset? # 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
# amplitude of the sine wave
#AMPLITUDE = 9
# only 1 color with shades?
MONOCHROME = True
# works only if monochrome is set - uses todays date as base for the color
DATE_BASED_COLOR = True
DATE_BASED_AMPLITUDE = True
DATE_BASED_COUNT = True
# background black? White otherwise: # background black? White otherwise:
DARK_BG = True DARK_BG = True
# precision of the calculation # precision of the calculation
PRECISION = 10000 PRECISION = 10000
def days_color(date: datetime) -> tuple[float, float, float]: 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) # a day between 1 and 365 (inclusive)
today = date.timetuple().tm_yday today = date.timetuple().tm_yday
@ -35,14 +26,13 @@ def days_color(date: datetime) -> tuple[float, float, float]:
progress = today/days_in_year progress = today/days_in_year
return colorsys.hsv_to_rgb(progress, 1, 0.9) return colorsys.hsv_to_rgb(progress, 1, 0.9)
def days_amp(date: datetime, waves) -> float: 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] days_in_month = calendar.monthrange(date.year, date.month)[1]
max_amp = 1/waves/2 max_amp = 1/waves/2
return date.day/days_in_month * max_amp return date.day/days_in_month * max_amp
def create_wpotd(width: int, height: int): def create_wpotd(width: int, height: int, date: datetime = datetime.now(), dark: bool = True) -> cairo.ImageSurface:
#TODO: return a `file`-like object
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(surface) ctx = cairo.Context(surface)
@ -51,36 +41,25 @@ def create_wpotd(width: int, height: int):
lastpoints = [(x/PRECISION, 0) for x in range(PRECISION+1)] lastpoints = [(x/PRECISION, 0) for x in range(PRECISION+1)]
date = datetime.today()
frequency = random.randint(10, 40) frequency = random.randint(10, 40)
if DATE_BASED_COUNT: waves = date.month
# generate as many waves as the number of the current month amplitude = get_amplitude_from_date(date, waves)
waves = date.month
else: r, g, b = get_color_from_date(date)
waves = 12
if DATE_BASED_AMPLITUDE:
amplitude = days_amp(date, waves)
else:
amplitude = 25
if MONOCHROME:
if DATE_BASED_COLOR:
r, g, b = days_color(date) #datetime.datetime.now())
else:
r, g, b = random_color()
alpha_step = 1/waves alpha_step = 1/waves
if DARK_BG: ctx.rectangle(0, 0, 1, 1)
if dark:
# make bg black # make bg black
ctx.rectangle(0, 0, 1, 1)
ctx.set_source_rgb(0, 0, 0) ctx.set_source_rgb(0, 0, 0)
ctx.fill() else:
ctx.set_source_rgb(255, 255, 255)
ctx.fill()
wave_height = 1/waves wave_height = 1/waves
step_size = 1/PRECISION step_size = 1/PRECISION
for wave_index in range(waves+1): for wave_index in range(waves+1):
if not MONOCHROME:
r, g, b = random_color()
points = [] points = []
x = 0 x = 0
while x < 1: while x < 1:
@ -89,8 +68,6 @@ def create_wpotd(width: int, height: int):
points.append((x, (y + (0.5 + wave_index)*wave_height))) points.append((x, (y + (0.5 + wave_index)*wave_height)))
x += step_size x += step_size
#print(f'Draw {len(points)} points for curve {num}') #print(f'Draw {len(points)} points for curve {num}')
if not MONOCHROME:
ctx.set_source_rgb(r, g, b)
else: else:
# make more transparent toward bottom # 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))
@ -109,7 +86,7 @@ def create_wpotd(width: int, height: int):
#surface.write_to_png(output) # Output to PNG #surface.write_to_png(output) # Output to PNG
def main(): def main():
output = create_wpotd(1920, 1080) 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__':

Loading…
Cancel
Save