Skip to content

Instantly share code, notes, and snippets.

@machinaut
Last active August 19, 2023 19:27
Show Gist options
  • Save machinaut/15fc8021db676abcda576b12555386e1 to your computer and use it in GitHub Desktop.
Save machinaut/15fc8021db676abcda576b12555386e1 to your computer and use it in GitHub Desktop.
Subdivide Icosahedrons to make nice spheres
#!/usr/bin/env python
from itertools import combinations, chain
import numpy as np
from pyhull.convex_hull import ConvexHull
from stl import Mode
from stl.mesh import Mesh
def subdivide(shape):
''' Take a triangulated sphere and subdivide each face. '''
# https://gamedevdaily.io/d7956b825db4 - Icosahedron section
hull = ConvexHull(shape) # Use this to get a list of vertices (faces).
radius = np.mean(np.linalg.norm(shape, axis=1)) # Estimate radius
edges = set(chain(*[combinations(v, 2) for v in hull.vertices]))
midpoints = np.mean(hull.points.take(list(edges), axis=0), axis=1)
newpoints = midpoints / np.linalg.norm(midpoints, axis=1)[:, None] * radius
return np.vstack((hull.points, newpoints)) # Add new points to old points
def points_to_mesh(points):
''' Given a set points, make a STL mesh of the convex hull. '''
hull = ConvexHull(points)
mesh = Mesh(np.zeros(len(hull.vertices), dtype=Mesh.dtype))
for i, vertex in enumerate(hull.vertices):
mesh.vectors[i] = hull.points[vertex][::-1] # Turn it inside out
return mesh
# Construct Icosahedron from 3 Golden Rectangles
phi = (1 + 5 ** .5) / 2 # Golden ratio
plane = np.dstack(np.meshgrid([1, -1], [phi, -phi], [0])).reshape(-1, 3)
icosahedron = np.vstack([np.roll(plane, i) for i in range(3)])
# Save to STL files so we can view in GitHub
sphere = icosahedron
for i in range(4):
points_to_mesh(sphere).save('sphere{}.stl'.format(i), mode=Mode.ASCII)
sphere = subdivide(sphere) # Finer spheres by subdividing
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
solid sphere1.stl
facet normal 0.270175 0.951057 0.196294
outer loop
vertex 0.000000 1.902113 0.000000
vertex 0.587785 1.538842 0.951057
vertex 1.000000 1.618034 0.000000
endloop
endfacet
facet normal -0.196294 0.270175 0.951057
outer loop
vertex 0.000000 0.000000 1.902113
vertex 0.000000 1.000000 1.618034
vertex -0.951057 0.587785 1.538842
endloop
endfacet
facet normal 0.196294 0.270175 0.951057
outer loop
vertex 0.000000 0.000000 1.902113
vertex 0.951057 0.587785 1.538842
vertex 0.000000 1.000000 1.618034
endloop
endfacet
facet normal 0.317610 0.587785 0.754763
outer loop
vertex 0.587785 1.538842 0.951057
vertex 0.000000 1.000000 1.618034
vertex 0.951057 0.587785 1.538842
endloop
endfacet
facet normal -0.270175 0.951057 -0.196294
outer loop
vertex 0.000000 1.902113 0.000000
vertex -0.587785 1.538842 -0.951057
vertex -1.000000 1.618034 0.000000
endloop
endfacet
facet normal 0.270175 -0.951057 -0.196294
outer loop
vertex 0.000000 -1.902113 0.000000
vertex 0.587785 -1.538842 -0.951057
vertex 1.000000 -1.618034 0.000000
endloop
endfacet
facet normal 0.000000 -1.118034 -0.427051
outer loop
vertex 0.000000 -1.902113 0.000000
vertex -0.587785 -1.538842 -0.951057
vertex 0.587785 -1.538842 -0.951057
endloop
endfacet
facet normal -0.754763 0.317610 0.587785
outer loop
vertex -0.951057 0.587785 1.538842
vertex -1.538842 0.951057 0.587785
vertex -1.618034 0.000000 1.000000
endloop
endfacet
facet normal -0.951057 0.196294 0.270175
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.618034 0.000000 1.000000
vertex -1.538842 0.951057 0.587785
endloop
endfacet
facet normal 0.427051 0.000000 -1.118034
outer loop
vertex 0.000000 0.000000 -1.902113
vertex 0.951057 0.587785 -1.538842
vertex 0.951057 -0.587785 -1.538842
endloop
endfacet
facet normal 0.633446 0.000000 -0.784079
outer loop
vertex 1.618034 0.000000 -1.000000
vertex 0.951057 -0.587785 -1.538842
vertex 0.951057 0.587785 -1.538842
endloop
endfacet
facet normal 0.587785 0.754763 0.317610
outer loop
vertex 0.587785 1.538842 0.951057
vertex 1.538842 0.951057 0.587785
vertex 1.000000 1.618034 0.000000
endloop
endfacet
facet normal 0.690983 0.690983 0.690983
outer loop
vertex 0.587785 1.538842 0.951057
vertex 0.951057 0.587785 1.538842
vertex 1.538842 0.951057 0.587785
endloop
endfacet
facet normal 0.754763 0.317610 0.587785
outer loop
vertex 0.951057 0.587785 1.538842
vertex 1.618034 0.000000 1.000000
vertex 1.538842 0.951057 0.587785
endloop
endfacet
facet normal 0.951057 0.196294 0.270175
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.538842 0.951057 0.587785
vertex 1.618034 0.000000 1.000000
endloop
endfacet
facet normal -0.690983 0.690983 0.690983
outer loop
vertex -0.951057 0.587785 1.538842
vertex -0.587785 1.538842 0.951057
vertex -1.538842 0.951057 0.587785
endloop
endfacet
facet normal -0.317610 0.587785 0.754763
outer loop
vertex -0.951057 0.587785 1.538842
vertex 0.000000 1.000000 1.618034
vertex -0.587785 1.538842 0.951057
endloop
endfacet
facet normal -0.587785 0.754763 0.317610
outer loop
vertex -1.538842 0.951057 0.587785
vertex -0.587785 1.538842 0.951057
vertex -1.000000 1.618034 0.000000
endloop
endfacet
facet normal 0.000000 0.784079 0.633446
outer loop
vertex 0.587785 1.538842 0.951057
vertex -0.587785 1.538842 0.951057
vertex 0.000000 1.000000 1.618034
endloop
endfacet
facet normal 0.000000 1.118034 0.427051
outer loop
vertex 0.000000 1.902113 0.000000
vertex -0.587785 1.538842 0.951057
vertex 0.587785 1.538842 0.951057
endloop
endfacet
facet normal -0.270175 0.951057 0.196294
outer loop
vertex 0.000000 1.902113 0.000000
vertex -1.000000 1.618034 0.000000
vertex -0.587785 1.538842 0.951057
endloop
endfacet
facet normal 0.951057 -0.196294 0.270175
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.618034 0.000000 1.000000
vertex 1.538842 -0.951057 0.587785
endloop
endfacet
facet normal 0.000000 -1.118034 0.427051
outer loop
vertex 0.000000 -1.902113 0.000000
vertex 0.587785 -1.538842 0.951057
vertex -0.587785 -1.538842 0.951057
endloop
endfacet
facet normal 0.270175 -0.951057 0.196294
outer loop
vertex 0.000000 -1.902113 0.000000
vertex 1.000000 -1.618034 0.000000
vertex 0.587785 -1.538842 0.951057
endloop
endfacet
facet normal 0.587785 -0.754763 0.317610
outer loop
vertex 1.000000 -1.618034 0.000000
vertex 1.538842 -0.951057 0.587785
vertex 0.587785 -1.538842 0.951057
endloop
endfacet
facet normal -0.951057 -0.196294 -0.270175
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.618034 0.000000 -1.000000
vertex -1.538842 -0.951057 -0.587785
endloop
endfacet
facet normal -0.427051 0.000000 1.118034
outer loop
vertex 0.000000 0.000000 1.902113
vertex -0.951057 0.587785 1.538842
vertex -0.951057 -0.587785 1.538842
endloop
endfacet
facet normal -0.633446 0.000000 0.784079
outer loop
vertex -0.951057 0.587785 1.538842
vertex -1.618034 0.000000 1.000000
vertex -0.951057 -0.587785 1.538842
endloop
endfacet
facet normal -0.000000 -0.784079 -0.633446
outer loop
vertex 0.587785 -1.538842 -0.951057
vertex -0.587785 -1.538842 -0.951057
vertex 0.000000 -1.000000 -1.618034
endloop
endfacet
facet normal 0.196294 -0.270175 -0.951057
outer loop
vertex 0.000000 0.000000 -1.902113
vertex 0.951057 -0.587785 -1.538842
vertex 0.000000 -1.000000 -1.618034
endloop
endfacet
facet normal 0.317610 -0.587785 -0.754763
outer loop
vertex 0.587785 -1.538842 -0.951057
vertex 0.000000 -1.000000 -1.618034
vertex 0.951057 -0.587785 -1.538842
endloop
endfacet
facet normal 0.000000 1.118034 -0.427051
outer loop
vertex 0.000000 1.902113 0.000000
vertex 0.587785 1.538842 -0.951057
vertex -0.587785 1.538842 -0.951057
endloop
endfacet
facet normal 0.270175 0.951057 -0.196294
outer loop
vertex 0.000000 1.902113 0.000000
vertex 1.000000 1.618034 0.000000
vertex 0.587785 1.538842 -0.951057
endloop
endfacet
facet normal -0.784079 0.633446 0.000000
outer loop
vertex -1.538842 0.951057 0.587785
vertex -1.000000 1.618034 0.000000
vertex -1.538842 0.951057 -0.587785
endloop
endfacet
facet normal -1.118034 0.427051 0.000000
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.538842 0.951057 0.587785
vertex -1.538842 0.951057 -0.587785
endloop
endfacet
facet normal -0.951057 0.196294 -0.270175
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.538842 0.951057 -0.587785
vertex -1.618034 0.000000 -1.000000
endloop
endfacet
facet normal -0.690983 0.690983 -0.690983
outer loop
vertex -0.587785 1.538842 -0.951057
vertex -0.951057 0.587785 -1.538842
vertex -1.538842 0.951057 -0.587785
endloop
endfacet
facet normal -0.587785 0.754763 -0.317610
outer loop
vertex -0.587785 1.538842 -0.951057
vertex -1.538842 0.951057 -0.587785
vertex -1.000000 1.618034 0.000000
endloop
endfacet
facet normal -0.754763 0.317610 -0.587785
outer loop
vertex -0.951057 0.587785 -1.538842
vertex -1.618034 0.000000 -1.000000
vertex -1.538842 0.951057 -0.587785
endloop
endfacet
facet normal 0.951057 -0.196294 -0.270175
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.538842 -0.951057 -0.587785
vertex 1.618034 0.000000 -1.000000
endloop
endfacet
facet normal 1.118034 -0.427051 0.000000
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.538842 -0.951057 0.587785
vertex 1.538842 -0.951057 -0.587785
endloop
endfacet
facet normal 0.784079 -0.633446 0.000000
outer loop
vertex 1.000000 -1.618034 0.000000
vertex 1.538842 -0.951057 -0.587785
vertex 1.538842 -0.951057 0.587785
endloop
endfacet
facet normal 0.690983 -0.690983 -0.690983
outer loop
vertex 0.587785 -1.538842 -0.951057
vertex 0.951057 -0.587785 -1.538842
vertex 1.538842 -0.951057 -0.587785
endloop
endfacet
facet normal 0.587785 -0.754763 -0.317610
outer loop
vertex 0.587785 -1.538842 -0.951057
vertex 1.538842 -0.951057 -0.587785
vertex 1.000000 -1.618034 0.000000
endloop
endfacet
facet normal 0.754763 -0.317610 -0.587785
outer loop
vertex 1.618034 0.000000 -1.000000
vertex 1.538842 -0.951057 -0.587785
vertex 0.951057 -0.587785 -1.538842
endloop
endfacet
facet normal 0.000000 -0.784079 0.633446
outer loop
vertex -0.587785 -1.538842 0.951057
vertex 0.587785 -1.538842 0.951057
vertex 0.000000 -1.000000 1.618034
endloop
endfacet
facet normal -0.196294 -0.270175 0.951057
outer loop
vertex 0.000000 0.000000 1.902113
vertex -0.951057 -0.587785 1.538842
vertex 0.000000 -1.000000 1.618034
endloop
endfacet
facet normal -0.317610 -0.587785 0.754763
outer loop
vertex -0.587785 -1.538842 0.951057
vertex 0.000000 -1.000000 1.618034
vertex -0.951057 -0.587785 1.538842
endloop
endfacet
facet normal -0.690983 -0.690983 0.690983
outer loop
vertex -0.587785 -1.538842 0.951057
vertex -0.951057 -0.587785 1.538842
vertex -1.538842 -0.951057 0.587785
endloop
endfacet
facet normal -0.754763 -0.317610 0.587785
outer loop
vertex -1.618034 0.000000 1.000000
vertex -1.538842 -0.951057 0.587785
vertex -0.951057 -0.587785 1.538842
endloop
endfacet
facet normal -0.951057 -0.196294 0.270175
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.538842 -0.951057 0.587785
vertex -1.618034 0.000000 1.000000
endloop
endfacet
facet normal -1.118034 -0.427051 0.000000
outer loop
vertex -1.902113 0.000000 0.000000
vertex -1.538842 -0.951057 -0.587785
vertex -1.538842 -0.951057 0.587785
endloop
endfacet
facet normal -0.690983 -0.690983 -0.690983
outer loop
vertex -0.587785 -1.538842 -0.951057
vertex -1.538842 -0.951057 -0.587785
vertex -0.951057 -0.587785 -1.538842
endloop
endfacet
facet normal -0.754763 -0.317610 -0.587785
outer loop
vertex -1.618034 0.000000 -1.000000
vertex -0.951057 -0.587785 -1.538842
vertex -1.538842 -0.951057 -0.587785
endloop
endfacet
facet normal -0.317610 -0.587785 -0.754763
outer loop
vertex -0.587785 -1.538842 -0.951057
vertex -0.951057 -0.587785 -1.538842
vertex 0.000000 -1.000000 -1.618034
endloop
endfacet
facet normal -0.427051 0.000000 -1.118034
outer loop
vertex 0.000000 0.000000 -1.902113
vertex -0.951057 -0.587785 -1.538842
vertex -0.951057 0.587785 -1.538842
endloop
endfacet
facet normal -0.633446 -0.000000 -0.784079
outer loop
vertex -0.951057 0.587785 -1.538842
vertex -0.951057 -0.587785 -1.538842
vertex -1.618034 0.000000 -1.000000
endloop
endfacet
facet normal -0.196294 -0.270175 -0.951057
outer loop
vertex 0.000000 0.000000 -1.902113
vertex 0.000000 -1.000000 -1.618034
vertex -0.951057 -0.587785 -1.538842
endloop
endfacet
facet normal -0.317610 0.587785 -0.754763
outer loop
vertex -0.587785 1.538842 -0.951057
vertex 0.000000 1.000000 -1.618034
vertex -0.951057 0.587785 -1.538842
endloop
endfacet
facet normal -0.196294 0.270175 -0.951057
outer loop
vertex 0.000000 0.000000 -1.902113
vertex -0.951057 0.587785 -1.538842
vertex 0.000000 1.000000 -1.618034
endloop
endfacet
facet normal 0.196294 0.270175 -0.951057
outer loop
vertex 0.000000 0.000000 -1.902113
vertex 0.000000 1.000000 -1.618034
vertex 0.951057 0.587785 -1.538842
endloop
endfacet
facet normal 0.000000 0.784079 -0.633446
outer loop
vertex -0.587785 1.538842 -0.951057
vertex 0.587785 1.538842 -0.951057
vertex 0.000000 1.000000 -1.618034
endloop
endfacet
facet normal 0.317610 0.587785 -0.754763
outer loop
vertex 0.951057 0.587785 -1.538842
vertex 0.000000 1.000000 -1.618034
vertex 0.587785 1.538842 -0.951057
endloop
endfacet
facet normal 0.690983 0.690983 -0.690983
outer loop
vertex 0.951057 0.587785 -1.538842
vertex 0.587785 1.538842 -0.951057
vertex 1.538842 0.951057 -0.587785
endloop
endfacet
facet normal 0.754763 0.317610 -0.587785
outer loop
vertex 1.618034 0.000000 -1.000000
vertex 0.951057 0.587785 -1.538842
vertex 1.538842 0.951057 -0.587785
endloop
endfacet
facet normal 0.587785 0.754763 -0.317610
outer loop
vertex 1.000000 1.618034 0.000000
vertex 1.538842 0.951057 -0.587785
vertex 0.587785 1.538842 -0.951057
endloop
endfacet
facet normal 0.951057 0.196294 -0.270175
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.618034 0.000000 -1.000000
vertex 1.538842 0.951057 -0.587785
endloop
endfacet
facet normal 1.118034 0.427051 0.000000
outer loop
vertex 1.902113 0.000000 0.000000
vertex 1.538842 0.951057 -0.587785
vertex 1.538842 0.951057 0.587785
endloop
endfacet
facet normal 0.784079 0.633446 0.000000
outer loop
vertex 1.000000 1.618034 0.000000
vertex 1.538842 0.951057 0.587785
vertex 1.538842 0.951057 -0.587785
endloop
endfacet
facet normal 0.754763 -0.317610 0.587785
outer loop
vertex 1.618034 0.000000 1.000000
vertex 0.951057 -0.587785 1.538842
vertex 1.538842 -0.951057 0.587785
endloop
endfacet
facet normal 0.690983 -0.690983 0.690983
outer loop
vertex 1.538842 -0.951057 0.587785
vertex 0.951057 -0.587785 1.538842
vertex 0.587785 -1.538842 0.951057
endloop
endfacet
facet normal 0.317610 -0.587785 0.754763
outer loop
vertex 0.587785 -1.538842 0.951057
vertex 0.951057 -0.587785 1.538842
vertex 0.000000 -1.000000 1.618034
endloop
endfacet
facet normal 0.633446 0.000000 0.784079
outer loop
vertex 0.951057 0.587785 1.538842
vertex 0.951057 -0.587785 1.538842
vertex 1.618034 0.000000 1.000000
endloop
endfacet
facet normal 0.427051 0.000000 1.118034
outer loop
vertex 0.000000 0.000000 1.902113
vertex 0.951057 -0.587785 1.538842
vertex 0.951057 0.587785 1.538842
endloop
endfacet
facet normal 0.196294 -0.270175 0.951057
outer loop
vertex 0.000000 0.000000 1.902113
vertex 0.000000 -1.000000 1.618034
vertex 0.951057 -0.587785 1.538842
endloop
endfacet
facet normal -0.270175 -0.951057 -0.196294
outer loop
vertex 0.000000 -1.902113 0.000000
vertex -1.000000 -1.618034 0.000000
vertex -0.587785 -1.538842 -0.951057
endloop
endfacet
facet normal -0.270175 -0.951057 0.196294
outer loop
vertex 0.000000 -1.902113 0.000000
vertex -0.587785 -1.538842 0.951057
vertex -1.000000 -1.618034 0.000000
endloop
endfacet
facet normal -0.587785 -0.754763 -0.317610
outer loop
vertex -0.587785 -1.538842 -0.951057
vertex -1.000000 -1.618034 0.000000
vertex -1.538842 -0.951057 -0.587785
endloop
endfacet
facet normal -0.587785 -0.754763 0.317610
outer loop
vertex -0.587785 -1.538842 0.951057
vertex -1.538842 -0.951057 0.587785
vertex -1.000000 -1.618034 0.000000
endloop
endfacet
facet normal -0.784079 -0.633446 0.000000
outer loop
vertex -1.538842 -0.951057 -0.587785
vertex -1.000000 -1.618034 0.000000
vertex -1.538842 -0.951057 0.587785
endloop
endfacet
endsolid sphere1.stl
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment