baleine.py

Created by arthurmichel-scolaire

Created on January 12, 2026

2.84 KB


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

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.