Generate an stl file from the Ackley function
The snippet can be accessed without any authentication.
Authored by
Justin Weber
This code evaluates the Ackley optimization test function and saves it as an stl file.
surface_to_stl.py 1.21 KiB
import numpy as np
from scipy.spatial import Delaunay
x=np.linspace(-5, 5, 100)
y=np.linspace(-5, 5, 100)
x,y=np.meshgrid(x,y)
x=x.flatten()
y=y.flatten()
# evaluate the parameterization at the flattened x and y
# Ackley function
z = -20*np.exp(-0.2*np.sqrt(0.5*(x**2+y**2)))-np.exp(0.5*(np.cos(2*np.pi*x)+np.cos(2*np.pi*y)))+np.e+20
# define 2D points, as input data for the Delaunay triangulation of U
points2D=np.vstack([x, y]).T
tri = Delaunay(points2D)
points3D = np.hstack((points2D, z.reshape(len(z), -1)))
name = 'ackley'
with open(name+'.stl', 'w') as stl:
stl.write('solid '+name+'\n')
for tri in tri.simplices:
# points that make the triangle
pts = [points3D[i, :] for i in tri]
# calculate the normal vector
n = np.cross( pts[1] - pts[0], pts[2] - pts[0])
nlen = np.sqrt(n[0]**2 + n[1]**2 + n[2]**2)
n /= nlen
stl.write('facet normal {} {} {}\n'.format(*n))
# write the vertices
stl.write(' outer loop\n')
for pt in pts:
stl.write(' vertex {} {} {}\n'.format(*pt))
stl.write(' endloop\n')
stl.write('endfacet\n')
stl.write('endsolid '+name+'\n')
Please register or sign in to comment