# -*- coding: utf-8 -*-
"""
Created on Sun Aug  3 15:46:49 2025

@author: Stéphane Pasquet
"""

from math import pi, cos, sin
from PIL import Image, ImageDraw, ImageFont
from random import randint

width = 1748
height = 1240

tree = Image.new('RGB', (width,height), (255,255,255))
draw = ImageDraw.Draw(tree,'RGBA')

theta = pi/180 * 22.5
L = 150 # longueur de l'arête du premier carré
A = (width/2 - L/2 +100, height-250)
B = (width/2 + L/2 +100, height-250)

centres = []

def sim(centre, point, angle, k):
    # angle devient "-angle" dans les sinus à cause de la logique graphique de PIL
    x = centre[0] + k*(point[0]-centre[0])*cos(angle)-k*(point[1]-centre[1])*sin(-angle)
    y = centre[1] + k*(point[0]-centre[0])*sin(-angle)+k*(point[1]-centre[1])*cos(angle)
    
    return x,y
 
def arbre(A,B,angle,n):
    if (n==0) or (length(A,B)<8): return 
    
    global centres
    
    C = sim(B,A,-pi/2,1)
    D = sim(A,B,pi/2,1)
    E = sim(D,C,angle,cos(angle))
    
    centres.append(((A[0]+C[0])/2,(A[1]+C[1])/2))
    
    draw.polygon([A,B,C,D], fill=(randint(0,255),randint(0,255),randint(0,255),125))
    
    arbre(D, E, angle, n-1)
    arbre(E, C, angle, n-1)

def length(A,B):
    return (A[0]-B[0])**2 + (A[1]-B[1])**2
    
def diam():
    global centres
    origine = centres[0] # premier centre
    d = 0
    
    for c in centres:
        if c != origine:
            distance = length(origine,c) #(origine[0]-c[0])**2 + (origine[1]-c[1])**2
            if distance > d:
                d = distance
                faraway = c
                
    return d**0.5, faraway

arbre(A,B,theta,70)
diametre = f"Diamètre de l'arbre: {diam()[0]}"
draw.text((10,10), diametre, font=ImageFont.truetype("arial.ttf", size=30), fill=(0, 0, 0, 255))
# on trace le diamètre
draw.line([centres[0],diam()[1]],fill=(100,100,100),width=1) 

tree.show()
