I made a tree drawing thing a couple of years when I saw this vid, I recommend checking out some of his other videos, they aren’t in python but it’s some really nice concepts and he explains them in terms that can translate to other languages

from ui import ImageContext, Path, set_color, fill_rect from math import sin, cos, pi from random import random #help(random) def r(x, y, t): # t = t +(random() -0.5)*0.5 return x*cos(t) - y*sin(t), y*sin(t) + x*cos(t) class tree: def __init__(self): self.startlen = 50 self.maxit = 9 self.th = 5*pi/4 self.thl = pi/12 self.thr = -pi/12 self.p = Path() self.short = 0.85 self.size = 1000 def draw(self): self.p = Path() self.stopn = self.startlen * (self.short ** self.maxit) with ImageContext(self.size, self.size) as cx: set_color((255,255,255)) fill_rect(0,0,self.size, self.size) set_color((0,0,0)) self.p.line_width = 0.9 self.p.move_to(self.size/2, self.size) self.branch(self.startlen, self.size/2, self.size*4/5, 5*pi/4) self.p.stroke() cx.get_image().show() def branch(self, len, x, y, t): self.p.line_to(x, y) if len > self.stopn: self.p.move_to(x,y) x1, y1 = r(len, len, self.thl+t) self.branch(len*self.short, x+x1, y+y1, self.thl+t) self.p.move_to(x,y) x1, y1 = r(len, len, self.thr+t) self.branch(len*self.short, x+x1, y+y1, self.thr+t) #self.branch(len*self.short, x+x1, y+y1, self.thr+t) self.p.move_to(x,y) if __name__ == '__main__': s = tree() #s.thl += 0.25 #for i in range(100): s.draw()