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)