# Hi! I'm the artist and creater of this code, I'm going to explain every function and block
# Import libraries for the fuctions we're going to need
import random
import math
from math import sqrt
def random_paintbrush():
"""main function"""
# Create a welcoming user interface
print('Velkommen til Random Paintbrush!')
print('Beskriv ditt format i millimeter')
# For practical reasons set canvas dimensions from user, idealy this would also be randomized
x = int(input('Hva er bredden (mm): '))
y = int(input('Hva er lengden (mm): '))
# Generate a random number of strokes
num_strokes = random.randint(1, 20)
for _ in range(num_strokes):
values(x, y)
print(f"\nTegningen er ferdig med {num_strokes} strøk!")
def values(x, y):
"""Generate a random stroke with random attributes: point d'accrochage, direction, colour and length"""
# Set point d'accrochage at random
startpunkt_x = random.randint(0, x)
startpunkt_y = random.randint(0, y)
startpunkt = f"({startpunkt_x}, {startpunkt_y})"
# Random stroke direction in degrees
strøk_retning = random.randint(0, 360)
# Random stroke colour using RGB scale
farge = f"rgb({random.randint(0, 255)}, {random.randint(0, 255)}, {random.randint(0, 255)})"
# Determine max possible stroke length as to not exceed the format
max_lengde_strøk = max_length_stroke(x, y, startpunkt_x, startpunkt_y, strøk_retning)
strøk_lengde = random.randint(0, int(max_lengde_strøk))
# Give the attributes back to main function
print(f"Start: {startpunkt}, Retning: {strøk_retning}°, Lengde: {strøk_lengde} mm, Farge: {farge}")
def max_length_stroke(x_tot, y_tot, startpunkt_x, startpunkt_y, strøk_retning):
"""Calculate max stroke length based on format and rotation"""
# Set the distances from point d'accrochage to each "wall" in the format
x1, y1 = x_tot - startpunkt_x, y_tot - startpunkt_y
x0, y0 = startpunkt_x, startpunkt_y
# Use Pythagoras theorem to find every diogonal line from point d'accrochage to the corners
p1, p2, p3, p4 = sqrt(x1**2 + y1**2), sqrt(x0**2 + y1**2), sqrt(y0**2 + x0**2), sqrt(x1**2 + y0**2)
# Using the sinus function, identify the degree of the angels a, b, c and d between the horisontal+vertical and diagonal lines
# This is needed to identify witch length from the point d'accrochage is needed in the calucation of the max stroke lenght
vinkel_a = math.degrees(math.asin(y1 / p1)),
vinkel_b = math.degrees(math.asin(y1 / p2))
vinkel_c = math.degrees(math.asin(y0 / p3))
vinkel_d = math.degrees(math.asin(y0 / p4))
# Set the length needed in clalculation of max stroke length
if 0 <= strøk_retning < vinkel_a or 360 - vinkel_d <= strøk_retning <= 360:
lengde = x1
elif vinkel_a <= strøk_retning < 180 - vinkel_b:
lengde = y1
elif 180 - vinkel_b <= strøk_retning < 180 + vinkel_c:
lengde = x0
else:
lengde = y0
# Return the max stroke length using the cosinus function and the correct lenght and degree values
return abs(lengde / math.cos(math.radians(strøk_retning)))
# Set of the main function
random_paintbrush()