from kandinsky import * from math import sqrt, sin, pi def d(x,y,r,c): # Optimisation: ne dessine que si dans l'ecran if x+r<0 or x-r>320 or y+r<0 or y-r>222: return for i in range(-r,r+1): for j in range(-r,r+1): if i*i+j*j<=r*r: set_pixel(int(x+i),int(y+j),c) # --- COULEURS --- Ciel = (176, 224, 230) # Bleu poudre Mer_Haut = (0, 105, 148) # Bleu ocean surface Mer_Bas = (0, 50, 90) # Bleu abysses Baleine = (70, 80, 100) # Gris-Bleu Ventre = (220, 230, 240) # Blanc cassé Eau = (135, 206, 250) # Cyan clair (bulles) # 1. LE FOND (Degradé de cercles) # On remplit tout en bleu foncé d'abord fill_rect(0,0,320,222,Mer_Bas) # On dessine le ciel (rectangle via cercles est trop long, on triche avec fill_rect pour le fond uni) fill_rect(0,0,320,60,Ciel) # On cree la surface de l'eau avec des cercles for x in range(0, 340, 15): d(x, 65, 20, Mer_Haut) d(x+7, 75, 20, Mer_Haut) # Quelques rayons de lumiere dans l'eau (grands disques clairs) for i in range(5): d(50+i*60, 90+i*10, 30, (0, 80, 120)) # 2. LA BALEINE # Forme: Une grosse goutte d'eau horizontale # On parcourt de la tete (gauche) vers la queue (droite) bx_start = 60 by_start = 140 for i in range(140): # x avance x = bx_start + i # y ondule legerement y = by_start + 5 * sin(i/40) # Le rayon diminue doucement pour faire le corps effilé # Formule math: r basee sur une parabole inversée ou décroissance linéaire if i < 40: r = 35 # Tete constante else: r = 35 - (i-40)*0.3 # Corps qui s'affine if r < 2: break # Arret si trop fin # Corps (Dos) d(x, y, r, Baleine) # Ventre (Disque decale vers le bas et plus petit) d(x, y+8, r-4, Ventre) # Oeil (Petit disque noir + reflet) d(75, 135, 3, (0,0,0)) d(76, 134, 1, (255,255,255)) # Nageoire laterale (Forme ovale faite de cercles) for k in range(15): nx = 100 + k ny = 155 + k d(nx, ny, 8-k/2, Baleine) # 3. LA QUEUE (Nageoire caudale) qx = x # Fin du corps qy = y # Lobe haut for k in range(20): d(qx+k, qy-k, 6+k/2, Baleine) # Lobe bas for k in range(20): d(qx+k, qy+k, 6+k/2, Baleine) # 4. JET D'EAU (C'est un mammifère !) # Plein de petits cercles blancs qui sortent de l'event (tête) event_x = 85 event_y = 105 # Haut du dos for k in range(30): # Dispersion aleatoire simulée dx = (k*7)%15 - 7 dy = k * 2 taille = 4 - k/10 d(event_x + dx, event_y - dy, taille, (255,255,255)) # 5. BULLES D'AIR SOUS L'EAU bulles = [(140, 180), (160, 120), (280, 200), (200, 90), (30, 200)] for bx, by in bulles: d(bx, by, 4, Eau) d(bx+1, by-1, 1, (255,255,255)) # Reflet # 6. UN PETIT POISSON (Pour l'echelle) px = 280; py = 150 d(px, py, 6, (255, 100, 100)) # Corps rouge d(px+6, py, 4, (255, 100, 100)) d(px-2, py, 2, (255,255,255)) # Oeil d(px+10, py-3, 3, (255, 100, 100)) # Queue haut d(px+10, py+3, 3, (255, 100, 100)) # Queue bas