from idorudraw import beginTrianglesEntity, triangle from math import sqrt def avg(x, y): return (x+y)/2.0 def cell(x1, y1, x2, y2, x3, y3, z1=0, z2=0, z3=0): """ Toma un triángulo, devuelve una lista de tres triángulos """ r = range(18) r[0] = x1; r[1] = y1; r[2] = z1 r[3] = avg(x1, x2); r[4] = avg(y1, y2); r[5] = avg(z1, z2) r[6] = x2; r[7] = y2; r[8] = z2 r[9] = avg(x2, x3); r[10] = avg(y2, y3); r[11] = avg(z2, z3) r[12] = x3; r[13] = y3; r[14] = z3 r[15] = avg(x3, x1); r[16] = avg(y3, y1); r[17] = avg(z3, z1) s = [ r[0], r[1], r[2], r[3], r[4], r[5], r[15], r[16], r[17], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[9], r[10], r[11], r[12], r[13], r[14], r[15], r[16], r[17] ] return s ## The default parameters draw an equilateral triangle of side 64 def pyramid(x1 = -32, y1 = -64 * sqrt(3.0)/6.0, x2 = 32, y2 = -64 * sqrt(3.0)/6.0, x3 = 0, y3 = 64 * sqrt(3.0)/3.0, z1=0, z2=0, z3=0, n=4): beginTrianglesEntity(1) s = cell(x1, y1, x2, y2, x3, y3, z1, z2, z3) for i in range(1, n): r = s s = [] for j in range(3.0**i): s.extend( cell(r[j*9+0], r[j*9+1], r[j*9+3], r[j*9+4], r[j*9+6], r[j*9+7], r[j*9+2], r[j*9+5], r[j*9+8] )) for i in range(3.0**n): triangle( s[i*9+0], s[i*9+1], s[i*9+3], s[i*9+4], s[i*9+6], s[i*9+7], s[i*9+2], s[i*9+5], s[i*9+8])