from visual import * from random import random # A corner is a point in 3D, so a 3-tuple like this: (x, y, z) def halfway_between(p1, p2): x1, y1, z1 = p1 x2, y2, z2 = p2 def avg(a, b): return (a + b) / 2.0 return (avg(x1, x2), avg(y1, y2), avg(z1, z2)) def draw_mesh(corners, divs_left): c1, c2, c3, c4 = corners c1 = (c1[0], c1[2], random() * 3) c2 = (c2[0], c2[2], random() * 3) c3 = (c3[0], c3[2], random() * 3) c4 = (c4[0], c4[2], random() * 3) # Base case: No more divs left! if not divs_left: print("Drawing curve: ", corners) curve(pos=[c1, c2, c3, c4, c1], radius=0.5) sphere(pos=c1) sphere(pos=c2) sphere(pos=c3) sphere(pos=c4) return # General case: We have some divs left s12 = halfway_between(c1, c2) s23 = halfway_between(c2, c3) s34 = halfway_between(c3, c4) s41 = halfway_between(c4, c1) cent = halfway_between(c4, c2) draw_mesh((c1, s12, cent, s41), divs_left-1) draw_mesh((s12, c2, s23, cent), divs_left-1) draw_mesh((cent, s23, c3, s34), divs_left-1) draw_mesh((s41, cent, s34, c4), divs_left-1) draw_mesh([(10, 10, -5), (10, -10, 5), (-10, -10, -5), (-10, 10, 5)], 3)