Skip to content
Snippets Groups Projects

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.

Screen_Shot_2019-04-06_at_8.51.32_PM

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')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment