from idorudraw import beginTrianglesEntity, triangle def avg(x, y): return (x+y)/2.0 # Do not use triangle strips: too short, consume too much entities def quad(x0, y0, x1, y1, x2, y2, x3, y3): triangle(x0, y0, x1, y1, x3, y3) triangle(x1, y1, x2, y2, x3, y3) def cell(x0, y0, x1, y1, x2, y2, x3, y3): x01 = avg(x0, x1); y01 = avg(y0, y1) x12 = avg(x1, x2); y12 = avg(y1, y2) return [x0, y0, x01, y0, x01, y12, x0, y12, x01, y0, x1, y0, x1, y12, x01, y12, x0, y12, x01, y12, x01, y2, x3, y2] # TODO: simplify; several values are probably redundant # The result? When setting n big enough the fractal is # undistinguishable from a sierpinski triangle def tile(x0 = -10, y0 = -10, x1 = 10, y1 = -10, x2 = 10, y2 = 10, x3 = -10, y3 = 10, n = 4): beginTrianglesEntity() s = cell(x0, y0, x1, y1, x2, y2, x3, y3) for i in range(1, n): r = s s = [] # for j in range((cellinput.len/celloutput.len)**i) for j in range(3.0 ** i): s.extend(cell(r[j*8 + 0], r[j*8 + 1], r[j*8 + 2], r[j*8 + 3], r[j*8 + 4], r[j*8 + 5], r[j*8 + 6], r[j*8 + 7])) for i in range(3.0**n): quad(s[i*8 + 0], s[i*8 + 1], s[i*8 + 2], s[i*8 + 3], s[i*8 + 4], s[i*8 + 5], s[i*8 + 6], s[i*8 + 7])