texte3d.py

Created by schraf

Created on October 10, 2022

1.67 KB


from kandinsky import fill_rect, set_pixel
from math import *

# Codage du mot 31415
mot=[32767,32767,32767,0,29975,0,0,17684,0,0,30166,0,0,5460,0,0,30039,0]

fill_rect(0,0,320,222,(0,0,0))

# remplissage parallelogramme
def remplir(a, b, c, d, coul):
  (ax,ay) = a
  (bx,by) = b
  (cx,cy) = c
  (dx,dy) = d
  for col in range(min(ax,bx,cx,dx), max(ax,bx,cx,dx)+1):
    for lig in range(min(ay,by,cy,dy), max(ay,by,cy,dy)+1):
      xa, xb, xc, xd = ax - col, bx - col, cx - col, dx - col 
      ya, yb, yc, yd = ay - lig, by - lig, cy - lig, dy - lig
      d1, d2, d3, d4 = xa*yb-ya*xb, xb*yc-yb*xc, xc*yd-yc*xd, xd*ya-yd*xa
      u, v, w, t = copysign(1,d1), copysign(1,d2), copysign(1,d3), copysign(1,d4)
      if u == v and v == w and w == t:
       if  d1*d2*d3*d4 == 0: co = (0,0,0)
       else: co = coul
       set_pixel(col,222 - lig,co)

def cube(x, y, z):
  (tx, ty, tz) = (3 - x, y, 15 - z)
  (x2, y2, z2) = (x, y, z - 1)
  # Doit on afficher le cube ?
  if mot[3 * ty + tx] >> tz & 1:
    trait(x, y, z, ((1, 0, 0), (0, 0, -1), (-1, 0, 0)), (150-10*z,)*3)
    trait(x, y, z, ((0, -1, 0), (0, 0, -1), (0, 1, 0)), (255-10*z,)*3)
    trait(x2, y2, z2, ((1, 0, 0), (0, -1, 0), (-1, 0, 0)), (255-10*z,0,0))

# Une face
def trait(x,y,z,dd,coul):
  coord = [pos2D(x, y, z)]
  for d in dd:
    (x, y, z) = (x + d[0], y + d[1], z + d[2])
    coord.append(pos2D(x, y, z))
  remplir(coord[0], coord[1], coord[2], coord[3], coul)

# Coord 3D vers 2D
def pos2D(x, y, z):
  t = x + z + y * 2
  w = 300 / (30 + x + z)
  return (int(210 + (x-z) * 2 * w), int(30 + t * w))

# On parcourt tous les cubes
for a in range(3, 0, -1):
  for b in range(6):
    for c in range(15, 0, -1):
      cube(a, b, c)