from openscad import * from math import * def mean(p1,p2,r): pm = [(p1[i]+p2[i])/2.0 for i in range(3) ] f=r/sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]) return [pm[i]*f for i in range(3) ] def geodesic(r,n): if n == 0: yield [[ 0,-r,0],[r, 0, 0],[0,0, r]] yield [[ r, 0,0],[0, r, 0],[0,0, r]] yield [[ 0, r,0],[-r, 0,0],[0,0, r]] yield [[-r, 0,0],[0, -r,0],[0,0, r]] yield [[ 0, r,0],[r, 0, 0],[0,0,-r]] yield [[-r, 0,0],[0, r, 0],[0,0,-r]] yield [[ 0,-r,0],[-r, 0,0],[0,0,-r]] yield [[ r, 0,0],[0, -r,0],[0,0,-r]] else: for p1,p2,p3 in geodesic(r,n-1): p12=mean(p1,p2,r) p23=mean(p2,p3,r) p31=mean(p3,p1,r) yield [p1, p12, p31] yield [p2, p23, p12] yield [p3, p31, p23] yield [p12,p23, p31] vertices = [] triangles = [] cols = [] ptmap = {} def find_index(pt): key="%g/%g/%g"%(pt[0],pt[1],pt[2]) if not key in ptmap: ptmap[key]=len(vertices) vertices.append(pt) return ptmap[key] r=10 for tri in geodesic(r,3): triangles.append([find_index(tri[0]),find_index(tri[1]),find_index(tri[2]) ]) cols.append([abs(tri[0][i]+tri[1][i]+tri[2][i])/(3*r) for i in range(3) ]) polyhedron(vertices, triangles, colors=cols).show()