New paste Repaste Download
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()
Filename: None. Size: 1kb. View raw, , hex, or download this file.

This paste expires on 2025-07-25 21:05:56.496292. Pasted through web.