Skip to main content

Python package for building isosurfaces from 3D scalar fields

Project description

PyTessel

CI CI Anaconda-Server Badge PyPI License: GPL v3

Purpose

Python package for building isosurfaces from 3D scalar fields

Installation

Anaconda

Anaconda version Anaconda last release Anaconda platforms Anaconda downloads

conda install -c ifilot pyqint

PyPi

PyPI PyPI - Downloads PyPI - Python Version

pip install pytessel

Getting started

In the script below, the isosurface of a threedimensional Gaussian function is constructed. The isosurface is written to test.ply and can, for example, be opened using ctmviewer (Linux) or 3D viewer (Windows).

from pytessel import PyTessel
import numpy as np

def main():
    pytessel = PyTessel()

    # generate some data
    x = np.linspace(0, 10, 50)
    # the grid is organized with z the slowest moving index and x the fastest moving index
    grid = np.flipud(np.vstack(np.meshgrid(x, x, x, indexing='ij')).reshape(3,-1)).T

    R = [5,5,5]
    scalarfield = np.reshape(np.array([gaussian(r,R) for r in grid]), (len(x),len(x),len(x)))
    unitcell = np.diag(np.ones(3) * 10.0)

    vertices, normals, indices = pytessel.marching_cubes(scalarfield.flatten(), scalarfield.shape, unitcell.flatten(), 0.1)

    pytessel.write_ply('test.ply', vertices, normals, indices)

def gaussian(r, R):
    return np.exp(-(r-R).dot((r-R)))

if __name__ == '__main__':
    main()

Isosurface quality

In the script below, 6 different images are created of an icosahedral "metaball" using a grid of 10x10x10,20x20x20,25x25x25,50x50x50,100x100x100, and 200x200x200 points. The resulting .ply files are rendered using Blender.

from pytessel import PyTessel
import numpy as np

def main():
    """
    Build 6 .ply files of increasing quality
    """
    pytessel = PyTessel()

    for nrpoints in [10,20,25,50,100,200]:
        sz = 3

        x = np.linspace(-sz, sz, nrpoints)
        y = np.linspace(-sz, sz, nrpoints)
        z = np.linspace(-sz, sz, nrpoints)

        xx, yy, zz, field = icosahedron_field(x,y,z)

        unitcell = np.diag(np.ones(3) * sz * 2)
        pytessel = PyTessel()
        isovalue = 3.75
        vertices, normals, indices = pytessel.marching_cubes(field.flatten(), field.shape, unitcell.flatten(), isovalue)

        pytessel.write_ply('icosahedron_%03i.ply' % nrpoints, vertices, normals, indices)

def icosahedron_field(x,y,z):
    """
    Produce a scalar field for the icosahedral metaballs
    """
    phi = (1 + np.sqrt(5)) / 2
    vertices = [
        [0,1,phi],
        [0,-1,-phi],
        [0,1,-phi],
        [0,-1,phi],
        [1,phi,0],
        [-1,-phi,0],
        [1,-phi,0],
        [-1,phi,0],
        [phi,0,1],
        [-phi,0,-1],
        [phi,0,-1],
        [-phi,0,1]
    ]

    xx,yy,zz = np.meshgrid(x,y,z)
    field = np.zeros_like(xx)
    for v in vertices:
        field += f(xx,yy,zz,v[0], v[1],v[2])

    return xx,yy,zz,field

def f(x,y,z,X0,Y0,Z0):
    """
    Single metaball function
    """
    return 1 / ((x - X0)**2 + (y - Y0)**2 + (z - Z0)**2)

if __name__ == '__main__':
    main()

Icosahedral metaballs

Local compilation (Linux)

python3 setup.py build_ext --inplace bdist

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytessel-1.2.0.tar.gz (27.0 kB view hashes)

Uploaded Source

Built Distributions

pytessel-1.2.0-cp312-cp312-win_amd64.whl (77.2 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

pytessel-1.2.0-cp312-cp312-win32.whl (73.3 kB view hashes)

Uploaded CPython 3.12 Windows x86

pytessel-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp312-cp312-musllinux_1_1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

pytessel-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (594.7 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (579.9 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl (89.6 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

pytessel-1.2.0-cp311-cp311-win_amd64.whl (77.2 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

pytessel-1.2.0-cp311-cp311-win32.whl (73.1 kB view hashes)

Uploaded CPython 3.11 Windows x86

pytessel-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp311-cp311-musllinux_1_1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

pytessel-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (585.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (573.4 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl (89.5 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

pytessel-1.2.0-cp310-cp310-win_amd64.whl (77.2 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pytessel-1.2.0-cp310-cp310-win32.whl (73.5 kB view hashes)

Uploaded CPython 3.10 Windows x86

pytessel-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp310-cp310-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

pytessel-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (557.8 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (551.1 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl (89.4 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

pytessel-1.2.0-cp39-cp39-win_amd64.whl (77.8 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pytessel-1.2.0-cp39-cp39-win32.whl (74.2 kB view hashes)

Uploaded CPython 3.9 Windows x86

pytessel-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp39-cp39-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

pytessel-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (560.6 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (553.8 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl (90.1 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

pytessel-1.2.0-cp38-cp38-win_amd64.whl (77.9 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pytessel-1.2.0-cp38-cp38-win32.whl (74.1 kB view hashes)

Uploaded CPython 3.8 Windows x86

pytessel-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp38-cp38-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

pytessel-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (563.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (555.7 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl (90.0 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

pytessel-1.2.0-cp37-cp37m-win_amd64.whl (66.2 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

pytessel-1.2.0-cp37-cp37m-win32.whl (62.0 kB view hashes)

Uploaded CPython 3.7m Windows x86

pytessel-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

pytessel-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

pytessel-1.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (529.9 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

pytessel-1.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (521.9 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

pytessel-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl (78.6 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page