more params, refactor
This commit is contained in:
parent
5c1d524ee0
commit
0282fa1123
45
waves.py
45
waves.py
@ -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:
|
|
||||||
# generate as many waves as the number of the current month
|
|
||||||
waves = date.month
|
waves = date.month
|
||||||
else:
|
amplitude = get_amplitude_from_date(date, waves)
|
||||||
waves = 12
|
|
||||||
if DATE_BASED_AMPLITUDE:
|
r, g, b = get_color_from_date(date)
|
||||||
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:
|
|
||||||
# make bg black
|
|
||||||
ctx.rectangle(0, 0, 1, 1)
|
ctx.rectangle(0, 0, 1, 1)
|
||||||
|
if dark:
|
||||||
|
# make bg black
|
||||||
ctx.set_source_rgb(0, 0, 0)
|
ctx.set_source_rgb(0, 0, 0)
|
||||||
|
else:
|
||||||
|
ctx.set_source_rgb(255, 255, 255)
|
||||||
ctx.fill()
|
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…
Reference in New Issue
Block a user