diff --git a/docs/index.html b/docs/index.html index a78b298..27a8d80 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,14 +3,14 @@ - + skeletor API documentation - - + +
-
+

skeletor

@@ -398,518 +401,526 @@

Top-level functions and classes

tucked away into submodules (see side-bar or above table).

-
- View Source -
#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
-#    Copyright (C) 2018 Philipp Schlegel
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program.
-
-r"""
-# What is skeletor?
-
-Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor`
-does not (yet) seek to conquer Eternia but to turn meshes into skeletons.
-
-Before we get started some terminology:
-
-- a *mesh* is something that consists of *vertices* and *faces*
-- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices*
-  (also called *nodes*) and *edges* that connect them
-
-Skeletons are useful for a range of reasons. For example:
-
-1. Typically smaller (less vertices) than the mesh
-2. Have an implicit sense of topology (e.g. "this node is distal to that node")
-
-Extracting skeletons from meshes (or other types of data such as voxels) is
-non-trivial and there are a great many research papers exploring various
-different approaches (see [Google scholar](https://scholar.google.com/scholar
-?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)).
-
-`skeletor` implements some algorithms that I found useful in my work with
-neurons. In my experience there is unfortuntely no magic bullet when it
-comes to skeletonization and chances are you will have to fiddle around a bit
-to get decent results.
-
-# Installation
-
-From PyPI:
-```bash
-pip3 install skeletor
-```
-
-For the bleeding-edge version from Github:
-```bash
-pip3 install git+https://github.com/navis-org/skeletor@master
-```
-
-# Getting started
-
-A skeletonization pipeline typically consists of:
-
-1. Some pre-processing of the mesh (e.g. fixing some potential errors like
-   degenerate faces, unreferenced vertices, etc.)
-2. The skeletonization itself
-3. Some post-processing of the skeleton (e.g. adding radius information)
-
-------
-
-Here is a complete list of available functions:
-
-| function                                    | description                                                 |
-| ------------------------------------------- | ----------------------------------------------------------- |
-| **example data**                            |                                                             |
-| `skeletor.example_mesh()`                   | load an example mesh                                        |
-| **pre-processing**                          |                                                             |
-| `skeletor.pre.fix_mesh()`                   | fix some common errors found in meshes                      |
-| `skeletor.pre.remesh()`                     | re-generate mesh (uses Blender 3D)                          |
-| `skeletor.pre.simplify()`                   | reduce mesh complexity (uses Blender 3D)                    |
-| `skeletor.pre.contract()`                   | contract mesh to facilitate skeletonization [1]             |
-| **skeletonization**                         |                                                             |
-| `skeletor.skeletonize.by_wavefront()`       | very fast, works well for tubular meshes (like neurons)     |
-| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above)       |
-| `skeletor.skeletonize.by_edge_collapse()`   | presented in [1] but never got this to work well            |
-| `skeletor.skeletonize.by_teasar()`          | very fast and robust, works on mesh surface                 |
-| `skeletor.skeletonize.by_tangent_ball()`    | very fast, best on smooth meshes                            |
-| **postprocessing**                          |                                                             |
-| `skeletor.post.clean_up()`                  | fix some potential errors in the skeleton                   |
-| `skeletor.post.radii()`                     | add radius information using various method                 |
-
-------
-
-See docstrings of the respective functions for details.
-
-A pipeline might look like this:
-
- 1. `skeletor.pre.fix_mesh()` to fix the mesh
- 2. `skeletor.pre.simplify()` to simplify the mesh
- 3. `skeletor.pre.contract()` to contract the mesh [1]
- 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton
- 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton
- 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting
-
-In my experience there is no one-size-fits-all. You will have to play around to
-find the right approach and parameters to get nice skeletons for your meshes.
-If you need help just open an [issue](https://github.com/navis-org/skeletor/issues).
-
-Also check out the Gotchas below!
-
-# Examples
-
-First load the example mesh (a fruit fly neuron):
-
-```Python
->>> import skeletor as sk
->>> mesh = sk.example_mesh()
->>> mesh
-<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>
-```
-
-Next see if there is stuff to fix in the mesh (degenerate faces, duplicate
-vertices, etc.):
-
-```Python
->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
->>> fixed
-<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>
-```
-
-Now for tubular meshes like this neuron, the "wave front" skeletonization method
-performs really well: it works by casting waves across the mesh and collapsing
-the resulting rings into a skeleton (kinda like when you throw a stone in a
-pond and track the expanding ripples).
-
-```Python
->>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)
->>> skel
-<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>
-```
-
-All skeletonization methods return a `Skeleton` object. These are just
-convenient objects to bundle the various outputs of the skeletonization.
-
-```Python
->>> # x/y/z location of skeleton vertices (nodes)
->>> skel.vertices
-array([[16744, 36720, 26407],
-       ...,
-       [22076, 23217, 24472]])
->>> # child -> parent edges
->>> skel.edges
-array([[  64,   31],
-       ...,
-       [1257, 1252]])
->>> # Mapping for mesh to skeleton vertex indices
->>> skel.mesh_map
-array([ 157,  158, 1062, ...,  525,  474,  547])
->>> # SWC table
->>> skel.swc.head()
-   node_id  parent_id             x             y             z    radius
-0        0         -1  16744.005859  36720.058594  26407.902344  0.000000
-1        1         -1   5602.751953  22266.756510  15799.991211  7.542587
-2        2         -1  16442.666667  14999.978516  10887.916016  5.333333
-```
-
-SWC is a commonly used format for saving skeletons. `Skeleton` objects
-have a method for quickly saving a correctly formatted SWC file:
-
-```Python
->>> skel.save_swc('~/Documents/my_skeleton.swc')
-```
-
-If you installed `pyglet` (see above) you can also use `trimesh`'s plotting
-capabilities to inspect the results:
-
-```Python
->>> skel.show(mesh=True)
-```
-
-<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/>
-
-That looks pretty good already but let's run some pro-forma postprocessing.
-
-```Python
->>> sk.post.clean_up(skel, inplace=True)
-<Skeleton(vertices=(1071, 3), edges=(1070, 2))>
-```
-
-So that would be a full pipeline mesh to skeleton. Don't expect your own meshes
-to produce such nice results off the bat though. Chances are you will need to
-play around to find the right recipe. If you don't know where to start, I suggest
-you try out mesh contraction + vertex clustering first:
-
-```Python
->>> import skeletor as sk
->>> mesh = sk.example_mesh()
->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
->>> # Contract mesh to 10% (0.1) of original volume
->>> cont = sk.pre.contract(fixed, epsilon=0.1)
->>> # Skeletonize
->>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)
->>> # Replace contracted mesh with original for postprocessing and plotting
->>> skel.mesh = fixed
->>> # Add radii (vertex cluster method does not do that automatically)
->>> sk.post.radii(skel, method='knn')
->>> skel.show(mesh=True)
-```
-
-# Gotchas
-
-- while this is a general purpose library, my personal focus is on neurons and
-  this has certainly influenced things like default parameter values and certain
-  post-processing steps
-- meshes need to be triangular (we are using `trimesh`)
-- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is
-  where things start getting sluggish)
-- a good mesh contraction is often half the battle
-- if the mesh consists of multiple disconnected pieces the skeleton will
-  likewise be fragmented (i.e. will have multiple roots)
-
-# Benchmarks
-
-<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/>
-
-[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb)
-were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional
-`fastremap` dependency installed. Note some of these functions (e.g.
-contraction and TEASAR/vertex cluster skeletonization) vary a lot in
-speed based on parameterization.
-
-# What about algorithm `X`?
-
-`skeletor` contains some algorithms that I found easy enough to implement
-and useful for my work with neurons. If you have some interesting paper/approach
-that could make a nice addition to `skeletor`, please get in touch on Github.
-Pull requests are always welcome!
-
-# References
-
-`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
-
-The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/).
-Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video.
-
-Some of the code in skeletor was modified from the
-[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization)
-addon created by #0K Srinivasan Ramachandran and published under GPL3.
-
-# Top-level functions and classes
-At top-level we only expose `example_mesh()` and the `Skeleton` class (which
-you probably won't ever need to touch manually). Everything else is neatly
-tucked away into submodules (see side-bar or above table).
-
-"""
-
-__version__ = "1.2.0"
-__version_vector__ = (1, 2, 0)
-
-from . import skeletonize
-from . import pre
-from . import post
-
-from .skeletonize.base import Skeleton
-from .data import example_mesh
+                        
+
+                        
+
+                        
  1#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
+  2#    Copyright (C) 2018 Philipp Schlegel
+  3#
+  4#    This program is free software: you can redistribute it and/or modify
+  5#    it under the terms of the GNU General Public License as published by
+  6#    the Free Software Foundation, either version 3 of the License, or
+  7#    (at your option) any later version.
+  8#
+  9#    This program is distributed in the hope that it will be useful,
+ 10#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ 11#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ 12#    GNU General Public License for more details.
+ 13#
+ 14#    You should have received a copy of the GNU General Public License
+ 15#    along with this program.
+ 16
+ 17r"""
+ 18# What is skeletor?
+ 19
+ 20Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor`
+ 21does not (yet) seek to conquer Eternia but to turn meshes into skeletons.
+ 22
+ 23Before we get started some terminology:
+ 24
+ 25- a *mesh* is something that consists of *vertices* and *faces*
+ 26- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices*
+ 27  (also called *nodes*) and *edges* that connect them
+ 28
+ 29Skeletons are useful for a range of reasons. For example:
+ 30
+ 311. Typically smaller (less vertices) than the mesh
+ 322. Have an implicit sense of topology (e.g. "this node is distal to that node")
+ 33
+ 34Extracting skeletons from meshes (or other types of data such as voxels) is
+ 35non-trivial and there are a great many research papers exploring various
+ 36different approaches (see [Google scholar](https://scholar.google.com/scholar
+ 37?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)).
+ 38
+ 39`skeletor` implements some algorithms that I found useful in my work with
+ 40neurons. In my experience there is unfortuntely no magic bullet when it
+ 41comes to skeletonization and chances are you will have to fiddle around a bit
+ 42to get decent results.
+ 43
+ 44# Installation
+ 45
+ 46From PyPI:
+ 47```bash
+ 48pip3 install skeletor
+ 49```
+ 50
+ 51For the bleeding-edge version from Github:
+ 52```bash
+ 53pip3 install git+https://github.com/navis-org/skeletor@master
+ 54```
+ 55
+ 56# Getting started
+ 57
+ 58A skeletonization pipeline typically consists of:
+ 59
+ 601. Some pre-processing of the mesh (e.g. fixing some potential errors like
+ 61   degenerate faces, unreferenced vertices, etc.)
+ 622. The skeletonization itself
+ 633. Some post-processing of the skeleton (e.g. adding radius information)
+ 64
+ 65------
+ 66
+ 67Here is a complete list of available functions:
+ 68
+ 69| function                                    | description                                                 |
+ 70| ------------------------------------------- | ----------------------------------------------------------- |
+ 71| **example data**                            |                                                             |
+ 72| `skeletor.example_mesh()`                   | load an example mesh                                        |
+ 73| **pre-processing**                          |                                                             |
+ 74| `skeletor.pre.fix_mesh()`                   | fix some common errors found in meshes                      |
+ 75| `skeletor.pre.remesh()`                     | re-generate mesh (uses Blender 3D)                          |
+ 76| `skeletor.pre.simplify()`                   | reduce mesh complexity (uses Blender 3D)                    |
+ 77| `skeletor.pre.contract()`                   | contract mesh to facilitate skeletonization [1]             |
+ 78| **skeletonization**                         |                                                             |
+ 79| `skeletor.skeletonize.by_wavefront()`       | very fast, works well for tubular meshes (like neurons)     |
+ 80| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above)       |
+ 81| `skeletor.skeletonize.by_edge_collapse()`   | presented in [1] but never got this to work well            |
+ 82| `skeletor.skeletonize.by_teasar()`          | very fast and robust, works on mesh surface                 |
+ 83| `skeletor.skeletonize.by_tangent_ball()`    | very fast, best on smooth meshes                            |
+ 84| **postprocessing**                          |                                                             |
+ 85| `skeletor.post.clean_up()`                  | fix some potential errors in the skeleton                   |
+ 86| `skeletor.post.radii()`                     | add radius information using various method                 |
+ 87
+ 88------
+ 89
+ 90See docstrings of the respective functions for details.
+ 91
+ 92A pipeline might look like this:
+ 93
+ 94 1. `skeletor.pre.fix_mesh()` to fix the mesh
+ 95 2. `skeletor.pre.simplify()` to simplify the mesh
+ 96 3. `skeletor.pre.contract()` to contract the mesh [1]
+ 97 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton
+ 98 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton
+ 99 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting
+100
+101In my experience there is no one-size-fits-all. You will have to play around to
+102find the right approach and parameters to get nice skeletons for your meshes.
+103If you need help just open an [issue](https://github.com/navis-org/skeletor/issues).
+104
+105Also check out the Gotchas below!
+106
+107# Examples
+108
+109First load the example mesh (a fruit fly neuron):
+110
+111```Python
+112>>> import skeletor as sk
+113>>> mesh = sk.example_mesh()
+114>>> mesh
+115<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>
+116```
+117
+118Next see if there is stuff to fix in the mesh (degenerate faces, duplicate
+119vertices, etc.):
+120
+121```Python
+122>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
+123>>> fixed
+124<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>
+125```
+126
+127Now for tubular meshes like this neuron, the "wave front" skeletonization method
+128performs really well: it works by casting waves across the mesh and collapsing
+129the resulting rings into a skeleton (kinda like when you throw a stone in a
+130pond and track the expanding ripples).
+131
+132```Python
+133>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)
+134>>> skel
+135<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>
+136```
+137
+138All skeletonization methods return a `Skeleton` object. These are just
+139convenient objects to bundle the various outputs of the skeletonization.
+140
+141```Python
+142>>> # x/y/z location of skeleton vertices (nodes)
+143>>> skel.vertices
+144array([[16744, 36720, 26407],
+145       ...,
+146       [22076, 23217, 24472]])
+147>>> # child -> parent edges
+148>>> skel.edges
+149array([[  64,   31],
+150       ...,
+151       [1257, 1252]])
+152>>> # Mapping for mesh to skeleton vertex indices
+153>>> skel.mesh_map
+154array([ 157,  158, 1062, ...,  525,  474,  547])
+155>>> # SWC table
+156>>> skel.swc.head()
+157   node_id  parent_id             x             y             z    radius
+1580        0         -1  16744.005859  36720.058594  26407.902344  0.000000
+1591        1         -1   5602.751953  22266.756510  15799.991211  7.542587
+1602        2         -1  16442.666667  14999.978516  10887.916016  5.333333
+161```
+162
+163SWC is a commonly used format for saving skeletons. `Skeleton` objects
+164have a method for quickly saving a correctly formatted SWC file:
+165
+166```Python
+167>>> skel.save_swc('~/Documents/my_skeleton.swc')
+168```
+169
+170If you installed `pyglet` (see above) you can also use `trimesh`'s plotting
+171capabilities to inspect the results:
+172
+173```Python
+174>>> skel.show(mesh=True)
+175```
+176
+177<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/>
+178
+179That looks pretty good already but let's run some pro-forma postprocessing.
+180
+181```Python
+182>>> sk.post.clean_up(skel, inplace=True)
+183<Skeleton(vertices=(1071, 3), edges=(1070, 2))>
+184```
+185
+186So that would be a full pipeline mesh to skeleton. Don't expect your own meshes
+187to produce such nice results off the bat though. Chances are you will need to
+188play around to find the right recipe. If you don't know where to start, I suggest
+189you try out mesh contraction + vertex clustering first:
+190
+191```Python
+192>>> import skeletor as sk
+193>>> mesh = sk.example_mesh()
+194>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
+195>>> # Contract mesh to 10% (0.1) of original volume
+196>>> cont = sk.pre.contract(fixed, epsilon=0.1)
+197>>> # Skeletonize
+198>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)
+199>>> # Replace contracted mesh with original for postprocessing and plotting
+200>>> skel.mesh = fixed
+201>>> # Add radii (vertex cluster method does not do that automatically)
+202>>> sk.post.radii(skel, method='knn')
+203>>> skel.show(mesh=True)
+204```
+205
+206# Gotchas
+207
+208- while this is a general purpose library, my personal focus is on neurons and
+209  this has certainly influenced things like default parameter values and certain
+210  post-processing steps
+211- meshes need to be triangular (we are using `trimesh`)
+212- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is
+213  where things start getting sluggish)
+214- a good mesh contraction is often half the battle
+215- if the mesh consists of multiple disconnected pieces the skeleton will
+216  likewise be fragmented (i.e. will have multiple roots)
+217
+218# Benchmarks
+219
+220<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/>
+221
+222[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb)
+223were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional
+224`fastremap` dependency installed. Note some of these functions (e.g.
+225contraction and TEASAR/vertex cluster skeletonization) vary a lot in
+226speed based on parameterization.
+227
+228# What about algorithm `X`?
+229
+230`skeletor` contains some algorithms that I found easy enough to implement
+231and useful for my work with neurons. If you have some interesting paper/approach
+232that could make a nice addition to `skeletor`, please get in touch on Github.
+233Pull requests are always welcome!
+234
+235# References
+236
+237`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
+238
+239The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/).
+240Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video.
+241
+242Some of the code in skeletor was modified from the
+243[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization)
+244addon created by #0K Srinivasan Ramachandran and published under GPL3.
+245
+246# Top-level functions and classes
+247At top-level we only expose `example_mesh()` and the `Skeleton` class (which
+248you probably won't ever need to touch manually). Everything else is neatly
+249tucked away into submodules (see side-bar or above table).
+250
+251"""
+252
+253__version__ = "1.2.1"
+254__version_vector__ = (1, 2, 1)
+255
+256from . import skeletonize
+257from . import pre
+258from . import post
+259
+260from .skeletonize.base import Skeleton
+261from .data import example_mesh
+262
+263__docformat__ = "numpy"
+264
+265__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize']
+
-__docformat__ = "numpy" - -__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] -
- -
-
- #   - - - class - Skeleton: -
+ +
+ + class + Skeleton: -
- View Source -
class Skeleton:
-    """Class representing a skeleton.
-
-    Typically returned as results from a skeletonization.
-
-    Attributes
-    ----------
-    swc :       pd.DataFrame, optional
-                SWC table.
-    vertices :  (N, 3) array
-                Vertex (node) positions.
-    edges :     (M, 2) array
-                Indices of connected vertex pairs.
-    radii :     (N, ) array, optional
-                Radii for each vertex (node) in the skeleton.
-    mesh :      trimesh, optional
-                The original mesh.
-    mesh_map :  array, optional
-                Same length as ``mesh``. Maps mesh vertices to vertices (nodes)
-                in the skeleton.
-    skel_map :  array of arrays, optional
-                Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh
-                vertices.
-    method :    str, optional
-                Which method was used to generate the skeleton.
-
-    """
-
-    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
-        self.swc = swc
-        self.mesh = mesh
-        self.mesh_map = mesh_map
-        self.method = method
-
-    def __str__(self):
-        """Summary."""
-        return self.__repr__()
-
-    def __repr__(self):
-        """Return quick summary of the skeleton's geometry."""
-        elements = []
-        if hasattr(self, 'vertices'):
-            elements.append(f'vertices={self.vertices.shape}')
-        if hasattr(self, 'edges'):
-            elements.append(f'edges={self.edges.shape}')
-        if hasattr(self, 'method'):
-            elements.append(f'method={self.method}')
-        return f'<Skeleton({", ".join(elements)})>'
-
-    @property
-    def edges(self):
-        """Return skeleton edges."""
-        return self.swc.loc[self.swc.parent_id >= 0,
-                            ['node_id', 'parent_id']].values
-
-    @property
-    def vertices(self):
-        """Return skeleton vertices (nodes)."""
-        return self.swc[['x', 'y', 'z']].values
-
-    @property
-    def radius(self):
-        """Return radii."""
-        if 'radius' not in self.swc.columns:
-            raise ValueError('No radius info found. Run `skeletor.post.radii()`'
-                             ' to get them.')
-        return self.swc['radius'].values,
-
-    @property
-    def skeleton(self):
-        """Skeleton as trimesh Path3D."""
-        if not hasattr(self, '_skeleton'):
-            lines = [tm.path.entities.Line(e) for e in self.edges]
-
-            self._skeleton = tm.path.Path3D(entities=lines,
-                                            vertices=self.vertices,
-                                            process=False)
-        return self._skeleton
-
-    @property
-    def skel_map(self):
-        """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`."""
-        if isinstance(self.mesh_map, type(None)):
-            return None
-        return pd.DataFrame(self.mesh_map
-                            ).reset_index(drop=False
-                                          ).groupby(0)['index'].apply(np.array
-                                                                      ).values
-
-    def reindex(self, inplace=False):
-        """Clean up skeleton."""
-        x = self
-        if not inplace:
-            x = x.copy()
-
-        # Re-index to make node IDs continous again
-        x.swc, new_ids = reindex_swc(x.swc)
-
-        # Update mesh map
-        if not isinstance(x.mesh_map, type(None)):
-            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
-
-        if not inplace:
-            return x
-
-    def copy(self):
-        """Return copy of the skeleton."""
-        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
-                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
-                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
-
-    def get_graph(self):
-        """Generate networkX representation of the skeletons.
-
-        Distance between nodes will be used as edge weights.
-
-        Returns
-        -------
-        networkx.DiGraph
-
-        """
-        not_root = self.swc.parent_id >= 0
-        nodes = self.swc.loc[not_root]
-        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
-
-        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
-        dists = np.sqrt((dists ** 2).sum(axis=1))
-
-        G = nx.DiGraph()
-        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)])
-
-        return G
-
-    def save_swc(self, filepath):
-        """Save skeleton in SWC format.
-
-        Parameters
-        ----------
-        filepath :      path-like
-                        Filepath to save SWC to.
-
-        """
-        header = dedent(f"""\
-        # SWC format file
-        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
-        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
-        # PointNo Label X Y Z Radius Parent
-        # Labels:
-        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
-        """)
-
-        # Make copy of SWC table
-        swc = self.swc.copy()
-
-        # Set all labels to undefined
-        swc['label'] = 0
-        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
-        n_childs = swc.groupby('parent_id').size()
-        bp = n_childs[n_childs > 1].index.values
-        swc.loc[swc.node_id.isin(bp), 'label'] = 5
-
-        # Add radius if missing
-        if 'radius' not in swc.columns:
-            swc['radius'] = 0
-
-        # Get things in order
-        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
-
-        # Adjust column titles
-        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
-
-        with open(filepath, 'w') as file:
-            # Write header
-            file.write(header)
-
-            # Write data
-            writer = csv.writer(file, delimiter=' ')
-            writer.writerows(swc.astype(str).values)
-
-    def scene(self, mesh=False, **kwargs):
-        """Return a Scene object containing the skeleton.
-
-        Returns
-        -------
-        scene :     trimesh.scene.scene.Scene
-                    Contains the skeleton and optionally the mesh.
+                
 
-        """
-        if mesh:
-            if isinstance(self.mesh, type(None)):
-                raise ValueError('Skeleton has no mesh.')
-
-            self.mesh.visual.face_colors = [100, 100, 100, 100]
-
-            # Note the copy(): without it the transform in show() changes
-            # the original meshes
-            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
-        else:
-            sc = tm.Scene(self.skeleton.copy(), **kwargs)
-
-        return sc
-
-    def show(self, mesh=False, **kwargs):
-        """Render the skeleton in an opengl window. Requires pyglet.
-
-        Parameters
-        ----------
-        mesh :      bool
-                    If True, will render transparent mesh on top of the
-                    skeleton.
-
-        Returns
-        --------
-        scene :     trimesh.scene.Scene
-                    Scene with skeleton in it.
-
-        """
-        scene = self.scene(mesh=mesh)
-
-        # I encountered some issues if object space is big and the easiest
-        # way to work around this is to apply a transform such that the
-        # coordinates have -5 to +5 bounds
-        fac = 5 / np.fabs(self.skeleton.bounds).max()
-        scene.apply_transform(np.diag([fac, fac, fac, 1]))
-
-        return scene.show(**kwargs)
-
+
+ +
 33class Skeleton:
+ 34    """Class representing a skeleton.
+ 35
+ 36    Typically returned as results from a skeletonization.
+ 37
+ 38    Attributes
+ 39    ----------
+ 40    swc :       pd.DataFrame, optional
+ 41                SWC table.
+ 42    vertices :  (N, 3) array
+ 43                Vertex (node) positions.
+ 44    edges :     (M, 2) array
+ 45                Indices of connected vertex pairs.
+ 46    radii :     (N, ) array, optional
+ 47                Radii for each vertex (node) in the skeleton.
+ 48    mesh :      trimesh, optional
+ 49                The original mesh.
+ 50    mesh_map :  array, optional
+ 51                Same length as ``mesh``. Maps mesh vertices to vertices (nodes)
+ 52                in the skeleton.
+ 53    skel_map :  array of arrays, optional
+ 54                Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh
+ 55                vertices.
+ 56    method :    str, optional
+ 57                Which method was used to generate the skeleton.
+ 58
+ 59    """
+ 60
+ 61    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
+ 62        self.swc = swc
+ 63        self.mesh = mesh
+ 64        self.mesh_map = mesh_map
+ 65        self.method = method
+ 66
+ 67    def __str__(self):
+ 68        """Summary."""
+ 69        return self.__repr__()
+ 70
+ 71    def __repr__(self):
+ 72        """Return quick summary of the skeleton's geometry."""
+ 73        elements = []
+ 74        if hasattr(self, 'vertices'):
+ 75            elements.append(f'vertices={self.vertices.shape}')
+ 76        if hasattr(self, 'edges'):
+ 77            elements.append(f'edges={self.edges.shape}')
+ 78        if hasattr(self, 'method'):
+ 79            elements.append(f'method={self.method}')
+ 80        return f'<Skeleton({", ".join(elements)})>'
+ 81
+ 82    @property
+ 83    def edges(self):
+ 84        """Return skeleton edges."""
+ 85        return self.swc.loc[self.swc.parent_id >= 0,
+ 86                            ['node_id', 'parent_id']].values
+ 87
+ 88    @property
+ 89    def vertices(self):
+ 90        """Return skeleton vertices (nodes)."""
+ 91        return self.swc[['x', 'y', 'z']].values
+ 92
+ 93    @property
+ 94    def radius(self):
+ 95        """Return radii."""
+ 96        if 'radius' not in self.swc.columns:
+ 97            raise ValueError('No radius info found. Run `skeletor.post.radii()`'
+ 98                             ' to get them.')
+ 99        return self.swc['radius'].values,
+100
+101    @property
+102    def skeleton(self):
+103        """Skeleton as trimesh Path3D."""
+104        if not hasattr(self, '_skeleton'):
+105            lines = [tm.path.entities.Line(e) for e in self.edges]
+106
+107            self._skeleton = tm.path.Path3D(entities=lines,
+108                                            vertices=self.vertices,
+109                                            process=False)
+110        return self._skeleton
+111
+112    @property
+113    def skel_map(self):
+114        """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`."""
+115        if isinstance(self.mesh_map, type(None)):
+116            return None
+117        return pd.DataFrame(self.mesh_map
+118                            ).reset_index(drop=False
+119                                          ).groupby(0)['index'].apply(np.array
+120                                                                      ).values
+121
+122    @property
+123    def leafs(self):
+124        """Leaf nodes (includes root)."""
+125        swc = self.swc
+126        leafs = swc[~swc.node_id.isin(swc.parent_id.values) | (swc.parent_id < 0)]
+127        return leafs.copy()
+128
+129    def reindex(self, inplace=False):
+130        """Clean up skeleton."""
+131        x = self
+132        if not inplace:
+133            x = x.copy()
+134
+135        # Re-index to make node IDs continous again
+136        x.swc, new_ids = reindex_swc(x.swc)
+137
+138        # Update mesh map
+139        if not isinstance(x.mesh_map, type(None)):
+140            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
+141
+142        if not inplace:
+143            return x
+144
+145    def copy(self):
+146        """Return copy of the skeleton."""
+147        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
+148                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
+149                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
+150
+151    def get_graph(self):
+152        """Generate networkX representation of the skeletons.
+153
+154        Distance between nodes will be used as edge weights.
+155
+156        Returns
+157        -------
+158        networkx.DiGraph
+159
+160        """
+161        not_root = self.swc.parent_id >= 0
+162        nodes = self.swc.loc[not_root]
+163        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+164
+165        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
+166        dists = np.sqrt((dists ** 2).sum(axis=1))
+167
+168        G = nx.DiGraph()
+169        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values,
+170                                                                nodes.parent_id.values, dists)])
+171
+172        return G
+173
+174    def save_swc(self, filepath):
+175        """Save skeleton in SWC format.
+176
+177        Parameters
+178        ----------
+179        filepath :      path-like
+180                        Filepath to save SWC to.
+181
+182        """
+183        header = dedent(f"""\
+184        # SWC format file
+185        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
+186        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
+187        # PointNo Label X Y Z Radius Parent
+188        # Labels:
+189        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
+190        """)
+191
+192        # Make copy of SWC table
+193        swc = self.swc.copy()
+194
+195        # Set all labels to undefined
+196        swc['label'] = 0
+197        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
+198        n_childs = swc.groupby('parent_id').size()
+199        bp = n_childs[n_childs > 1].index.values
+200        swc.loc[swc.node_id.isin(bp), 'label'] = 5
+201
+202        # Add radius if missing
+203        if 'radius' not in swc.columns:
+204            swc['radius'] = 0
+205
+206        # Get things in order
+207        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
+208
+209        # Adjust column titles
+210        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
+211
+212        with open(filepath, 'w') as file:
+213            # Write header
+214            file.write(header)
+215
+216            # Write data
+217            writer = csv.writer(file, delimiter=' ')
+218            writer.writerows(swc.astype(str).values)
+219
+220    def scene(self, mesh=False, **kwargs):
+221        """Return a Scene object containing the skeleton.
+222
+223        Returns
+224        -------
+225        scene :     trimesh.scene.scene.Scene
+226                    Contains the skeleton and optionally the mesh.
+227
+228        """
+229        if mesh:
+230            if isinstance(self.mesh, type(None)):
+231                raise ValueError('Skeleton has no mesh.')
+232
+233            self.mesh.visual.face_colors = [100, 100, 100, 100]
+234
+235            # Note the copy(): without it the transform in show() changes
+236            # the original meshes
+237            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
+238        else:
+239            sc = tm.Scene(self.skeleton.copy(), **kwargs)
+240
+241        return sc
+242
+243    def show(self, mesh=False, **kwargs):
+244        """Render the skeleton in an opengl window. Requires pyglet.
+245
+246        Parameters
+247        ----------
+248        mesh :      bool
+249                    If True, will render transparent mesh on top of the
+250                    skeleton.
+251
+252        Returns
+253        --------
+254        scene :     trimesh.scene.Scene
+255                    Scene with skeleton in it.
+256
+257        """
+258        scene = self.scene(mesh=mesh)
+259
+260        # I encountered some issues if object space is big and the easiest
+261        # way to work around this is to apply a transform such that the
+262        # coordinates have -5 to +5 bounds
+263        fac = 5 / np.fabs(self.skeleton.bounds).max()
+264        scene.apply_transform(np.diag([fac, fac, fac, 1]))
+265
+266        return scene.show(**kwargs)
+
-

Class representing a skeleton.

@@ -941,32 +952,33 @@
Attributes
-
#   + +
+ + Skeleton(swc, mesh=None, mesh_map=None, method=None) - - Skeleton(swc, mesh=None, mesh_map=None, method=None) -
+ -
- View Source -
    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
-        self.swc = swc
-        self.mesh = mesh
-        self.mesh_map = mesh_map
-        self.method = method
-
+
+ +
61    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
+62        self.swc = swc
+63        self.mesh = mesh
+64        self.mesh_map = mesh_map
+65        self.method = method
+
-
-
#   +
+ edges - edges +
- +

Return skeleton edges.

@@ -974,11 +986,12 @@
Attributes
-
#   +
+ vertices - vertices +
- +

Return skeleton vertices (nodes).

@@ -986,11 +999,12 @@
Attributes
-
#   +
+ radius - radius +
- +

Return radii.

@@ -998,11 +1012,12 @@
Attributes
-
#   +
+ skeleton - skeleton +
- +

Skeleton as trimesh Path3D.

@@ -1010,45 +1025,59 @@
Attributes
-
#   +
+ skel_map - skel_map +
- +

Skeleton vertex (nodes) to mesh vertices. Based on mesh_map.

-
-
#   +
+
+ leafs - def - reindex(self, inplace=False):
+ + +

Leaf nodes (includes root).

+
-
- View Source -
    def reindex(self, inplace=False):
-        """Clean up skeleton."""
-        x = self
-        if not inplace:
-            x = x.copy()
 
-        # Re-index to make node IDs continous again
-        x.swc, new_ids = reindex_swc(x.swc)
+                            
+
+ +
+ + def + reindex(self, inplace=False) - # Update mesh map - if not isinstance(x.mesh_map, type(None)): - x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) + - if not inplace: - return x -
+
+ +
129    def reindex(self, inplace=False):
+130        """Clean up skeleton."""
+131        x = self
+132        if not inplace:
+133            x = x.copy()
+134
+135        # Re-index to make node IDs continous again
+136        x.swc, new_ids = reindex_swc(x.swc)
+137
+138        # Update mesh map
+139        if not isinstance(x.mesh_map, type(None)):
+140            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
+141
+142        if not inplace:
+143            return x
+
-

Clean up skeleton.

@@ -1056,23 +1085,23 @@
Attributes
-
#   + +
+ + def + copy(self) - - def - copy(self): -
+ -
- View Source -
    def copy(self):
-        """Return copy of the skeleton."""
-        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
-                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
-                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
-
+
+ +
145    def copy(self):
+146        """Return copy of the skeleton."""
+147        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
+148                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
+149                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
+
-

Return copy of the skeleton.

@@ -1080,39 +1109,40 @@
Attributes
-
#   - - - def - get_graph(self): -
- -
- View Source -
    def get_graph(self):
-        """Generate networkX representation of the skeletons.
-
-        Distance between nodes will be used as edge weights.
-
-        Returns
-        -------
-        networkx.DiGraph
-
-        """
-        not_root = self.swc.parent_id >= 0
-        nodes = self.swc.loc[not_root]
-        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+                                        
+
+ + def + get_graph(self) - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) + - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G -
+
+ +
151    def get_graph(self):
+152        """Generate networkX representation of the skeletons.
+153
+154        Distance between nodes will be used as edge weights.
+155
+156        Returns
+157        -------
+158        networkx.DiGraph
+159
+160        """
+161        not_root = self.swc.parent_id >= 0
+162        nodes = self.swc.loc[not_root]
+163        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+164
+165        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
+166        dists = np.sqrt((dists ** 2).sum(axis=1))
+167
+168        G = nx.DiGraph()
+169        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values,
+170                                                                nodes.parent_id.values, dists)])
+171
+172        return G
+
-

Generate networkX representation of the skeletons.

@@ -1128,63 +1158,63 @@
Returns
-
#   + +
+ + def + save_swc(self, filepath) + + - - def - save_swc(self, filepath):
+ +
174    def save_swc(self, filepath):
+175        """Save skeleton in SWC format.
+176
+177        Parameters
+178        ----------
+179        filepath :      path-like
+180                        Filepath to save SWC to.
+181
+182        """
+183        header = dedent(f"""\
+184        # SWC format file
+185        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
+186        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
+187        # PointNo Label X Y Z Radius Parent
+188        # Labels:
+189        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
+190        """)
+191
+192        # Make copy of SWC table
+193        swc = self.swc.copy()
+194
+195        # Set all labels to undefined
+196        swc['label'] = 0
+197        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
+198        n_childs = swc.groupby('parent_id').size()
+199        bp = n_childs[n_childs > 1].index.values
+200        swc.loc[swc.node_id.isin(bp), 'label'] = 5
+201
+202        # Add radius if missing
+203        if 'radius' not in swc.columns:
+204            swc['radius'] = 0
+205
+206        # Get things in order
+207        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
+208
+209        # Adjust column titles
+210        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
+211
+212        with open(filepath, 'w') as file:
+213            # Write header
+214            file.write(header)
+215
+216            # Write data
+217            writer = csv.writer(file, delimiter=' ')
+218            writer.writerows(swc.astype(str).values)
+
-
- View Source -
    def save_swc(self, filepath):
-        """Save skeleton in SWC format.
-
-        Parameters
-        ----------
-        filepath :      path-like
-                        Filepath to save SWC to.
-
-        """
-        header = dedent(f"""\
-        # SWC format file
-        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
-        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
-        # PointNo Label X Y Z Radius Parent
-        # Labels:
-        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
-        """)
-
-        # Make copy of SWC table
-        swc = self.swc.copy()
-
-        # Set all labels to undefined
-        swc['label'] = 0
-        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
-        n_childs = swc.groupby('parent_id').size()
-        bp = n_childs[n_childs > 1].index.values
-        swc.loc[swc.node_id.isin(bp), 'label'] = 5
-
-        # Add radius if missing
-        if 'radius' not in swc.columns:
-            swc['radius'] = 0
-
-        # Get things in order
-        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
-
-        # Adjust column titles
-        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
-
-        with open(filepath, 'w') as file:
-            # Write header
-            file.write(header)
-
-            # Write data
-            writer = csv.writer(file, delimiter=' ')
-            writer.writerows(swc.astype(str).values)
-
- -

Save skeleton in SWC format.

@@ -1199,40 +1229,40 @@
Parameters
-
#   - - - def - scene(self, mesh=False, **kwargs): -
- -
- View Source -
    def scene(self, mesh=False, **kwargs):
-        """Return a Scene object containing the skeleton.
-
-        Returns
-        -------
-        scene :     trimesh.scene.scene.Scene
-                    Contains the skeleton and optionally the mesh.
+                                        
+
+ + def + scene(self, mesh=False, **kwargs) - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') + - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc -
+
+ +
220    def scene(self, mesh=False, **kwargs):
+221        """Return a Scene object containing the skeleton.
+222
+223        Returns
+224        -------
+225        scene :     trimesh.scene.scene.Scene
+226                    Contains the skeleton and optionally the mesh.
+227
+228        """
+229        if mesh:
+230            if isinstance(self.mesh, type(None)):
+231                raise ValueError('Skeleton has no mesh.')
+232
+233            self.mesh.visual.face_colors = [100, 100, 100, 100]
+234
+235            # Note the copy(): without it the transform in show() changes
+236            # the original meshes
+237            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
+238        else:
+239            sc = tm.Scene(self.skeleton.copy(), **kwargs)
+240
+241        return sc
+
-

Return a Scene object containing the skeleton.

@@ -1247,42 +1277,42 @@
Returns
-
#   - - - def - show(self, mesh=False, **kwargs): -
- -
- View Source -
    def show(self, mesh=False, **kwargs):
-        """Render the skeleton in an opengl window. Requires pyglet.
-
-        Parameters
-        ----------
-        mesh :      bool
-                    If True, will render transparent mesh on top of the
-                    skeleton.
-
-        Returns
-        --------
-        scene :     trimesh.scene.Scene
-                    Scene with skeleton in it.
-
-        """
-        scene = self.scene(mesh=mesh)
+                                        
+
+ + def + show(self, mesh=False, **kwargs) - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) + - return scene.show(**kwargs) -
+
+ +
243    def show(self, mesh=False, **kwargs):
+244        """Render the skeleton in an opengl window. Requires pyglet.
+245
+246        Parameters
+247        ----------
+248        mesh :      bool
+249                    If True, will render transparent mesh on top of the
+250                    skeleton.
+251
+252        Returns
+253        --------
+254        scene :     trimesh.scene.Scene
+255                    Scene with skeleton in it.
+256
+257        """
+258        scene = self.scene(mesh=mesh)
+259
+260        # I encountered some issues if object space is big and the easiest
+261        # way to work around this is to apply a transform such that the
+262        # coordinates have -5 to +5 bounds
+263        fac = 5 / np.fabs(self.skeleton.bounds).max()
+264        scene.apply_transform(np.diag([fac, fac, fac, 1]))
+265
+266        return scene.show(**kwargs)
+
-

Render the skeleton in an opengl window. Requires pyglet.

@@ -1306,42 +1336,42 @@
Returns
-
#   - - - def - example_mesh(): -
- -
- View Source -
def example_mesh():
-    """Load and return example mesh.
+                            
+
+ + def + example_mesh() - The example mesh is a fruit fly neuron (an olfactory projection neuron of - the DA1 glomerulus) segmented from an EM image data set. It is part of the - Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. + - References - ---------- - [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 - A connectome and analysis of the adult Drosophila central brain - - Returns - ------- - trimesh.Trimesh - - Examples - -------- - >>> import skeletor as sk - >>> # Load this example mesh - >>> mesh = sk.example_mesh() - - """ - return tm.load_mesh(obj_path) -
+ + +
43def example_mesh():
+44    """Load and return example mesh.
+45
+46    The example mesh is a fruit fly neuron (an olfactory projection neuron of
+47    the DA1 glomerulus) segmented from an EM image data set. It is part of the
+48    Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1].
+49
+50    References
+51    ----------
+52    [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443
+53    A connectome and analysis of the adult Drosophila central brain
+54
+55    Returns
+56    -------
+57    trimesh.Trimesh
+58
+59    Examples
+60    --------
+61    >>> import skeletor as sk
+62    >>> # Load this example mesh
+63    >>> mesh = sk.example_mesh()
+64
+65    """
+66    return tm.load_mesh(obj_path)
+
-

Load and return example mesh.

diff --git a/docs/search.js b/docs/search.js index 25f2077..bce596f 100644 --- a/docs/search.js +++ b/docs/search.js @@ -1,6 +1,6 @@ window.pdocSearch = (function(){ /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();oWhat is skeletor?\n\n

Unlike its namesake, this skeletor\ndoes not (yet) seek to conquer Eternia but to turn meshes into skeletons.

\n\n

Before we get started some terminology:

\n\n
    \n
  • a mesh is something that consists of vertices and faces
  • \n
  • a skeleton is a (hierarchical) tree-like structure consisting of vertices\n(also called nodes) and edges that connect them
  • \n
\n\n

Skeletons are useful for a range of reasons. For example:

\n\n
    \n
  1. Typically smaller (less vertices) than the mesh
  2. \n
  3. Have an implicit sense of topology (e.g. \"this node is distal to that node\")
  4. \n
\n\n

Extracting skeletons from meshes (or other types of data such as voxels) is\nnon-trivial and there are a great many research papers exploring various\ndifferent approaches (see Google scholar).

\n\n

skeletor implements some algorithms that I found useful in my work with\nneurons. In my experience there is unfortuntely no magic bullet when it\ncomes to skeletonization and chances are you will have to fiddle around a bit\nto get decent results.

\n\n

Installation

\n\n

From PyPI:

\n\n
pip3 install skeletor\n
\n\n

For the bleeding-edge version from Github:

\n\n
pip3 install git+https://github.com/navis-org/skeletor@master\n
\n\n

Getting started

\n\n

A skeletonization pipeline typically consists of:

\n\n
    \n
  1. Some pre-processing of the mesh (e.g. fixing some potential errors like\ndegenerate faces, unreferenced vertices, etc.)
  2. \n
  3. The skeletonization itself
  4. \n
  5. Some post-processing of the skeleton (e.g. adding radius information)
  6. \n
\n\n
\n\n

Here is a complete list of available functions:

\n\n\n\n\n \n \n\n\n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n
functiondescription
example data
skeletor.example_mesh()load an example mesh
pre-processing
skeletor.pre.fix_mesh()fix some common errors found in meshes
skeletor.pre.remesh()re-generate mesh (uses Blender 3D)
skeletor.pre.simplify()reduce mesh complexity (uses Blender 3D)
skeletor.pre.contract()contract mesh to facilitate skeletonization [1]
skeletonization
skeletor.skeletonize.by_wavefront()very fast, works well for tubular meshes (like neurons)
skeletor.skeletonize.by_vertex_clusters()very fast but needs mesh to be contracted (see above)
skeletor.skeletonize.by_edge_collapse()presented in [1] but never got this to work well
skeletor.skeletonize.by_teasar()very fast and robust, works on mesh surface
skeletor.skeletonize.by_tangent_ball()very fast, best on smooth meshes
postprocessing
skeletor.post.clean_up()fix some potential errors in the skeleton
skeletor.post.radii()add radius information using various method
\n\n
\n\n

See docstrings of the respective functions for details.

\n\n

A pipeline might look like this:

\n\n
    \n
  1. skeletor.pre.fix_mesh() to fix the mesh
  2. \n
  3. skeletor.pre.simplify() to simplify the mesh
  4. \n
  5. skeletor.pre.contract() to contract the mesh [1]
  6. \n
  7. skeletor.skeletonize.vertex_clusters() to generate a skeleton
  8. \n
  9. skeletor.post.clean_up() to clean up some potential issues with the skeleton
  10. \n
  11. skeletor.post.radii() to extract radii either by k-nearest neighbours or ray-casting
  12. \n
\n\n

In my experience there is no one-size-fits-all. You will have to play around to\nfind the right approach and parameters to get nice skeletons for your meshes.\nIf you need help just open an issue.

\n\n

Also check out the Gotchas below!

\n\n

Examples

\n\n

First load the example mesh (a fruit fly neuron):

\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> mesh\n<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>\n
\n\n

Next see if there is stuff to fix in the mesh (degenerate faces, duplicate\nvertices, etc.):

\n\n
>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> fixed\n<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>\n
\n\n

Now for tubular meshes like this neuron, the \"wave front\" skeletonization method\nperforms really well: it works by casting waves across the mesh and collapsing\nthe resulting rings into a skeleton (kinda like when you throw a stone in a\npond and track the expanding ripples).

\n\n
>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)\n>>> skel\n<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>\n
\n\n

All skeletonization methods return a Skeleton object. These are just\nconvenient objects to bundle the various outputs of the skeletonization.

\n\n
>>> # x/y/z location of skeleton vertices (nodes)\n>>> skel.vertices\narray([[16744, 36720, 26407],\n       ...,\n       [22076, 23217, 24472]])\n>>> # child -> parent edges\n>>> skel.edges\narray([[  64,   31],\n       ...,\n       [1257, 1252]])\n>>> # Mapping for mesh to skeleton vertex indices\n>>> skel.mesh_map\narray([ 157,  158, 1062, ...,  525,  474,  547])\n>>> # SWC table\n>>> skel.swc.head()\n   node_id  parent_id             x             y             z    radius\n0        0         -1  16744.005859  36720.058594  26407.902344  0.000000\n1        1         -1   5602.751953  22266.756510  15799.991211  7.542587\n2        2         -1  16442.666667  14999.978516  10887.916016  5.333333\n
\n\n

SWC is a commonly used format for saving skeletons. Skeleton objects\nhave a method for quickly saving a correctly formatted SWC file:

\n\n
>>> skel.save_swc('~/Documents/my_skeleton.swc')\n
\n\n

If you installed pyglet (see above) you can also use trimesh's plotting\ncapabilities to inspect the results:

\n\n
>>> skel.show(mesh=True)\n
\n\n

\"skeletor_example\"

\n\n

That looks pretty good already but let's run some pro-forma postprocessing.

\n\n
>>> sk.post.clean_up(skel, inplace=True)\n<Skeleton(vertices=(1071, 3), edges=(1070, 2))>\n
\n\n

So that would be a full pipeline mesh to skeleton. Don't expect your own meshes\nto produce such nice results off the bat though. Chances are you will need to\nplay around to find the right recipe. If you don't know where to start, I suggest\nyou try out mesh contraction + vertex clustering first:

\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> # Contract mesh to 10% (0.1) of original volume\n>>> cont = sk.pre.contract(fixed, epsilon=0.1)\n>>> # Skeletonize\n>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)\n>>> # Replace contracted mesh with original for postprocessing and plotting\n>>> skel.mesh = fixed\n>>> # Add radii (vertex cluster method does not do that automatically)\n>>> sk.post.radii(skel, method='knn')\n>>> skel.show(mesh=True)\n
\n\n

Gotchas

\n\n
    \n
  • while this is a general purpose library, my personal focus is on neurons and\nthis has certainly influenced things like default parameter values and certain\npost-processing steps
  • \n
  • meshes need to be triangular (we are using trimesh)
  • \n
  • use sk.pre.simplify if your mesh is very complex (half a million vertices is\nwhere things start getting sluggish)
  • \n
  • a good mesh contraction is often half the battle
  • \n
  • if the mesh consists of multiple disconnected pieces the skeleton will\nlikewise be fragmented (i.e. will have multiple roots)
  • \n
\n\n

Benchmarks

\n\n

\"skeletor_benchmark\"

\n\n

Benchmarks\nwere run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional\nfastremap dependency installed. Note some of these functions (e.g.\ncontraction and TEASAR/vertex cluster skeletonization) vary a lot in\nspeed based on parameterization.

\n\n

What about algorithm X?

\n\n

skeletor contains some algorithms that I found easy enough to implement\nand useful for my work with neurons. If you have some interesting paper/approach\nthat could make a nice addition to skeletor, please get in touch on Github.\nPull requests are always welcome!

\n\n

References

\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n\n

The abstract and the paper can be found here.\nAlso see this YouTube video.

\n\n

Some of the code in skeletor was modified from the\nPy_BL_MeshSkeletonization\naddon created by #0K Srinivasan Ramachandran and published under GPL3.

\n\n

Top-level functions and classes

\n\n

At top-level we only expose example_mesh() and the Skeleton class (which\nyou probably won't ever need to touch manually). Everything else is neatly\ntucked away into submodules (see side-bar or above table).

\n"}, "skeletor.Skeleton": {"fullname": "skeletor.Skeleton", "modulename": "skeletor", "qualname": "Skeleton", "type": "class", "doc": "

Class representing a skeleton.

\n\n

Typically returned as results from a skeletonization.

\n\n
Attributes
\n\n
    \n
  • swc (pd.DataFrame, optional):\nSWC table.
  • \n
  • vertices ((N, 3) array):\nVertex (node) positions.
  • \n
  • edges ((M, 2) array):\nIndices of connected vertex pairs.
  • \n
  • radii ((N, ) array, optional):\nRadii for each vertex (node) in the skeleton.
  • \n
  • mesh (trimesh, optional):\nThe original mesh.
  • \n
  • mesh_map (array, optional):\nSame length as mesh. Maps mesh vertices to vertices (nodes)\nin the skeleton.
  • \n
  • skel_map (array of arrays, optional):\nInverse of mesh_map: maps skeleton vertices (nodes) to mesh\nvertices.
  • \n
  • method (str, optional):\nWhich method was used to generate the skeleton.
  • \n
\n"}, "skeletor.Skeleton.__init__": {"fullname": "skeletor.Skeleton.__init__", "modulename": "skeletor", "qualname": "Skeleton.__init__", "type": "function", "doc": "

\n", "signature": "(self, swc, mesh=None, mesh_map=None, method=None)", "funcdef": "def"}, "skeletor.Skeleton.edges": {"fullname": "skeletor.Skeleton.edges", "modulename": "skeletor", "qualname": "Skeleton.edges", "type": "variable", "doc": "

Return skeleton edges.

\n"}, "skeletor.Skeleton.vertices": {"fullname": "skeletor.Skeleton.vertices", "modulename": "skeletor", "qualname": "Skeleton.vertices", "type": "variable", "doc": "

Return skeleton vertices (nodes).

\n"}, "skeletor.Skeleton.radius": {"fullname": "skeletor.Skeleton.radius", "modulename": "skeletor", "qualname": "Skeleton.radius", "type": "variable", "doc": "

Return radii.

\n"}, "skeletor.Skeleton.skeleton": {"fullname": "skeletor.Skeleton.skeleton", "modulename": "skeletor", "qualname": "Skeleton.skeleton", "type": "variable", "doc": "

Skeleton as trimesh Path3D.

\n"}, "skeletor.Skeleton.skel_map": {"fullname": "skeletor.Skeleton.skel_map", "modulename": "skeletor", "qualname": "Skeleton.skel_map", "type": "variable", "doc": "

Skeleton vertex (nodes) to mesh vertices. Based on mesh_map.

\n"}, "skeletor.Skeleton.reindex": {"fullname": "skeletor.Skeleton.reindex", "modulename": "skeletor", "qualname": "Skeleton.reindex", "type": "function", "doc": "

Clean up skeleton.

\n", "signature": "(self, inplace=False)", "funcdef": "def"}, "skeletor.Skeleton.copy": {"fullname": "skeletor.Skeleton.copy", "modulename": "skeletor", "qualname": "Skeleton.copy", "type": "function", "doc": "

Return copy of the skeleton.

\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.get_graph": {"fullname": "skeletor.Skeleton.get_graph", "modulename": "skeletor", "qualname": "Skeleton.get_graph", "type": "function", "doc": "

Generate networkX representation of the skeletons.

\n\n

Distance between nodes will be used as edge weights.

\n\n
Returns
\n\n
    \n
  • networkx.DiGraph
  • \n
\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.save_swc": {"fullname": "skeletor.Skeleton.save_swc", "modulename": "skeletor", "qualname": "Skeleton.save_swc", "type": "function", "doc": "

Save skeleton in SWC format.

\n\n
Parameters
\n\n
    \n
  • filepath (path-like):\nFilepath to save SWC to.
  • \n
\n", "signature": "(self, filepath)", "funcdef": "def"}, "skeletor.Skeleton.scene": {"fullname": "skeletor.Skeleton.scene", "modulename": "skeletor", "qualname": "Skeleton.scene", "type": "function", "doc": "

Return a Scene object containing the skeleton.

\n\n
Returns
\n\n
    \n
  • scene (trimesh.scene.scene.Scene):\nContains the skeleton and optionally the mesh.
  • \n
\n", "signature": "(self, mesh=False, **kwargs)", "funcdef": "def"}, "skeletor.Skeleton.show": {"fullname": "skeletor.Skeleton.show", "modulename": "skeletor", "qualname": "Skeleton.show", "type": "function", "doc": "

Render the skeleton in an opengl window. Requires pyglet.

\n\n
Parameters
\n\n
    \n
  • mesh (bool):\nIf True, will render transparent mesh on top of the\nskeleton.
  • \n
\n\n
Returns
\n\n
    \n
  • scene (trimesh.scene.Scene):\nScene with skeleton in it.
  • \n
\n", "signature": "(self, mesh=False, **kwargs)", "funcdef": "def"}, "skeletor.example_mesh": {"fullname": "skeletor.example_mesh", "modulename": "skeletor", "qualname": "example_mesh", "type": "function", "doc": "

Load and return example mesh.

\n\n

The example mesh is a fruit fly neuron (an olfactory projection neuron of\nthe DA1 glomerulus) segmented from an EM image data set. It is part of the\nJanelia hemibrain data set (see here) [1].

\n\n
References
\n\n

[1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443\nA connectome and analysis of the adult Drosophila central brain

\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> # Load this example mesh\n>>> mesh = sk.example_mesh()\n
\n", "signature": "()", "funcdef": "def"}, "skeletor.post": {"fullname": "skeletor.post", "modulename": "skeletor.post", "type": "module", "doc": "

The skeletor.post module contains functions to post-process skeletons after\nskeletonization.

\n\n

Fixing issues with skeletons

\n\n

Depending on your mesh, pre-processing and the parameters you chose for\nskeletonization, chances are that your skeleton will not come out perfectly.

\n\n

skeletor.post.clean_up can help you solve some potential issues:

\n\n
    \n
  • skeleton nodes (vertices) that outside or right on the surface instead of\ncentered inside the mesh
  • \n
  • superfluous \"hairs\" on otherwise straight bits
  • \n
\n\n

Computing radius information

\n\n

Only skeletor.skeletonize.by_wavefront() provides radii off the bat. For all\nother methods, you might want to run skeletor.post.radii can help you\n(re-)generate radius information for the skeletons.

\n"}, "skeletor.post.radii": {"fullname": "skeletor.post.radii", "modulename": "skeletor.post", "qualname": "radii", "type": "function", "doc": "

Extract radii for given skeleton table.

\n\n
Important
\n\n

This function really only produces useful radii if the skeleton is centered\ninside the mesh. by_wavefront does that by default whereas all other\nskeletonization methods don't. Your best bet to get centered skeletons is\nto contract the mesh first (sk.pre.contract).

\n\n
Parameters
\n\n
    \n
  • s (skeletor.Skeleton):\nSkeleton to clean up.
  • \n
  • mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with s.
  • \n
  • method (\"knn\" | \"ray\"):\nWhether and how to add radius information to each node::

    \n\n
      \n
    • \"knn\" uses k-nearest-neighbors to get radii: fast but\n potential for being very wrong
    • \n
    • \"ray\" uses ray-casting to get radii: slower but sometimes\n less wrong
    • \n
  • \n
  • aggregate (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\"):\nFunction used to aggregate radii over sample (i.e. across\nk nearest-neighbors or ray intersections)
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore skeletonization. Note that this might make changes to\nyour mesh inplace!
  • \n
  • **kwargs: Keyword arguments are passed to the respective method:
  • \n
\n\n

For method \"knn\"::

\n\n
n :             int (default 5)\n                Radius will be the mean over n nearest-neighbors.\n
\n\n

For method \"ray\"::

\n\n
n_rays :        int (default 20)\n                Number of rays to cast for each node.\nprojection :    \"sphere\" (default) | \"tangents\"\n                Whether to cast rays in a sphere around each node or in a\n                circle orthogonally to the node's tangent vector.\nfallback :      \"knn\" (default) | None | number\n                If a point is outside or right on the surface of the mesh\n                the raycasting will return nonesense results. We can either\n                ignore those cases (``None``), assign a arbitrary number or\n                we can fall back to radii from k-nearest-neighbors (``knn``).\n
\n\n
Returns
\n\n
    \n
  • None: But attaches radius to the skeleton's SWC table. Existing\nvalues are replaced!
  • \n
\n", "signature": "(\n s,\n mesh=None,\n method='knn',\n aggregate='mean',\n validate=False,\n **kwargs\n)", "funcdef": "def"}, "skeletor.post.clean_up": {"fullname": "skeletor.post.clean_up", "modulename": "skeletor.post", "qualname": "clean_up", "type": "function", "doc": "

Clean up the skeleton.

\n\n

This function bundles a bunch of procedures to clean up the skeleton:

\n\n
    \n
  1. Remove twigs that are running parallel to their parent branch
  2. \n
  3. Move nodes outside the mesh back inside (or at least snap to surface)
  4. \n
\n\n

Note that this is not a magic bullet and some of this will not work (well)\nif the original mesh was degenerate (e.g. internal faces or not watertight)\nto begin with.

\n\n
Parameters
\n\n
    \n
  • s (skeletor.Skeleton):\nSkeleton to clean up.
  • \n
  • mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with s.
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore cleaning up. Note that this might change your mesh\ninplace!
  • \n
  • inplace (bool):\nIf False will make and return a copy of the skeleton. If True,\nwill modify the s inplace.
  • \n
  • **kwargs: Keyword arguments are passed to the bundled function.
  • \n
\n\n

For skeletor.postprocessing.drop_parallel_twigs::

\n\n

theta : float (default 0.01)\n For each twig we generate the dotproduct between the tangent\n vectors of it and its parents. If these line up perfectly the\n dotproduct will equal 1. theta determines how much that\n value can differ from 1 for us to still prune the twig: higher\n theta = more pruning.

\n\n
Returns
\n\n
    \n
  • s_clean (skeletor.Skeleton):\nHopefully improved skeleton.
  • \n
\n", "signature": "(s, mesh=None, validate=False, inplace=False, **kwargs)", "funcdef": "def"}, "skeletor.pre": {"fullname": "skeletor.pre", "modulename": "skeletor.pre", "type": "module", "doc": "

The skeletor.pre module contains functions to pre-process meshes before\nskeletonization.

\n\n

Fixing faulty meshes

\n\n

Some skeletonization methods are susceptible to faulty meshes (degenerate faces,\nwrong normals, etc.). If your skeleton looks off, it might be worth a shot\ntrying to fix the mesh using skeletor.pre.fix_mesh().

\n\n

Mesh contraction

\n\n

As a rule of thumb: the more your mesh looks like a skeleton, the easier it is\nto extract one (duh). Mesh contraction using skeletor.pre.contract() [1] can\nhelp you to get your mesh \"in shape\".

\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n"}, "skeletor.pre.fix_mesh": {"fullname": "skeletor.pre.fix_mesh", "modulename": "skeletor.pre", "qualname": "fix_mesh", "type": "function", "doc": "

Try to fix some common problems with mesh.

\n\n
    \n
  1. Remove infinite values
  2. \n
  3. Merge duplicate vertices
  4. \n
  5. Remove duplicate and degenerate faces
  6. \n
  7. Remove unreference vertices
  8. \n
  9. Drop winglets (faces that have only one adjacent face)
  10. \n
  11. Fix normals (Optional)
  12. \n
  13. Remove disconnected fragments (Optional)
  14. \n
\n\n
Parameters
\n\n
    \n
  • mesh (mesh-like object):\nMesh to fix. Must have .vertices and .faces\nproperties.
  • \n
  • remove_disconnected (False | int):\nIf a number is given, will iterate over the mesh's\nconnected components and remove those consisting of\nless than the given number of vertices. For example,\nremove_disconnected=5 will drop parts of the\nmesh that consist of five or less connected\nvertices.
  • \n
  • inplace (bool):\nIf True, will perform fixes on the input mesh.\nIf False, will make a copy first. This is silently\nignored if mesh is not already a trimesh.
  • \n
\n\n
Returns
\n\n
    \n
  • fixed mesh (trimesh.Trimesh):
  • \n
\n", "signature": "(\n mesh,\n remote_infinite=True,\n merge_duplicate_verts=True,\n remove_degenerate_faces=True,\n remove_unreferenced_verts=True,\n drop_winglets=True,\n fix_normals=False,\n remove_disconnected=False,\n inplace=False\n)", "funcdef": "def"}, "skeletor.pre.simplify": {"fullname": "skeletor.pre.simplify", "modulename": "skeletor.pre", "qualname": "simplify", "type": "function", "doc": "

Simplify mesh using Blender 3D.

\n\n

Uses Blender's \"decimate\" modifier in \"collapse\" mode.

\n\n
Parameters
\n\n
    \n
  • mesh (trimesh.Trimesh):\nMesh to simplify.
  • \n
  • ratio (float):\nFactor to which to reduce faces. For example, a ratio of 0.5 will\nreduce the number of faces to 50%.
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Simplified mesh.
  • \n
\n", "signature": "(mesh, ratio)", "funcdef": "def"}, "skeletor.pre.remesh": {"fullname": "skeletor.pre.remesh", "modulename": "skeletor.pre", "qualname": "remesh", "type": "function", "doc": "

Remesh mesh using Blender 3D.

\n\n

Uses Blender's \"remesh\" modifier in \"voxel\" mode.

\n\n
Parameters
\n\n
    \n
  • mesh (trimesh.Trimesh):\nMesh to remesh.
  • \n
  • voxel_size (float):\nSize of individual voxels (edge length).
  • \n
  • adaptivity (float):\nReduces final face count where detail is not important.
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Remeshed mesh.
  • \n
\n", "signature": "(mesh, voxel_size=50, adaptivity=5)", "funcdef": "def"}, "skeletor.pre.contract": {"fullname": "skeletor.pre.contract", "modulename": "skeletor.pre", "qualname": "contract", "type": "function", "doc": "

Contract mesh.

\n\n

In a nutshell: this function contracts the mesh by applying rounds of\n_constraint_ Laplacian smoothing. This function can be fairly expensive\nand I highly recommend you play around with SL to contract the\nmesh in as few steps as possible. The contraction doesn't have to be perfect\nfor good skeletonization results (<10%, i.e. epsilon<0.1).

\n\n

Also: parameterization matters a lot! Default parameters will get you there\nbut playing around with SL and WH0 might speed things up by an order of\nmagnitude.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be contracted. Can be any object (e.g.\na trimesh.Trimesh) that has .vertices and .faces\nproperties or a tuple (vertices, faces) or a dictionary\n{'vertices': vertices, 'faces': faces}.\nVertices and faces must be (N, 3) numpy arrays.
  • \n
  • epsilon (float (0-1), optional):\nTarget contraction rate as measured by the sum of all face\nareas in the contracted versus the original mesh. Algorithm\nwill stop once mesh is contracted below this threshold.\nDepending on your mesh (number of faces, shape) reaching a\nstrong contraction can be extremely costly with comparatively\nlittle benefit for the subsequent skeletonization. Note that\nthe algorithm might stop short of this target if iter_lim\nor time_lim is reached first or if the sum of face areas\nis increasing from one iteration to the next instead of\ndecreasing.
  • \n
  • iter_lim (int (>1), optional):\nMaximum rounds of contractions.
  • \n
  • time_lim (int, optional):\nMaximum run time in seconds. Note that this limit is not\nchecked during but after each round of contraction. Hence,\nthe actual total time will likely overshoot time_lim.
  • \n
  • precision (float, optional):\nSets the precision for finding the least-square solution.\nThis is the main determinant for speed vs quality: lower\nvalues will take (much) longer but will get you closer to an\noptimally contracted mesh. Higher values will be faster but\nthe iterative contractions might stop early.
  • \n
  • SL (float, optional):\nFactor by which the contraction matrix is multiplied for\neach iteration. Higher values = quicker contraction, lower\nvalues = more likely to get you an optimal contraction.
  • \n
  • WH0 (float, optional):\nInitial weight factor for the attraction constraints.\nThe ratio of the initial weights WL0 and WH0\ncontrols the smoothness and the degree of contraction of the\nfirst iteration result, thus it determines the amount of\ndetails retained in subsequent and final contracted meshes:\nhigher WH0 = more details retained.
  • \n
  • WL0 (\"auto\" | float):\nInitial weight factor for the contraction constraints. By\ndefault (\"auto\"), this will be set to 1e-3 * sqrt(A)\nwith A being the average face area. This ensures that\ncontraction forces scale with the coarseness of the mesh.
  • \n
  • operator (\"cotangent\" | \"umbrella\"):\nWhich Laplacian operator to use:

    \n\n
      \n
    • The \"cotangent\" operator (default) takes both topology\nand geometry of the mesh into account and is hence a\nbetter descriptor of the curvature flow. This is the\noperator used in the original paper.
    • \n
    • The \"umbrella\" operator (aka \"uniform weighting\") uses\nonly topological features of the mesh. This also makes\nit more robust against flaws in the mesh! Use it when\nthe cotangent operator produces oddly contracted meshes.
    • \n
  • \n
  • progress (bool):\nWhether or not to show a progress bar.
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore collapsing. Degenerate meshes can lead to effectively\ninfinite runtime for this function!
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Contracted copy of original mesh. The final contraction rate\nis attached to the mesh as .epsilon property.
  • \n
\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n", "signature": "(\n mesh,\n epsilon=1e-06,\n iter_lim=100,\n time_lim=None,\n precision=1e-07,\n SL=2,\n WH0=1,\n WL0='auto',\n operator='cotangent',\n progress=True,\n validate=True\n)", "funcdef": "def"}, "skeletor.skeletonize": {"fullname": "skeletor.skeletonize", "modulename": "skeletor.skeletonize", "type": "module", "doc": "

The skeletor.skeletonize module contains functions to for skeletonization\nof meshes.

\n\n

There are several approaches to skeletonizing a mesh. Which one to pick depends\n(among other things) on the shape of your mesh and the skeleton quality you want\nto get out of it. In general, unless you mesh already looks like a tube I\nrecommend looking into mesh contraction 4.

\n\n

Please see the documentation of the individual functions for details but here\nis a quick summary:

\n\n\n\n\n \n \n \n \n \n \n\n\n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n
functionspeedrobustradii 1mesh map 2description
skeletor.skeletonize.by_wavefront()+++++yesyesworks well for tubular meshes
skeletor.skeletonize.by_vertex_clusters()+++noyesbest with contracted meshes 3
skeletor.skeletonize.by_teasar()+++noyesworks on mesh surface
skeletor.skeletonize.by_tangent_ball()++0yesyesworks with mesh normals
skeletor.skeletonize.by_edge_collapse()-0nonopublished with [1] - never got this to work well
\n\n

References

\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n\n
\n
\n
    \n
  1. \n

    radii can also be added in postprocessing with skeletor.post.radii() 

    \n
  2. \n\n
  3. \n

    a mapping from the meshes vertices to skeleton nodes 

    \n
  4. \n\n
  5. \n

    use skeletor.pre.contract() 

    \n
  6. \n\n
  7. \n

    use skeletor.pre.contract() 

    \n
  8. \n
\n
\n"}, "skeletor.skeletonize.by_teasar": {"fullname": "skeletor.skeletonize.by_teasar", "modulename": "skeletor.skeletonize", "qualname": "by_teasar", "type": "function", "doc": "

Skeletonize a mesh mesh using the TEASAR algorithm [1].

\n\n

This algorithm finds the longest path from a root vertex, invalidates all\nvertices that are within inv_dist. Then picks the second longest (and\nstill valid) path and does the same. Rinse & repeat until all vertices have\nbeen invalidated. It's fast + works very well with tubular meshes, and with\ninv_dist you have control over the level of detail. Note that by its\nnature the skeleton will be exactly on the surface of the mesh.

\n\n

Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and\nForrest Collman in meshparty (https://github.com/sdorkenw/MeshParty).

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • inv_dist (int | float):\nDistance along the mesh used for invalidation of vertices.\nThis controls how detailed (or noisy) the skeleton will be.
  • \n
  • min_length (float, optional):\nIf provided, will skip any branch that is shorter than\nmin_length. Use this to get rid of noise but note that\nit will lead to vertices not being mapped to skeleton nodes.\nSuch vertices will show up with index -1 in\nSkeleton.mesh_map.
  • \n
  • root (int, optional):\nVertex ID of a root. If not provided will use 0.
  • \n
  • progress (bool, optional):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
References
\n\n

[1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.\n (n.d.). TEASAR: tree-structure extraction algorithm for accurate and\n robust skeletons. In Proceedings the Eighth Pacific Conference on\n Computer Graphics and Applications. IEEE Comput. Soc.\n https://doi.org/10.1109/pccga.2000.883951

\n", "signature": "(mesh, inv_dist, min_length=None, root=None, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_wavefront": {"fullname": "skeletor.skeletonize.by_wavefront", "modulename": "skeletor.skeletonize", "qualname": "by_wavefront", "type": "function", "doc": "

Skeletonize a mesh using wave fronts.

\n\n

The algorithm tries to find rings of vertices and collapse them to\ntheir center. This is done by propagating a wave across the mesh starting at\na single seed vertex. As the wave travels across the mesh we keep track of\nwhich vertices are are encountered at each step. Groups of connected\nvertices that are \"hit\" by the wave at the same time are considered rings\nand subsequently collapsed. By its nature this works best with tubular meshes.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • waves (int):\nNumber of waves to run across the mesh. Each wave is\ninitialized at a different vertex which produces slightly\ndifferent rings. The final skeleton is produced from a mean\nacross all waves. More waves produce higher resolution\nskeletons but also introduce more noise.
  • \n
  • origins (int | list of ints, optional):\nVertex ID(s) where the wave(s) are initialized. If we run\nout of origins (either because less origins than waves\nor because no origin for one of the connected components)\nwill fall back to semi-random origin.
  • \n
  • step_size (int):\nValues greater 1 effectively lead to binning of rings. For\nexample a stepsize of 2 means that two adjacent vertex rings\nwill be collapsed to the same center. This can help reduce\nnoise in the skeleton (and as such counteracts a large\nnumber of waves).
  • \n
  • radius_agg (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\" | \"percentile25\"):\nFunction used to aggregate radii over sample (i.e. the\nvertices forming a ring that we collapse to its center).
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n", "signature": "(\n mesh,\n waves=1,\n origins=None,\n step_size=1,\n radius_agg='mean',\n progress=True\n)", "funcdef": "def"}, "skeletor.skeletonize.by_vertex_clusters": {"fullname": "skeletor.skeletonize.by_vertex_clusters", "modulename": "skeletor.skeletonize", "qualname": "by_vertex_clusters", "type": "function", "doc": "

Skeletonize a (contracted) mesh by clustering vertices.

\n\n

The algorithm traverses the mesh graph and groups vertices together that\nare within a given distance to each other. This uses the geodesic\n(along-the-mesh) distance, not simply the Eucledian distance. Subsequently\nthese groups of vertices are collapsed and re-connected respecting the\ntopology of the input mesh.

\n\n

The graph traversal is fast and scales well, so this method is well suited\nfor meshes with lots of vertices. On the downside: this implementation is\nnot very clever and you might have to play around with the parameters\n(mostly sampling_dist) to get decent results.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • sampling_dist (float | int):\nMaximal distance at which vertices are clustered. This\nparameter should be tuned based on the resolution of your\nmesh (see Examples).
  • \n
  • cluster_pos (\"median\" | \"center\"):\nHow to determine the x/y/z coordinates of the collapsed\nvertex clusters (i.e. the skeleton's nodes)::

    \n\n
      \n
    • \"median\": Use the vertex closest to cluster's center of\nmass.
    • \n
    • \"center\": Use the center of mass. This makes for smoother\nskeletons but can lead to nodes outside the mesh.
    • \n
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> cont = sk.pre.contract(mesh, epsilon=0.1)\n>>> skel = sk.skeletonize.vertex_cluster(cont)\n>>> skel.mesh = mesh\n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n", "signature": "(mesh, sampling_dist, cluster_pos='median', progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_edge_collapse": {"fullname": "skeletor.skeletonize.by_edge_collapse", "modulename": "skeletor.skeletonize", "qualname": "by_edge_collapse", "type": "function", "doc": "

Skeletonize a (contracted) mesh by iteratively collapsing edges.

\n\n

This algorithm (described in [1]) iteratively collapses edges that are part\nof a face until no more faces are left. Edges are chosen based on a cost\nfunction that penalizes collapses that would change the shape of the object\nor would introduce long edges.

\n\n

This is somewhat sensitive to the dimensions of the input mesh: too large\nand you might experience slow-downs or numpy OverflowErrors; too low and\nyou might get skeletons that don't quite match the mesh (e.g. too few nodes).\nIf you experience either, try down- or up-scaling your mesh, respectively.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • shape_weight (float, optional):\nWeight for shape costs which penalize collapsing edges that\nwould drastically change the shape of the object.
  • \n
  • sample_weight (float, optional):\nWeight for sampling costs which penalize collapses that\nwould generate prohibitively long edges.
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n", "signature": "(mesh, shape_weight=1, sample_weight=0.1, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_tangent_ball": {"fullname": "skeletor.skeletonize.by_tangent_ball", "modulename": "skeletor.skeletonize", "qualname": "by_tangent_ball", "type": "function", "doc": "

Skeletonize a mesh by finding the maximal tangent ball.

\n\n

This algorithm casts a ray from every mesh vertex along its inverse normals\n(requires ncollpyde). It then creates a sphere that is tangent to the\nvertex and to where the ray hit the inside of a face on the opposite side.\nNext it drops spheres that overlap with another, larger sphere. Modified\nfrom [1].

\n\n

The method works best on smooth meshes and is rather sensitive to errors in\nthe mesh such as incorrect normals (see skeletor.pre.fix_mesh), internal\nfaces, noisy surface (try smoothing or downsampling) or holes in the mesh.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)\n>>> skel = sk.skeletonize.by_tangent_ball(fixed)\n
\n\n
References
\n\n

[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using\n nearest neighbors and the normal field. Vis Comput 28, 7\u201319 (2012).\n https://doi.org/10.1007/s00371-011-0594-7

\n", "signature": "(mesh)", "funcdef": "def"}}, "docInfo": {"skeletor": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 2771}, "skeletor.Skeleton": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 161}, "skeletor.Skeleton.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "skeletor.Skeleton.edges": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "skeletor.Skeleton.vertices": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.radius": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "skeletor.Skeleton.skeleton": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.skel_map": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 15}, "skeletor.Skeleton.reindex": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 5, "bases": 0, "doc": 6}, "skeletor.Skeleton.copy": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 8}, "skeletor.Skeleton.get_graph": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 34}, "skeletor.Skeleton.save_swc": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 29}, "skeletor.Skeleton.scene": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 35}, "skeletor.Skeleton.show": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 60}, "skeletor.example_mesh": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 2, "bases": 0, "doc": 156}, "skeletor.post": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 139}, "skeletor.post.radii": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 406}, "skeletor.post.clean_up": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 303}, "skeletor.pre": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 143}, "skeletor.pre.fix_mesh": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 204}, "skeletor.pre.simplify": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 83}, "skeletor.pre.remesh": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 8, "bases": 0, "doc": 86}, "skeletor.pre.contract": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 762}, "skeletor.skeletonize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 437}, "skeletor.skeletonize.by_teasar": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 380}, "skeletor.skeletonize.by_wavefront": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 388}, "skeletor.skeletonize.by_vertex_clusters": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 475}, "skeletor.skeletonize.by_edge_collapse": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 297}, "skeletor.skeletonize.by_tangent_ball": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 386}}, "length": 29, "save": true}, "index": {"qualname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 13}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "fullname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 29}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 13, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"6": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}, "1": {"0": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "2": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.reindex": {"tf": 1.4142135623730951}, "skeletor.Skeleton.copy": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 19, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 7}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 14}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 6}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 4}}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0}}, "doc": {"root": {"0": {"0": {"0": {"0": {"0": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"8": {"5": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "5": {"8": {"5": {"9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "1": {"0": {"0": {"7": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"0": {"0": {"3": {"7": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "6": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}, "1": {"0": {"9": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"5": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"0": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"9": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "4": {"4": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 3.7416573867739413}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "2": {"0": {"0": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "1": {"2": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "2": {"0": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "2": {"0": {"7": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"6": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"2": {"1": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"4": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"4": {"0": {"7": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "8": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}, "3": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "2": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "3": {"3": {"3": {"3": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"7": {"2": {"0": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"docs": {"skeletor": {"tf": 2}}, "df": 1}, "docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "4": {"4": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "7": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}, "2": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "4": {"2": {"5": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"3": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}}, "df": 4}, "6": {"2": {"1": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "5": {"8": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"6": {"6": {"6": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"5": {"1": {"9": {"5": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"4": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "6": {"5": {"1": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "\u2013": {"1": {"9": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "8": {"6": {"1": {"7": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"3": {"9": {"5": {"1": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"0": {"2": {"3": {"4": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"6": {"0": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"8": {"5": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"1": {"2": {"1": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 38.09199390948182}, "skeletor.Skeleton": {"tf": 8}, "skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.Skeleton.edges": {"tf": 1.7320508075688772}, "skeletor.Skeleton.vertices": {"tf": 1.7320508075688772}, "skeletor.Skeleton.radius": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 2.23606797749979}, "skeletor.Skeleton.reindex": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1.7320508075688772}, "skeletor.Skeleton.get_graph": {"tf": 4}, "skeletor.Skeleton.save_swc": {"tf": 3.872983346207417}, "skeletor.Skeleton.scene": {"tf": 3.872983346207417}, "skeletor.Skeleton.show": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 8.246211251235321}, "skeletor.post": {"tf": 5.656854249492381}, "skeletor.post.radii": {"tf": 10.198039027185569}, "skeletor.post.clean_up": {"tf": 8.774964387392123}, "skeletor.pre": {"tf": 5.0990195135927845}, "skeletor.pre.fix_mesh": {"tf": 8.366600265340756}, "skeletor.pre.simplify": {"tf": 5.916079783099616}, "skeletor.pre.remesh": {"tf": 6.4031242374328485}, "skeletor.pre.contract": {"tf": 12.36931687685298}, "skeletor.skeletonize": {"tf": 14.966629547095765}, "skeletor.skeletonize.by_teasar": {"tf": 9.433981132056603}, "skeletor.skeletonize.by_wavefront": {"tf": 9.16515138991168}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 14.177446878757825}, "skeletor.skeletonize.by_edge_collapse": {"tf": 8.366600265340756}, "skeletor.skeletonize.by_tangent_ball": {"tf": 12.84523257866513}}, "df": 29, "w": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}}, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 4, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 5}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4}}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}}}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}}, "i": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 4}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 11}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "k": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 3}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 12}, "n": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 22, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 3}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}}}}}, "e": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 8}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 2}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}}, "df": 2}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "t": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 2}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 7, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}, "p": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 9, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 11}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 5}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.3166247903554}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 11}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "e": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 2}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2}, "skeletor.post": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 3.4641016151377544}, "skeletor.post.clean_up": {"tf": 3.605551275463989}, "skeletor.pre": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 6.324555320336759}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_wavefront": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 4.358898943540674}, "skeletor.skeletonize.by_edge_collapse": {"tf": 3}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.3166247903554}}, "df": 20, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.post.clean_up": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 4}, "skeletor.post.clean_up": {"tf": 2.8284271247461903}, "skeletor.pre": {"tf": 2.23606797749979}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 3}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 18, "p": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}}}, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3, "/": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 17}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 3}}}, "i": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 3}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"1": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 6}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize": {"tf": 2.449489742783178}}, "df": 1}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 8, "r": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}}, "df": 2}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}}, "df": 5, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}}, "df": 4}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "y": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "y": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "m": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 6.4031242374328485}, "skeletor.Skeleton": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2.23606797749979}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.8284271247461903}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 2.6457513110645907}, "skeletor.pre.fix_mesh": {"tf": 3}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 20, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 4}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3}, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}}, "df": 1}}, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "x": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}}, "df": 1}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "+": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {"skeletor": {"tf": 9.746794344808963}, "skeletor.example_mesh": {"tf": 3}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 5}, "h": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {"skeletor": {"tf": 5}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.1622776601683795}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.6457513110645907}}, "df": 16, "n": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "d": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 14}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 10, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 2.23606797749979}}, "df": 2, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}}, "df": 3}}}}, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "k": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 4}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 20, "f": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 13, "g": {"docs": {}, "df": 0, "/": {"1": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "@": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 5}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 13, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "g": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 2.449489742783178}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 9, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "l": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 3}, "skeletor.skeletonize.by_wavefront": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 15}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 8}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}}}}}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 12}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 2}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 3}}, "l": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 13, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 7}}, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "f": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 2}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "i": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.Skeleton.show": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}}, "df": 2}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "/": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "h": {"3": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.skeleton": {"tf": 1}}, "df": 1}}, "docs": {"skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 2}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "i": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "p": {"3": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 7, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 5}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"2": {"5": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"5": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "j": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"skeletor": {"fullname": "skeletor", "modulename": "skeletor", "type": "module", "doc": "

What is skeletor?

\n\n

Unlike its namesake, this skeletor\ndoes not (yet) seek to conquer Eternia but to turn meshes into skeletons.

\n\n

Before we get started some terminology:

\n\n
    \n
  • a mesh is something that consists of vertices and faces
  • \n
  • a skeleton is a (hierarchical) tree-like structure consisting of vertices\n(also called nodes) and edges that connect them
  • \n
\n\n

Skeletons are useful for a range of reasons. For example:

\n\n
    \n
  1. Typically smaller (less vertices) than the mesh
  2. \n
  3. Have an implicit sense of topology (e.g. \"this node is distal to that node\")
  4. \n
\n\n

Extracting skeletons from meshes (or other types of data such as voxels) is\nnon-trivial and there are a great many research papers exploring various\ndifferent approaches (see Google scholar).

\n\n

skeletor implements some algorithms that I found useful in my work with\nneurons. In my experience there is unfortuntely no magic bullet when it\ncomes to skeletonization and chances are you will have to fiddle around a bit\nto get decent results.

\n\n

Installation

\n\n

From PyPI:

\n\n
pip3 install skeletor\n
\n\n

For the bleeding-edge version from Github:

\n\n
pip3 install git+https://github.com/navis-org/skeletor@master\n
\n\n

Getting started

\n\n

A skeletonization pipeline typically consists of:

\n\n
    \n
  1. Some pre-processing of the mesh (e.g. fixing some potential errors like\ndegenerate faces, unreferenced vertices, etc.)
  2. \n
  3. The skeletonization itself
  4. \n
  5. Some post-processing of the skeleton (e.g. adding radius information)
  6. \n
\n\n
\n\n

Here is a complete list of available functions:

\n\n\n\n\n \n \n\n\n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n \n \n\n\n
functiondescription
example data
skeletor.example_mesh()load an example mesh
pre-processing
skeletor.pre.fix_mesh()fix some common errors found in meshes
skeletor.pre.remesh()re-generate mesh (uses Blender 3D)
skeletor.pre.simplify()reduce mesh complexity (uses Blender 3D)
skeletor.pre.contract()contract mesh to facilitate skeletonization [1]
skeletonization
skeletor.skeletonize.by_wavefront()very fast, works well for tubular meshes (like neurons)
skeletor.skeletonize.by_vertex_clusters()very fast but needs mesh to be contracted (see above)
skeletor.skeletonize.by_edge_collapse()presented in [1] but never got this to work well
skeletor.skeletonize.by_teasar()very fast and robust, works on mesh surface
skeletor.skeletonize.by_tangent_ball()very fast, best on smooth meshes
postprocessing
skeletor.post.clean_up()fix some potential errors in the skeleton
skeletor.post.radii()add radius information using various method
\n\n
\n\n

See docstrings of the respective functions for details.

\n\n

A pipeline might look like this:

\n\n
    \n
  1. skeletor.pre.fix_mesh() to fix the mesh
  2. \n
  3. skeletor.pre.simplify() to simplify the mesh
  4. \n
  5. skeletor.pre.contract() to contract the mesh [1]
  6. \n
  7. skeletor.skeletonize.vertex_clusters() to generate a skeleton
  8. \n
  9. skeletor.post.clean_up() to clean up some potential issues with the skeleton
  10. \n
  11. skeletor.post.radii() to extract radii either by k-nearest neighbours or ray-casting
  12. \n
\n\n

In my experience there is no one-size-fits-all. You will have to play around to\nfind the right approach and parameters to get nice skeletons for your meshes.\nIf you need help just open an issue.

\n\n

Also check out the Gotchas below!

\n\n

Examples

\n\n

First load the example mesh (a fruit fly neuron):

\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> mesh\n<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>\n
\n\n

Next see if there is stuff to fix in the mesh (degenerate faces, duplicate\nvertices, etc.):

\n\n
>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> fixed\n<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>\n
\n\n

Now for tubular meshes like this neuron, the \"wave front\" skeletonization method\nperforms really well: it works by casting waves across the mesh and collapsing\nthe resulting rings into a skeleton (kinda like when you throw a stone in a\npond and track the expanding ripples).

\n\n
>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)\n>>> skel\n<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>\n
\n\n

All skeletonization methods return a Skeleton object. These are just\nconvenient objects to bundle the various outputs of the skeletonization.

\n\n
>>> # x/y/z location of skeleton vertices (nodes)\n>>> skel.vertices\narray([[16744, 36720, 26407],\n       ...,\n       [22076, 23217, 24472]])\n>>> # child -> parent edges\n>>> skel.edges\narray([[  64,   31],\n       ...,\n       [1257, 1252]])\n>>> # Mapping for mesh to skeleton vertex indices\n>>> skel.mesh_map\narray([ 157,  158, 1062, ...,  525,  474,  547])\n>>> # SWC table\n>>> skel.swc.head()\n   node_id  parent_id             x             y             z    radius\n0        0         -1  16744.005859  36720.058594  26407.902344  0.000000\n1        1         -1   5602.751953  22266.756510  15799.991211  7.542587\n2        2         -1  16442.666667  14999.978516  10887.916016  5.333333\n
\n\n

SWC is a commonly used format for saving skeletons. Skeleton objects\nhave a method for quickly saving a correctly formatted SWC file:

\n\n
>>> skel.save_swc('~/Documents/my_skeleton.swc')\n
\n\n

If you installed pyglet (see above) you can also use trimesh's plotting\ncapabilities to inspect the results:

\n\n
>>> skel.show(mesh=True)\n
\n\n

\"skeletor_example\"

\n\n

That looks pretty good already but let's run some pro-forma postprocessing.

\n\n
>>> sk.post.clean_up(skel, inplace=True)\n<Skeleton(vertices=(1071, 3), edges=(1070, 2))>\n
\n\n

So that would be a full pipeline mesh to skeleton. Don't expect your own meshes\nto produce such nice results off the bat though. Chances are you will need to\nplay around to find the right recipe. If you don't know where to start, I suggest\nyou try out mesh contraction + vertex clustering first:

\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> # Contract mesh to 10% (0.1) of original volume\n>>> cont = sk.pre.contract(fixed, epsilon=0.1)\n>>> # Skeletonize\n>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)\n>>> # Replace contracted mesh with original for postprocessing and plotting\n>>> skel.mesh = fixed\n>>> # Add radii (vertex cluster method does not do that automatically)\n>>> sk.post.radii(skel, method='knn')\n>>> skel.show(mesh=True)\n
\n\n

Gotchas

\n\n
    \n
  • while this is a general purpose library, my personal focus is on neurons and\nthis has certainly influenced things like default parameter values and certain\npost-processing steps
  • \n
  • meshes need to be triangular (we are using trimesh)
  • \n
  • use sk.pre.simplify if your mesh is very complex (half a million vertices is\nwhere things start getting sluggish)
  • \n
  • a good mesh contraction is often half the battle
  • \n
  • if the mesh consists of multiple disconnected pieces the skeleton will\nlikewise be fragmented (i.e. will have multiple roots)
  • \n
\n\n

Benchmarks

\n\n

\"skeletor_benchmark\"

\n\n

Benchmarks\nwere run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional\nfastremap dependency installed. Note some of these functions (e.g.\ncontraction and TEASAR/vertex cluster skeletonization) vary a lot in\nspeed based on parameterization.

\n\n

What about algorithm X?

\n\n

skeletor contains some algorithms that I found easy enough to implement\nand useful for my work with neurons. If you have some interesting paper/approach\nthat could make a nice addition to skeletor, please get in touch on Github.\nPull requests are always welcome!

\n\n

References

\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n\n

The abstract and the paper can be found here.\nAlso see this YouTube video.

\n\n

Some of the code in skeletor was modified from the\nPy_BL_MeshSkeletonization\naddon created by #0K Srinivasan Ramachandran and published under GPL3.

\n\n

Top-level functions and classes

\n\n

At top-level we only expose example_mesh() and the Skeleton class (which\nyou probably won't ever need to touch manually). Everything else is neatly\ntucked away into submodules (see side-bar or above table).

\n"}, "skeletor.Skeleton": {"fullname": "skeletor.Skeleton", "modulename": "skeletor", "qualname": "Skeleton", "type": "class", "doc": "

Class representing a skeleton.

\n\n

Typically returned as results from a skeletonization.

\n\n
Attributes
\n\n
    \n
  • swc (pd.DataFrame, optional):\nSWC table.
  • \n
  • vertices ((N, 3) array):\nVertex (node) positions.
  • \n
  • edges ((M, 2) array):\nIndices of connected vertex pairs.
  • \n
  • radii ((N, ) array, optional):\nRadii for each vertex (node) in the skeleton.
  • \n
  • mesh (trimesh, optional):\nThe original mesh.
  • \n
  • mesh_map (array, optional):\nSame length as mesh. Maps mesh vertices to vertices (nodes)\nin the skeleton.
  • \n
  • skel_map (array of arrays, optional):\nInverse of mesh_map: maps skeleton vertices (nodes) to mesh\nvertices.
  • \n
  • method (str, optional):\nWhich method was used to generate the skeleton.
  • \n
\n"}, "skeletor.Skeleton.__init__": {"fullname": "skeletor.Skeleton.__init__", "modulename": "skeletor", "qualname": "Skeleton.__init__", "type": "function", "doc": "

\n", "signature": "(self, swc, mesh=None, mesh_map=None, method=None)", "funcdef": "def"}, "skeletor.Skeleton.edges": {"fullname": "skeletor.Skeleton.edges", "modulename": "skeletor", "qualname": "Skeleton.edges", "type": "variable", "doc": "

Return skeleton edges.

\n"}, "skeletor.Skeleton.vertices": {"fullname": "skeletor.Skeleton.vertices", "modulename": "skeletor", "qualname": "Skeleton.vertices", "type": "variable", "doc": "

Return skeleton vertices (nodes).

\n"}, "skeletor.Skeleton.radius": {"fullname": "skeletor.Skeleton.radius", "modulename": "skeletor", "qualname": "Skeleton.radius", "type": "variable", "doc": "

Return radii.

\n"}, "skeletor.Skeleton.skeleton": {"fullname": "skeletor.Skeleton.skeleton", "modulename": "skeletor", "qualname": "Skeleton.skeleton", "type": "variable", "doc": "

Skeleton as trimesh Path3D.

\n"}, "skeletor.Skeleton.skel_map": {"fullname": "skeletor.Skeleton.skel_map", "modulename": "skeletor", "qualname": "Skeleton.skel_map", "type": "variable", "doc": "

Skeleton vertex (nodes) to mesh vertices. Based on mesh_map.

\n"}, "skeletor.Skeleton.leafs": {"fullname": "skeletor.Skeleton.leafs", "modulename": "skeletor", "qualname": "Skeleton.leafs", "type": "variable", "doc": "

Leaf nodes (includes root).

\n"}, "skeletor.Skeleton.reindex": {"fullname": "skeletor.Skeleton.reindex", "modulename": "skeletor", "qualname": "Skeleton.reindex", "type": "function", "doc": "

Clean up skeleton.

\n", "signature": "(self, inplace=False)", "funcdef": "def"}, "skeletor.Skeleton.copy": {"fullname": "skeletor.Skeleton.copy", "modulename": "skeletor", "qualname": "Skeleton.copy", "type": "function", "doc": "

Return copy of the skeleton.

\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.get_graph": {"fullname": "skeletor.Skeleton.get_graph", "modulename": "skeletor", "qualname": "Skeleton.get_graph", "type": "function", "doc": "

Generate networkX representation of the skeletons.

\n\n

Distance between nodes will be used as edge weights.

\n\n
Returns
\n\n
    \n
  • networkx.DiGraph
  • \n
\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.save_swc": {"fullname": "skeletor.Skeleton.save_swc", "modulename": "skeletor", "qualname": "Skeleton.save_swc", "type": "function", "doc": "

Save skeleton in SWC format.

\n\n
Parameters
\n\n
    \n
  • filepath (path-like):\nFilepath to save SWC to.
  • \n
\n", "signature": "(self, filepath)", "funcdef": "def"}, "skeletor.Skeleton.scene": {"fullname": "skeletor.Skeleton.scene", "modulename": "skeletor", "qualname": "Skeleton.scene", "type": "function", "doc": "

Return a Scene object containing the skeleton.

\n\n
Returns
\n\n
    \n
  • scene (trimesh.scene.scene.Scene):\nContains the skeleton and optionally the mesh.
  • \n
\n", "signature": "(self, mesh=False, **kwargs)", "funcdef": "def"}, "skeletor.Skeleton.show": {"fullname": "skeletor.Skeleton.show", "modulename": "skeletor", "qualname": "Skeleton.show", "type": "function", "doc": "

Render the skeleton in an opengl window. Requires pyglet.

\n\n
Parameters
\n\n
    \n
  • mesh (bool):\nIf True, will render transparent mesh on top of the\nskeleton.
  • \n
\n\n
Returns
\n\n
    \n
  • scene (trimesh.scene.Scene):\nScene with skeleton in it.
  • \n
\n", "signature": "(self, mesh=False, **kwargs)", "funcdef": "def"}, "skeletor.example_mesh": {"fullname": "skeletor.example_mesh", "modulename": "skeletor", "qualname": "example_mesh", "type": "function", "doc": "

Load and return example mesh.

\n\n

The example mesh is a fruit fly neuron (an olfactory projection neuron of\nthe DA1 glomerulus) segmented from an EM image data set. It is part of the\nJanelia hemibrain data set (see here) [1].

\n\n
References
\n\n

[1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443\nA connectome and analysis of the adult Drosophila central brain

\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> # Load this example mesh\n>>> mesh = sk.example_mesh()\n
\n", "signature": "()", "funcdef": "def"}, "skeletor.post": {"fullname": "skeletor.post", "modulename": "skeletor.post", "type": "module", "doc": "

The skeletor.post module contains functions to post-process skeletons after\nskeletonization.

\n\n

Fixing issues with skeletons

\n\n

Depending on your mesh, pre-processing and the parameters you chose for\nskeletonization, chances are that your skeleton will not come out perfectly.

\n\n

skeletor.post.clean_up can help you solve some potential issues:

\n\n
    \n
  • skeleton nodes (vertices) that outside or right on the surface instead of\ncentered inside the mesh
  • \n
  • superfluous \"hairs\" on otherwise straight bits
  • \n
\n\n

Computing radius information

\n\n

Only skeletor.skeletonize.by_wavefront() provides radii off the bat. For all\nother methods, you might want to run skeletor.post.radii can help you\n(re-)generate radius information for the skeletons.

\n"}, "skeletor.post.radii": {"fullname": "skeletor.post.radii", "modulename": "skeletor.post", "qualname": "radii", "type": "function", "doc": "

Extract radii for given skeleton table.

\n\n
Important
\n\n

This function really only produces useful radii if the skeleton is centered\ninside the mesh. by_wavefront does that by default whereas all other\nskeletonization methods don't. Your best bet to get centered skeletons is\nto contract the mesh first (sk.pre.contract).

\n\n
Parameters
\n\n
    \n
  • s (skeletor.Skeleton):\nSkeleton to clean up.
  • \n
  • mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with s.
  • \n
  • method (\"knn\" | \"ray\"):\nWhether and how to add radius information to each node::

    \n\n
      \n
    • \"knn\" uses k-nearest-neighbors to get radii: fast but\n potential for being very wrong
    • \n
    • \"ray\" uses ray-casting to get radii: slower but sometimes\n less wrong
    • \n
  • \n
  • aggregate (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\"):\nFunction used to aggregate radii over sample (i.e. across\nk nearest-neighbors or ray intersections)
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore skeletonization. Note that this might make changes to\nyour mesh inplace!
  • \n
  • **kwargs: Keyword arguments are passed to the respective method:
  • \n
\n\n

For method \"knn\"::

\n\n
n :             int (default 5)\n                Radius will be the mean over n nearest-neighbors.\n
\n\n

For method \"ray\"::

\n\n
n_rays :        int (default 20)\n                Number of rays to cast for each node.\nprojection :    \"sphere\" (default) | \"tangents\"\n                Whether to cast rays in a sphere around each node or in a\n                circle orthogonally to the node's tangent vector.\nfallback :      \"knn\" (default) | None | number\n                If a point is outside or right on the surface of the mesh\n                the raycasting will return nonesense results. We can either\n                ignore those cases (``None``), assign a arbitrary number or\n                we can fall back to radii from k-nearest-neighbors (``knn``).\n
\n\n
Returns
\n\n
    \n
  • None: But attaches radius to the skeleton's SWC table. Existing\nvalues are replaced!
  • \n
\n", "signature": "(\n s,\n mesh=None,\n method='knn',\n aggregate='mean',\n validate=False,\n **kwargs\n)", "funcdef": "def"}, "skeletor.post.clean_up": {"fullname": "skeletor.post.clean_up", "modulename": "skeletor.post", "qualname": "clean_up", "type": "function", "doc": "

Clean up the skeleton.

\n\n

This function bundles a bunch of procedures to clean up the skeleton:

\n\n
    \n
  1. Remove twigs that are running parallel to their parent branch
  2. \n
  3. Move nodes outside the mesh back inside (or at least snap to surface)
  4. \n
\n\n

Note that this is not a magic bullet and some of this will not work (well)\nif the original mesh was degenerate (e.g. internal faces or not watertight)\nto begin with.

\n\n
Parameters
\n\n
    \n
  • s (skeletor.Skeleton):\nSkeleton to clean up.
  • \n
  • mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with s.
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore cleaning up. Note that this might change your mesh\ninplace!
  • \n
  • inplace (bool):\nIf False will make and return a copy of the skeleton. If True,\nwill modify the s inplace.
  • \n
  • **kwargs: Keyword arguments are passed to the bundled function.
  • \n
\n\n

For skeletor.postprocessing.drop_parallel_twigs::

\n\n

theta : float (default 0.01)\n For each twig we generate the dotproduct between the tangent\n vectors of it and its parents. If these line up perfectly the\n dotproduct will equal 1. theta determines how much that\n value can differ from 1 for us to still prune the twig: higher\n theta = more pruning.

\n\n
Returns
\n\n
    \n
  • s_clean (skeletor.Skeleton):\nHopefully improved skeleton.
  • \n
\n", "signature": "(s, mesh=None, validate=False, inplace=False, **kwargs)", "funcdef": "def"}, "skeletor.pre": {"fullname": "skeletor.pre", "modulename": "skeletor.pre", "type": "module", "doc": "

The skeletor.pre module contains functions to pre-process meshes before\nskeletonization.

\n\n

Fixing faulty meshes

\n\n

Some skeletonization methods are susceptible to faulty meshes (degenerate faces,\nwrong normals, etc.). If your skeleton looks off, it might be worth a shot\ntrying to fix the mesh using skeletor.pre.fix_mesh().

\n\n

Mesh contraction

\n\n

As a rule of thumb: the more your mesh looks like a skeleton, the easier it is\nto extract one (duh). Mesh contraction using skeletor.pre.contract() [1] can\nhelp you to get your mesh \"in shape\".

\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n"}, "skeletor.pre.fix_mesh": {"fullname": "skeletor.pre.fix_mesh", "modulename": "skeletor.pre", "qualname": "fix_mesh", "type": "function", "doc": "

Try to fix some common problems with mesh.

\n\n
    \n
  1. Remove infinite values
  2. \n
  3. Merge duplicate vertices
  4. \n
  5. Remove duplicate and degenerate faces
  6. \n
  7. Remove unreference vertices
  8. \n
  9. Drop winglets (faces that have only one adjacent face)
  10. \n
  11. Fix normals (Optional)
  12. \n
  13. Remove disconnected fragments (Optional)
  14. \n
\n\n
Parameters
\n\n
    \n
  • mesh (mesh-like object):\nMesh to fix. Must have .vertices and .faces\nproperties.
  • \n
  • remove_disconnected (False | int):\nIf a number is given, will iterate over the mesh's\nconnected components and remove those consisting of\nless than the given number of vertices. For example,\nremove_disconnected=5 will drop parts of the\nmesh that consist of five or less connected\nvertices.
  • \n
  • inplace (bool):\nIf True, will perform fixes on the input mesh.\nIf False, will make a copy first. This is silently\nignored if mesh is not already a trimesh.
  • \n
\n\n
Returns
\n\n
    \n
  • fixed mesh (trimesh.Trimesh):
  • \n
\n", "signature": "(\n mesh,\n remote_infinite=True,\n merge_duplicate_verts=True,\n remove_degenerate_faces=True,\n remove_unreferenced_verts=True,\n drop_winglets=True,\n fix_normals=False,\n remove_disconnected=False,\n inplace=False\n)", "funcdef": "def"}, "skeletor.pre.simplify": {"fullname": "skeletor.pre.simplify", "modulename": "skeletor.pre", "qualname": "simplify", "type": "function", "doc": "

Simplify mesh using Blender 3D.

\n\n

Uses Blender's \"decimate\" modifier in \"collapse\" mode.

\n\n
Parameters
\n\n
    \n
  • mesh (trimesh.Trimesh):\nMesh to simplify.
  • \n
  • ratio (float):\nFactor to which to reduce faces. For example, a ratio of 0.5 will\nreduce the number of faces to 50%.
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Simplified mesh.
  • \n
\n", "signature": "(mesh, ratio)", "funcdef": "def"}, "skeletor.pre.remesh": {"fullname": "skeletor.pre.remesh", "modulename": "skeletor.pre", "qualname": "remesh", "type": "function", "doc": "

Remesh mesh using Blender 3D.

\n\n

Uses Blender's \"remesh\" modifier in \"voxel\" mode.

\n\n
Parameters
\n\n
    \n
  • mesh (trimesh.Trimesh):\nMesh to remesh.
  • \n
  • voxel_size (float):\nSize of individual voxels (edge length).
  • \n
  • adaptivity (float):\nReduces final face count where detail is not important.
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Remeshed mesh.
  • \n
\n", "signature": "(mesh, voxel_size=50, adaptivity=5)", "funcdef": "def"}, "skeletor.pre.contract": {"fullname": "skeletor.pre.contract", "modulename": "skeletor.pre", "qualname": "contract", "type": "function", "doc": "

Contract mesh.

\n\n

In a nutshell: this function contracts the mesh by applying rounds of\n_constraint_ Laplacian smoothing. This function can be fairly expensive\nand I highly recommend you play around with SL to contract the\nmesh in as few steps as possible. The contraction doesn't have to be perfect\nfor good skeletonization results (<10%, i.e. epsilon<0.1).

\n\n

Also: parameterization matters a lot! Default parameters will get you there\nbut playing around with SL and WH0 might speed things up by an order of\nmagnitude.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be contracted. Can be any object (e.g.\na trimesh.Trimesh) that has .vertices and .faces\nproperties or a tuple (vertices, faces) or a dictionary\n{'vertices': vertices, 'faces': faces}.\nVertices and faces must be (N, 3) numpy arrays.
  • \n
  • epsilon (float (0-1), optional):\nTarget contraction rate as measured by the sum of all face\nareas in the contracted versus the original mesh. Algorithm\nwill stop once mesh is contracted below this threshold.\nDepending on your mesh (number of faces, shape) reaching a\nstrong contraction can be extremely costly with comparatively\nlittle benefit for the subsequent skeletonization. Note that\nthe algorithm might stop short of this target if iter_lim\nor time_lim is reached first or if the sum of face areas\nis increasing from one iteration to the next instead of\ndecreasing.
  • \n
  • iter_lim (int (>1), optional):\nMaximum rounds of contractions.
  • \n
  • time_lim (int, optional):\nMaximum run time in seconds. Note that this limit is not\nchecked during but after each round of contraction. Hence,\nthe actual total time will likely overshoot time_lim.
  • \n
  • precision (float, optional):\nSets the precision for finding the least-square solution.\nThis is the main determinant for speed vs quality: lower\nvalues will take (much) longer but will get you closer to an\noptimally contracted mesh. Higher values will be faster but\nthe iterative contractions might stop early.
  • \n
  • SL (float, optional):\nFactor by which the contraction matrix is multiplied for\neach iteration. Higher values = quicker contraction, lower\nvalues = more likely to get you an optimal contraction.
  • \n
  • WH0 (float, optional):\nInitial weight factor for the attraction constraints.\nThe ratio of the initial weights WL0 and WH0\ncontrols the smoothness and the degree of contraction of the\nfirst iteration result, thus it determines the amount of\ndetails retained in subsequent and final contracted meshes:\nhigher WH0 = more details retained.
  • \n
  • WL0 (\"auto\" | float):\nInitial weight factor for the contraction constraints. By\ndefault (\"auto\"), this will be set to 1e-3 * sqrt(A)\nwith A being the average face area. This ensures that\ncontraction forces scale with the coarseness of the mesh.
  • \n
  • operator (\"cotangent\" | \"umbrella\"):\nWhich Laplacian operator to use:

    \n\n
      \n
    • The \"cotangent\" operator (default) takes both topology\nand geometry of the mesh into account and is hence a\nbetter descriptor of the curvature flow. This is the\noperator used in the original paper.
    • \n
    • The \"umbrella\" operator (aka \"uniform weighting\") uses\nonly topological features of the mesh. This also makes\nit more robust against flaws in the mesh! Use it when\nthe cotangent operator produces oddly contracted meshes.
    • \n
  • \n
  • progress (bool):\nWhether or not to show a progress bar.
  • \n
  • validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore collapsing. Degenerate meshes can lead to effectively\ninfinite runtime for this function!
  • \n
\n\n
Returns
\n\n
    \n
  • trimesh.Trimesh: Contracted copy of original mesh. The final contraction rate\nis attached to the mesh as .epsilon property.
  • \n
\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n", "signature": "(\n mesh,\n epsilon=1e-06,\n iter_lim=100,\n time_lim=None,\n precision=1e-07,\n SL=2,\n WH0=1,\n WL0='auto',\n operator='cotangent',\n progress=True,\n validate=True\n)", "funcdef": "def"}, "skeletor.skeletonize": {"fullname": "skeletor.skeletonize", "modulename": "skeletor.skeletonize", "type": "module", "doc": "

The skeletor.skeletonize module contains functions to for skeletonization\nof meshes.

\n\n

There are several approaches to skeletonizing a mesh. Which one to pick depends\n(among other things) on the shape of your mesh and the skeleton quality you want\nto get out of it. In general, unless you mesh already looks like a tube I\nrecommend looking into mesh contraction 4.

\n\n

Please see the documentation of the individual functions for details but here\nis a quick summary:

\n\n\n\n\n \n \n \n \n \n \n\n\n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n\n\n
functionspeedrobustradii 1mesh map 2description
skeletor.skeletonize.by_wavefront()+++++yesyesworks well for tubular meshes
skeletor.skeletonize.by_vertex_clusters()+++noyesbest with contracted meshes 3
skeletor.skeletonize.by_teasar()+++noyesworks on mesh surface
skeletor.skeletonize.by_tangent_ball()++0yesyesworks with mesh normals
skeletor.skeletonize.by_edge_collapse()-0nonopublished with [1] - never got this to work well
\n\n

References

\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n\n
\n
\n
    \n
  1. \n

    radii can also be added in postprocessing with skeletor.post.radii() 

    \n
  2. \n\n
  3. \n

    a mapping from the meshes vertices to skeleton nodes 

    \n
  4. \n\n
  5. \n

    use skeletor.pre.contract() 

    \n
  6. \n\n
  7. \n

    use skeletor.pre.contract() 

    \n
  8. \n
\n
\n"}, "skeletor.skeletonize.by_teasar": {"fullname": "skeletor.skeletonize.by_teasar", "modulename": "skeletor.skeletonize", "qualname": "by_teasar", "type": "function", "doc": "

Skeletonize a mesh mesh using the TEASAR algorithm [1].

\n\n

This algorithm finds the longest path from a root vertex, invalidates all\nvertices that are within inv_dist. Then picks the second longest (and\nstill valid) path and does the same. Rinse & repeat until all vertices have\nbeen invalidated. It's fast + works very well with tubular meshes, and with\ninv_dist you have control over the level of detail. Note that by its\nnature the skeleton will be exactly on the surface of the mesh.

\n\n

Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and\nForrest Collman in meshparty (https://github.com/sdorkenw/MeshParty).

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • inv_dist (int | float):\nDistance along the mesh used for invalidation of vertices.\nThis controls how detailed (or noisy) the skeleton will be.
  • \n
  • min_length (float, optional):\nIf provided, will skip any branch that is shorter than\nmin_length. Use this to get rid of noise but note that\nit will lead to vertices not being mapped to skeleton nodes.\nSuch vertices will show up with index -1 in\nSkeleton.mesh_map.
  • \n
  • root (int, optional):\nVertex ID of a root. If not provided will use 0.
  • \n
  • progress (bool, optional):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
References
\n\n

[1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.\n (n.d.). TEASAR: tree-structure extraction algorithm for accurate and\n robust skeletons. In Proceedings the Eighth Pacific Conference on\n Computer Graphics and Applications. IEEE Comput. Soc.\n https://doi.org/10.1109/pccga.2000.883951

\n", "signature": "(mesh, inv_dist, min_length=None, root=None, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_wavefront": {"fullname": "skeletor.skeletonize.by_wavefront", "modulename": "skeletor.skeletonize", "qualname": "by_wavefront", "type": "function", "doc": "

Skeletonize a mesh using wave fronts.

\n\n

The algorithm tries to find rings of vertices and collapse them to\ntheir center. This is done by propagating a wave across the mesh starting at\na single seed vertex. As the wave travels across the mesh we keep track of\nwhich vertices are are encountered at each step. Groups of connected\nvertices that are \"hit\" by the wave at the same time are considered rings\nand subsequently collapsed. By its nature this works best with tubular meshes.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • waves (int):\nNumber of waves to run across the mesh. Each wave is\ninitialized at a different vertex which produces slightly\ndifferent rings. The final skeleton is produced from a mean\nacross all waves. More waves produce higher resolution\nskeletons but also introduce more noise.
  • \n
  • origins (int | list of ints, optional):\nVertex ID(s) where the wave(s) are initialized. If we run\nout of origins (either because less origins than waves\nor because no origin for one of the connected components)\nwill fall back to semi-random origin.
  • \n
  • step_size (int):\nValues greater 1 effectively lead to binning of rings. For\nexample a stepsize of 2 means that two adjacent vertex rings\nwill be collapsed to the same center. This can help reduce\nnoise in the skeleton (and as such counteracts a large\nnumber of waves).
  • \n
  • radius_agg (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\" | \"percentile25\"):\nFunction used to aggregate radii over sample (i.e. the\nvertices forming a ring that we collapse to its center).
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n", "signature": "(\n mesh,\n waves=1,\n origins=None,\n step_size=1,\n radius_agg='mean',\n progress=True\n)", "funcdef": "def"}, "skeletor.skeletonize.by_vertex_clusters": {"fullname": "skeletor.skeletonize.by_vertex_clusters", "modulename": "skeletor.skeletonize", "qualname": "by_vertex_clusters", "type": "function", "doc": "

Skeletonize a (contracted) mesh by clustering vertices.

\n\n

The algorithm traverses the mesh graph and groups vertices together that\nare within a given distance to each other. This uses the geodesic\n(along-the-mesh) distance, not simply the Eucledian distance. Subsequently\nthese groups of vertices are collapsed and re-connected respecting the\ntopology of the input mesh.

\n\n

The graph traversal is fast and scales well, so this method is well suited\nfor meshes with lots of vertices. On the downside: this implementation is\nnot very clever and you might have to play around with the parameters\n(mostly sampling_dist) to get decent results.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • sampling_dist (float | int):\nMaximal distance at which vertices are clustered. This\nparameter should be tuned based on the resolution of your\nmesh (see Examples).
  • \n
  • cluster_pos (\"median\" | \"center\"):\nHow to determine the x/y/z coordinates of the collapsed\nvertex clusters (i.e. the skeleton's nodes)::

    \n\n
      \n
    • \"median\": Use the vertex closest to cluster's center of\nmass.
    • \n
    • \"center\": Use the center of mass. This makes for smoother\nskeletons but can lead to nodes outside the mesh.
    • \n
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> cont = sk.pre.contract(mesh, epsilon=0.1)\n>>> skel = sk.skeletonize.vertex_cluster(cont)\n>>> skel.mesh = mesh\n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n", "signature": "(mesh, sampling_dist, cluster_pos='median', progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_edge_collapse": {"fullname": "skeletor.skeletonize.by_edge_collapse", "modulename": "skeletor.skeletonize", "qualname": "by_edge_collapse", "type": "function", "doc": "

Skeletonize a (contracted) mesh by iteratively collapsing edges.

\n\n

This algorithm (described in [1]) iteratively collapses edges that are part\nof a face until no more faces are left. Edges are chosen based on a cost\nfunction that penalizes collapses that would change the shape of the object\nor would introduce long edges.

\n\n

This is somewhat sensitive to the dimensions of the input mesh: too large\nand you might experience slow-downs or numpy OverflowErrors; too low and\nyou might get skeletons that don't quite match the mesh (e.g. too few nodes).\nIf you experience either, try down- or up-scaling your mesh, respectively.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
  • shape_weight (float, optional):\nWeight for shape costs which penalize collapsing edges that\nwould drastically change the shape of the object.
  • \n
  • sample_weight (float, optional):\nWeight for sampling costs which penalize collapses that\nwould generate prohibitively long edges.
  • \n
  • progress (bool):\nIf True, will show progress bar.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
References
\n\n

[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

\n", "signature": "(mesh, shape_weight=1, sample_weight=0.1, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_tangent_ball": {"fullname": "skeletor.skeletonize.by_tangent_ball", "modulename": "skeletor.skeletonize", "qualname": "by_tangent_ball", "type": "function", "doc": "

Skeletonize a mesh by finding the maximal tangent ball.

\n\n

This algorithm casts a ray from every mesh vertex along its inverse normals\n(requires ncollpyde). It then creates a sphere that is tangent to the\nvertex and to where the ray hit the inside of a face on the opposite side.\nNext it drops spheres that overlap with another, larger sphere. Modified\nfrom [1].

\n\n

The method works best on smooth meshes and is rather sensitive to errors in\nthe mesh such as incorrect normals (see skeletor.pre.fix_mesh), internal\nfaces, noisy surface (try smoothing or downsampling) or holes in the mesh.

\n\n
Parameters
\n\n
    \n
  • mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n.vertices and .faces properties (e.g. a\ntrimesh.Trimesh) or a tuple (vertices, faces) or a\ndictionary {'vertices': vertices, 'faces': faces}.
  • \n
\n\n
Returns
\n\n
    \n
  • skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization.
  • \n
\n\n
Examples
\n\n
>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)\n>>> skel = sk.skeletonize.by_tangent_ball(fixed)\n
\n\n
References
\n\n

[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using\n nearest neighbors and the normal field. Vis Comput 28, 7\u201319 (2012).\n https://doi.org/10.1007/s00371-011-0594-7

\n", "signature": "(mesh)", "funcdef": "def"}}, "docInfo": {"skeletor": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 2771}, "skeletor.Skeleton": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 161}, "skeletor.Skeleton.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "skeletor.Skeleton.edges": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "skeletor.Skeleton.vertices": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.radius": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "skeletor.Skeleton.skeleton": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.skel_map": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 15}, "skeletor.Skeleton.leafs": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.reindex": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 5, "bases": 0, "doc": 6}, "skeletor.Skeleton.copy": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 8}, "skeletor.Skeleton.get_graph": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 34}, "skeletor.Skeleton.save_swc": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 29}, "skeletor.Skeleton.scene": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 35}, "skeletor.Skeleton.show": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 60}, "skeletor.example_mesh": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 2, "bases": 0, "doc": 156}, "skeletor.post": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 139}, "skeletor.post.radii": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 406}, "skeletor.post.clean_up": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 303}, "skeletor.pre": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 143}, "skeletor.pre.fix_mesh": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 204}, "skeletor.pre.simplify": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 83}, "skeletor.pre.remesh": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 8, "bases": 0, "doc": 86}, "skeletor.pre.contract": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 762}, "skeletor.skeletonize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 437}, "skeletor.skeletonize.by_teasar": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 382}, "skeletor.skeletonize.by_wavefront": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 388}, "skeletor.skeletonize.by_vertex_clusters": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 475}, "skeletor.skeletonize.by_edge_collapse": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 297}, "skeletor.skeletonize.by_tangent_ball": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 388}}, "length": 30, "save": true}, "index": {"qualname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 14}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "fullname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 30}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 14, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"6": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}, "1": {"0": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "2": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.reindex": {"tf": 1.4142135623730951}, "skeletor.Skeleton.copy": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 19, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 7}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 14}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 6}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 4}}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0}}, "doc": {"root": {"0": {"0": {"0": {"0": {"0": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"8": {"5": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "5": {"8": {"5": {"9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "1": {"0": {"0": {"7": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"0": {"0": {"3": {"7": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "6": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}, "1": {"0": {"9": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"5": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"0": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"9": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "4": {"4": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 3.7416573867739413}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "2": {"0": {"0": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "1": {"2": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "2": {"0": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "2": {"0": {"7": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"6": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"2": {"1": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"4": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"4": {"0": {"7": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "8": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}, "3": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "2": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "3": {"3": {"3": {"3": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"7": {"2": {"0": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"docs": {"skeletor": {"tf": 2}}, "df": 1}, "docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "4": {"4": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "7": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}, "2": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "4": {"2": {"5": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"3": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}}, "df": 4}, "6": {"2": {"1": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "5": {"8": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"6": {"6": {"6": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"5": {"1": {"9": {"5": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"4": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "6": {"5": {"1": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "\u2013": {"1": {"9": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "8": {"6": {"1": {"7": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"3": {"9": {"5": {"1": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"0": {"2": {"3": {"4": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"6": {"0": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"8": {"5": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"1": {"2": {"1": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 38.09199390948182}, "skeletor.Skeleton": {"tf": 8}, "skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.Skeleton.edges": {"tf": 1.7320508075688772}, "skeletor.Skeleton.vertices": {"tf": 1.7320508075688772}, "skeletor.Skeleton.radius": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 2.23606797749979}, "skeletor.Skeleton.leafs": {"tf": 1.7320508075688772}, "skeletor.Skeleton.reindex": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1.7320508075688772}, "skeletor.Skeleton.get_graph": {"tf": 4}, "skeletor.Skeleton.save_swc": {"tf": 3.872983346207417}, "skeletor.Skeleton.scene": {"tf": 3.872983346207417}, "skeletor.Skeleton.show": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 8.246211251235321}, "skeletor.post": {"tf": 5.656854249492381}, "skeletor.post.radii": {"tf": 10.198039027185569}, "skeletor.post.clean_up": {"tf": 8.774964387392123}, "skeletor.pre": {"tf": 5.0990195135927845}, "skeletor.pre.fix_mesh": {"tf": 8.366600265340756}, "skeletor.pre.simplify": {"tf": 5.916079783099616}, "skeletor.pre.remesh": {"tf": 6.4031242374328485}, "skeletor.pre.contract": {"tf": 12.36931687685298}, "skeletor.skeletonize": {"tf": 14.966629547095765}, "skeletor.skeletonize.by_teasar": {"tf": 9.539392014169456}, "skeletor.skeletonize.by_wavefront": {"tf": 9.16515138991168}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 14.177446878757825}, "skeletor.skeletonize.by_edge_collapse": {"tf": 8.366600265340756}, "skeletor.skeletonize.by_tangent_ball": {"tf": 12.922847983320086}}, "df": 30, "w": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}}, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 4, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 5}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4}}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}}}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}}, "i": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 4}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 11}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "k": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 3}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 12}, "n": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 22, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 3}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}}}}}, "e": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 8}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 2}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}}, "df": 2}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "t": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 2}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 7, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}, "p": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 9, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 12}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 5}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.3166247903554}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 11}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "e": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 2}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2}, "skeletor.post": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 3.4641016151377544}, "skeletor.post.clean_up": {"tf": 3.605551275463989}, "skeletor.pre": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 6.324555320336759}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_wavefront": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 4.358898943540674}, "skeletor.skeletonize.by_edge_collapse": {"tf": 3}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.3166247903554}}, "df": 20, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.post.clean_up": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 4}, "skeletor.post.clean_up": {"tf": 2.8284271247461903}, "skeletor.pre": {"tf": 2.23606797749979}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 3}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 18, "p": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}}}, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3, "/": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 17}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 3}}}, "i": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 3}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"1": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 6}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize": {"tf": 2.449489742783178}}, "df": 1}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 8, "r": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}}, "df": 2}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}}, "df": 5, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}}, "df": 4}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "y": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "y": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "m": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 6.4031242374328485}, "skeletor.Skeleton": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2.23606797749979}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.8284271247461903}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 2.6457513110645907}, "skeletor.pre.fix_mesh": {"tf": 3}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 20, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 4}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3}, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}}, "df": 1}}, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "x": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}}, "df": 1}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "+": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {"skeletor": {"tf": 9.746794344808963}, "skeletor.example_mesh": {"tf": 3}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 5}, "h": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {"skeletor": {"tf": 5}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.1622776601683795}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.6457513110645907}}, "df": 16, "n": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "d": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 14}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 10, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 2.23606797749979}}, "df": 2, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}}, "df": 3}}}}, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "k": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 4}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 20, "f": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 13, "g": {"docs": {}, "df": 0, "/": {"1": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "@": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 5}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 13, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "g": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 2.449489742783178}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 9, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "l": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 3}, "skeletor.skeletonize.by_wavefront": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 15}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 8}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}}}}}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 12}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 2}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 3}}, "l": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 13, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 7}}, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "f": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 2}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "i": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.Skeleton.show": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}}, "df": 2}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "/": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "h": {"3": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.skeleton": {"tf": 1}}, "df": 1}}, "docs": {"skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 2}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "i": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "p": {"3": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 7, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 5}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"2": {"5": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"5": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "j": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; // mirrored in build-search-index.js (part 1) // Also split on html tags. this is a cheap heuristic, but good enough. diff --git a/docs/skeletor.html b/docs/skeletor.html index a78b298..27a8d80 100644 --- a/docs/skeletor.html +++ b/docs/skeletor.html @@ -3,14 +3,14 @@ - + skeletor API documentation - - + +
-
+

skeletor

@@ -398,518 +401,526 @@

Top-level functions and classes

tucked away into submodules (see side-bar or above table).

-
- View Source -
#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
-#    Copyright (C) 2018 Philipp Schlegel
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program.
-
-r"""
-# What is skeletor?
-
-Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor`
-does not (yet) seek to conquer Eternia but to turn meshes into skeletons.
-
-Before we get started some terminology:
-
-- a *mesh* is something that consists of *vertices* and *faces*
-- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices*
-  (also called *nodes*) and *edges* that connect them
-
-Skeletons are useful for a range of reasons. For example:
-
-1. Typically smaller (less vertices) than the mesh
-2. Have an implicit sense of topology (e.g. "this node is distal to that node")
-
-Extracting skeletons from meshes (or other types of data such as voxels) is
-non-trivial and there are a great many research papers exploring various
-different approaches (see [Google scholar](https://scholar.google.com/scholar
-?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)).
-
-`skeletor` implements some algorithms that I found useful in my work with
-neurons. In my experience there is unfortuntely no magic bullet when it
-comes to skeletonization and chances are you will have to fiddle around a bit
-to get decent results.
-
-# Installation
-
-From PyPI:
-```bash
-pip3 install skeletor
-```
-
-For the bleeding-edge version from Github:
-```bash
-pip3 install git+https://github.com/navis-org/skeletor@master
-```
-
-# Getting started
-
-A skeletonization pipeline typically consists of:
-
-1. Some pre-processing of the mesh (e.g. fixing some potential errors like
-   degenerate faces, unreferenced vertices, etc.)
-2. The skeletonization itself
-3. Some post-processing of the skeleton (e.g. adding radius information)
-
-------
-
-Here is a complete list of available functions:
-
-| function                                    | description                                                 |
-| ------------------------------------------- | ----------------------------------------------------------- |
-| **example data**                            |                                                             |
-| `skeletor.example_mesh()`                   | load an example mesh                                        |
-| **pre-processing**                          |                                                             |
-| `skeletor.pre.fix_mesh()`                   | fix some common errors found in meshes                      |
-| `skeletor.pre.remesh()`                     | re-generate mesh (uses Blender 3D)                          |
-| `skeletor.pre.simplify()`                   | reduce mesh complexity (uses Blender 3D)                    |
-| `skeletor.pre.contract()`                   | contract mesh to facilitate skeletonization [1]             |
-| **skeletonization**                         |                                                             |
-| `skeletor.skeletonize.by_wavefront()`       | very fast, works well for tubular meshes (like neurons)     |
-| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above)       |
-| `skeletor.skeletonize.by_edge_collapse()`   | presented in [1] but never got this to work well            |
-| `skeletor.skeletonize.by_teasar()`          | very fast and robust, works on mesh surface                 |
-| `skeletor.skeletonize.by_tangent_ball()`    | very fast, best on smooth meshes                            |
-| **postprocessing**                          |                                                             |
-| `skeletor.post.clean_up()`                  | fix some potential errors in the skeleton                   |
-| `skeletor.post.radii()`                     | add radius information using various method                 |
-
-------
-
-See docstrings of the respective functions for details.
-
-A pipeline might look like this:
-
- 1. `skeletor.pre.fix_mesh()` to fix the mesh
- 2. `skeletor.pre.simplify()` to simplify the mesh
- 3. `skeletor.pre.contract()` to contract the mesh [1]
- 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton
- 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton
- 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting
-
-In my experience there is no one-size-fits-all. You will have to play around to
-find the right approach and parameters to get nice skeletons for your meshes.
-If you need help just open an [issue](https://github.com/navis-org/skeletor/issues).
-
-Also check out the Gotchas below!
-
-# Examples
-
-First load the example mesh (a fruit fly neuron):
-
-```Python
->>> import skeletor as sk
->>> mesh = sk.example_mesh()
->>> mesh
-<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>
-```
-
-Next see if there is stuff to fix in the mesh (degenerate faces, duplicate
-vertices, etc.):
-
-```Python
->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
->>> fixed
-<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>
-```
-
-Now for tubular meshes like this neuron, the "wave front" skeletonization method
-performs really well: it works by casting waves across the mesh and collapsing
-the resulting rings into a skeleton (kinda like when you throw a stone in a
-pond and track the expanding ripples).
-
-```Python
->>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)
->>> skel
-<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>
-```
-
-All skeletonization methods return a `Skeleton` object. These are just
-convenient objects to bundle the various outputs of the skeletonization.
-
-```Python
->>> # x/y/z location of skeleton vertices (nodes)
->>> skel.vertices
-array([[16744, 36720, 26407],
-       ...,
-       [22076, 23217, 24472]])
->>> # child -> parent edges
->>> skel.edges
-array([[  64,   31],
-       ...,
-       [1257, 1252]])
->>> # Mapping for mesh to skeleton vertex indices
->>> skel.mesh_map
-array([ 157,  158, 1062, ...,  525,  474,  547])
->>> # SWC table
->>> skel.swc.head()
-   node_id  parent_id             x             y             z    radius
-0        0         -1  16744.005859  36720.058594  26407.902344  0.000000
-1        1         -1   5602.751953  22266.756510  15799.991211  7.542587
-2        2         -1  16442.666667  14999.978516  10887.916016  5.333333
-```
-
-SWC is a commonly used format for saving skeletons. `Skeleton` objects
-have a method for quickly saving a correctly formatted SWC file:
-
-```Python
->>> skel.save_swc('~/Documents/my_skeleton.swc')
-```
-
-If you installed `pyglet` (see above) you can also use `trimesh`'s plotting
-capabilities to inspect the results:
-
-```Python
->>> skel.show(mesh=True)
-```
-
-<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/>
-
-That looks pretty good already but let's run some pro-forma postprocessing.
-
-```Python
->>> sk.post.clean_up(skel, inplace=True)
-<Skeleton(vertices=(1071, 3), edges=(1070, 2))>
-```
-
-So that would be a full pipeline mesh to skeleton. Don't expect your own meshes
-to produce such nice results off the bat though. Chances are you will need to
-play around to find the right recipe. If you don't know where to start, I suggest
-you try out mesh contraction + vertex clustering first:
-
-```Python
->>> import skeletor as sk
->>> mesh = sk.example_mesh()
->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
->>> # Contract mesh to 10% (0.1) of original volume
->>> cont = sk.pre.contract(fixed, epsilon=0.1)
->>> # Skeletonize
->>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)
->>> # Replace contracted mesh with original for postprocessing and plotting
->>> skel.mesh = fixed
->>> # Add radii (vertex cluster method does not do that automatically)
->>> sk.post.radii(skel, method='knn')
->>> skel.show(mesh=True)
-```
-
-# Gotchas
-
-- while this is a general purpose library, my personal focus is on neurons and
-  this has certainly influenced things like default parameter values and certain
-  post-processing steps
-- meshes need to be triangular (we are using `trimesh`)
-- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is
-  where things start getting sluggish)
-- a good mesh contraction is often half the battle
-- if the mesh consists of multiple disconnected pieces the skeleton will
-  likewise be fragmented (i.e. will have multiple roots)
-
-# Benchmarks
-
-<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/>
-
-[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb)
-were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional
-`fastremap` dependency installed. Note some of these functions (e.g.
-contraction and TEASAR/vertex cluster skeletonization) vary a lot in
-speed based on parameterization.
-
-# What about algorithm `X`?
-
-`skeletor` contains some algorithms that I found easy enough to implement
-and useful for my work with neurons. If you have some interesting paper/approach
-that could make a nice addition to `skeletor`, please get in touch on Github.
-Pull requests are always welcome!
-
-# References
-
-`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
-
-The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/).
-Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video.
-
-Some of the code in skeletor was modified from the
-[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization)
-addon created by #0K Srinivasan Ramachandran and published under GPL3.
-
-# Top-level functions and classes
-At top-level we only expose `example_mesh()` and the `Skeleton` class (which
-you probably won't ever need to touch manually). Everything else is neatly
-tucked away into submodules (see side-bar or above table).
-
-"""
-
-__version__ = "1.2.0"
-__version_vector__ = (1, 2, 0)
-
-from . import skeletonize
-from . import pre
-from . import post
-
-from .skeletonize.base import Skeleton
-from .data import example_mesh
+                        
+
+                        
+
+                        
  1#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
+  2#    Copyright (C) 2018 Philipp Schlegel
+  3#
+  4#    This program is free software: you can redistribute it and/or modify
+  5#    it under the terms of the GNU General Public License as published by
+  6#    the Free Software Foundation, either version 3 of the License, or
+  7#    (at your option) any later version.
+  8#
+  9#    This program is distributed in the hope that it will be useful,
+ 10#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ 11#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ 12#    GNU General Public License for more details.
+ 13#
+ 14#    You should have received a copy of the GNU General Public License
+ 15#    along with this program.
+ 16
+ 17r"""
+ 18# What is skeletor?
+ 19
+ 20Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor`
+ 21does not (yet) seek to conquer Eternia but to turn meshes into skeletons.
+ 22
+ 23Before we get started some terminology:
+ 24
+ 25- a *mesh* is something that consists of *vertices* and *faces*
+ 26- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices*
+ 27  (also called *nodes*) and *edges* that connect them
+ 28
+ 29Skeletons are useful for a range of reasons. For example:
+ 30
+ 311. Typically smaller (less vertices) than the mesh
+ 322. Have an implicit sense of topology (e.g. "this node is distal to that node")
+ 33
+ 34Extracting skeletons from meshes (or other types of data such as voxels) is
+ 35non-trivial and there are a great many research papers exploring various
+ 36different approaches (see [Google scholar](https://scholar.google.com/scholar
+ 37?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)).
+ 38
+ 39`skeletor` implements some algorithms that I found useful in my work with
+ 40neurons. In my experience there is unfortuntely no magic bullet when it
+ 41comes to skeletonization and chances are you will have to fiddle around a bit
+ 42to get decent results.
+ 43
+ 44# Installation
+ 45
+ 46From PyPI:
+ 47```bash
+ 48pip3 install skeletor
+ 49```
+ 50
+ 51For the bleeding-edge version from Github:
+ 52```bash
+ 53pip3 install git+https://github.com/navis-org/skeletor@master
+ 54```
+ 55
+ 56# Getting started
+ 57
+ 58A skeletonization pipeline typically consists of:
+ 59
+ 601. Some pre-processing of the mesh (e.g. fixing some potential errors like
+ 61   degenerate faces, unreferenced vertices, etc.)
+ 622. The skeletonization itself
+ 633. Some post-processing of the skeleton (e.g. adding radius information)
+ 64
+ 65------
+ 66
+ 67Here is a complete list of available functions:
+ 68
+ 69| function                                    | description                                                 |
+ 70| ------------------------------------------- | ----------------------------------------------------------- |
+ 71| **example data**                            |                                                             |
+ 72| `skeletor.example_mesh()`                   | load an example mesh                                        |
+ 73| **pre-processing**                          |                                                             |
+ 74| `skeletor.pre.fix_mesh()`                   | fix some common errors found in meshes                      |
+ 75| `skeletor.pre.remesh()`                     | re-generate mesh (uses Blender 3D)                          |
+ 76| `skeletor.pre.simplify()`                   | reduce mesh complexity (uses Blender 3D)                    |
+ 77| `skeletor.pre.contract()`                   | contract mesh to facilitate skeletonization [1]             |
+ 78| **skeletonization**                         |                                                             |
+ 79| `skeletor.skeletonize.by_wavefront()`       | very fast, works well for tubular meshes (like neurons)     |
+ 80| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above)       |
+ 81| `skeletor.skeletonize.by_edge_collapse()`   | presented in [1] but never got this to work well            |
+ 82| `skeletor.skeletonize.by_teasar()`          | very fast and robust, works on mesh surface                 |
+ 83| `skeletor.skeletonize.by_tangent_ball()`    | very fast, best on smooth meshes                            |
+ 84| **postprocessing**                          |                                                             |
+ 85| `skeletor.post.clean_up()`                  | fix some potential errors in the skeleton                   |
+ 86| `skeletor.post.radii()`                     | add radius information using various method                 |
+ 87
+ 88------
+ 89
+ 90See docstrings of the respective functions for details.
+ 91
+ 92A pipeline might look like this:
+ 93
+ 94 1. `skeletor.pre.fix_mesh()` to fix the mesh
+ 95 2. `skeletor.pre.simplify()` to simplify the mesh
+ 96 3. `skeletor.pre.contract()` to contract the mesh [1]
+ 97 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton
+ 98 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton
+ 99 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting
+100
+101In my experience there is no one-size-fits-all. You will have to play around to
+102find the right approach and parameters to get nice skeletons for your meshes.
+103If you need help just open an [issue](https://github.com/navis-org/skeletor/issues).
+104
+105Also check out the Gotchas below!
+106
+107# Examples
+108
+109First load the example mesh (a fruit fly neuron):
+110
+111```Python
+112>>> import skeletor as sk
+113>>> mesh = sk.example_mesh()
+114>>> mesh
+115<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>
+116```
+117
+118Next see if there is stuff to fix in the mesh (degenerate faces, duplicate
+119vertices, etc.):
+120
+121```Python
+122>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
+123>>> fixed
+124<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>
+125```
+126
+127Now for tubular meshes like this neuron, the "wave front" skeletonization method
+128performs really well: it works by casting waves across the mesh and collapsing
+129the resulting rings into a skeleton (kinda like when you throw a stone in a
+130pond and track the expanding ripples).
+131
+132```Python
+133>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)
+134>>> skel
+135<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>
+136```
+137
+138All skeletonization methods return a `Skeleton` object. These are just
+139convenient objects to bundle the various outputs of the skeletonization.
+140
+141```Python
+142>>> # x/y/z location of skeleton vertices (nodes)
+143>>> skel.vertices
+144array([[16744, 36720, 26407],
+145       ...,
+146       [22076, 23217, 24472]])
+147>>> # child -> parent edges
+148>>> skel.edges
+149array([[  64,   31],
+150       ...,
+151       [1257, 1252]])
+152>>> # Mapping for mesh to skeleton vertex indices
+153>>> skel.mesh_map
+154array([ 157,  158, 1062, ...,  525,  474,  547])
+155>>> # SWC table
+156>>> skel.swc.head()
+157   node_id  parent_id             x             y             z    radius
+1580        0         -1  16744.005859  36720.058594  26407.902344  0.000000
+1591        1         -1   5602.751953  22266.756510  15799.991211  7.542587
+1602        2         -1  16442.666667  14999.978516  10887.916016  5.333333
+161```
+162
+163SWC is a commonly used format for saving skeletons. `Skeleton` objects
+164have a method for quickly saving a correctly formatted SWC file:
+165
+166```Python
+167>>> skel.save_swc('~/Documents/my_skeleton.swc')
+168```
+169
+170If you installed `pyglet` (see above) you can also use `trimesh`'s plotting
+171capabilities to inspect the results:
+172
+173```Python
+174>>> skel.show(mesh=True)
+175```
+176
+177<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/>
+178
+179That looks pretty good already but let's run some pro-forma postprocessing.
+180
+181```Python
+182>>> sk.post.clean_up(skel, inplace=True)
+183<Skeleton(vertices=(1071, 3), edges=(1070, 2))>
+184```
+185
+186So that would be a full pipeline mesh to skeleton. Don't expect your own meshes
+187to produce such nice results off the bat though. Chances are you will need to
+188play around to find the right recipe. If you don't know where to start, I suggest
+189you try out mesh contraction + vertex clustering first:
+190
+191```Python
+192>>> import skeletor as sk
+193>>> mesh = sk.example_mesh()
+194>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
+195>>> # Contract mesh to 10% (0.1) of original volume
+196>>> cont = sk.pre.contract(fixed, epsilon=0.1)
+197>>> # Skeletonize
+198>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)
+199>>> # Replace contracted mesh with original for postprocessing and plotting
+200>>> skel.mesh = fixed
+201>>> # Add radii (vertex cluster method does not do that automatically)
+202>>> sk.post.radii(skel, method='knn')
+203>>> skel.show(mesh=True)
+204```
+205
+206# Gotchas
+207
+208- while this is a general purpose library, my personal focus is on neurons and
+209  this has certainly influenced things like default parameter values and certain
+210  post-processing steps
+211- meshes need to be triangular (we are using `trimesh`)
+212- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is
+213  where things start getting sluggish)
+214- a good mesh contraction is often half the battle
+215- if the mesh consists of multiple disconnected pieces the skeleton will
+216  likewise be fragmented (i.e. will have multiple roots)
+217
+218# Benchmarks
+219
+220<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/>
+221
+222[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb)
+223were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional
+224`fastremap` dependency installed. Note some of these functions (e.g.
+225contraction and TEASAR/vertex cluster skeletonization) vary a lot in
+226speed based on parameterization.
+227
+228# What about algorithm `X`?
+229
+230`skeletor` contains some algorithms that I found easy enough to implement
+231and useful for my work with neurons. If you have some interesting paper/approach
+232that could make a nice addition to `skeletor`, please get in touch on Github.
+233Pull requests are always welcome!
+234
+235# References
+236
+237`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
+238
+239The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/).
+240Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video.
+241
+242Some of the code in skeletor was modified from the
+243[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization)
+244addon created by #0K Srinivasan Ramachandran and published under GPL3.
+245
+246# Top-level functions and classes
+247At top-level we only expose `example_mesh()` and the `Skeleton` class (which
+248you probably won't ever need to touch manually). Everything else is neatly
+249tucked away into submodules (see side-bar or above table).
+250
+251"""
+252
+253__version__ = "1.2.1"
+254__version_vector__ = (1, 2, 1)
+255
+256from . import skeletonize
+257from . import pre
+258from . import post
+259
+260from .skeletonize.base import Skeleton
+261from .data import example_mesh
+262
+263__docformat__ = "numpy"
+264
+265__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize']
+
-__docformat__ = "numpy" - -__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] -
- -
-
- #   - - - class - Skeleton: -
+ +
+ + class + Skeleton: -
- View Source -
class Skeleton:
-    """Class representing a skeleton.
-
-    Typically returned as results from a skeletonization.
-
-    Attributes
-    ----------
-    swc :       pd.DataFrame, optional
-                SWC table.
-    vertices :  (N, 3) array
-                Vertex (node) positions.
-    edges :     (M, 2) array
-                Indices of connected vertex pairs.
-    radii :     (N, ) array, optional
-                Radii for each vertex (node) in the skeleton.
-    mesh :      trimesh, optional
-                The original mesh.
-    mesh_map :  array, optional
-                Same length as ``mesh``. Maps mesh vertices to vertices (nodes)
-                in the skeleton.
-    skel_map :  array of arrays, optional
-                Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh
-                vertices.
-    method :    str, optional
-                Which method was used to generate the skeleton.
-
-    """
-
-    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
-        self.swc = swc
-        self.mesh = mesh
-        self.mesh_map = mesh_map
-        self.method = method
-
-    def __str__(self):
-        """Summary."""
-        return self.__repr__()
-
-    def __repr__(self):
-        """Return quick summary of the skeleton's geometry."""
-        elements = []
-        if hasattr(self, 'vertices'):
-            elements.append(f'vertices={self.vertices.shape}')
-        if hasattr(self, 'edges'):
-            elements.append(f'edges={self.edges.shape}')
-        if hasattr(self, 'method'):
-            elements.append(f'method={self.method}')
-        return f'<Skeleton({", ".join(elements)})>'
-
-    @property
-    def edges(self):
-        """Return skeleton edges."""
-        return self.swc.loc[self.swc.parent_id >= 0,
-                            ['node_id', 'parent_id']].values
-
-    @property
-    def vertices(self):
-        """Return skeleton vertices (nodes)."""
-        return self.swc[['x', 'y', 'z']].values
-
-    @property
-    def radius(self):
-        """Return radii."""
-        if 'radius' not in self.swc.columns:
-            raise ValueError('No radius info found. Run `skeletor.post.radii()`'
-                             ' to get them.')
-        return self.swc['radius'].values,
-
-    @property
-    def skeleton(self):
-        """Skeleton as trimesh Path3D."""
-        if not hasattr(self, '_skeleton'):
-            lines = [tm.path.entities.Line(e) for e in self.edges]
-
-            self._skeleton = tm.path.Path3D(entities=lines,
-                                            vertices=self.vertices,
-                                            process=False)
-        return self._skeleton
-
-    @property
-    def skel_map(self):
-        """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`."""
-        if isinstance(self.mesh_map, type(None)):
-            return None
-        return pd.DataFrame(self.mesh_map
-                            ).reset_index(drop=False
-                                          ).groupby(0)['index'].apply(np.array
-                                                                      ).values
-
-    def reindex(self, inplace=False):
-        """Clean up skeleton."""
-        x = self
-        if not inplace:
-            x = x.copy()
-
-        # Re-index to make node IDs continous again
-        x.swc, new_ids = reindex_swc(x.swc)
-
-        # Update mesh map
-        if not isinstance(x.mesh_map, type(None)):
-            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
-
-        if not inplace:
-            return x
-
-    def copy(self):
-        """Return copy of the skeleton."""
-        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
-                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
-                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
-
-    def get_graph(self):
-        """Generate networkX representation of the skeletons.
-
-        Distance between nodes will be used as edge weights.
-
-        Returns
-        -------
-        networkx.DiGraph
-
-        """
-        not_root = self.swc.parent_id >= 0
-        nodes = self.swc.loc[not_root]
-        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
-
-        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
-        dists = np.sqrt((dists ** 2).sum(axis=1))
-
-        G = nx.DiGraph()
-        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)])
-
-        return G
-
-    def save_swc(self, filepath):
-        """Save skeleton in SWC format.
-
-        Parameters
-        ----------
-        filepath :      path-like
-                        Filepath to save SWC to.
-
-        """
-        header = dedent(f"""\
-        # SWC format file
-        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
-        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
-        # PointNo Label X Y Z Radius Parent
-        # Labels:
-        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
-        """)
-
-        # Make copy of SWC table
-        swc = self.swc.copy()
-
-        # Set all labels to undefined
-        swc['label'] = 0
-        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
-        n_childs = swc.groupby('parent_id').size()
-        bp = n_childs[n_childs > 1].index.values
-        swc.loc[swc.node_id.isin(bp), 'label'] = 5
-
-        # Add radius if missing
-        if 'radius' not in swc.columns:
-            swc['radius'] = 0
-
-        # Get things in order
-        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
-
-        # Adjust column titles
-        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
-
-        with open(filepath, 'w') as file:
-            # Write header
-            file.write(header)
-
-            # Write data
-            writer = csv.writer(file, delimiter=' ')
-            writer.writerows(swc.astype(str).values)
-
-    def scene(self, mesh=False, **kwargs):
-        """Return a Scene object containing the skeleton.
-
-        Returns
-        -------
-        scene :     trimesh.scene.scene.Scene
-                    Contains the skeleton and optionally the mesh.
+                
 
-        """
-        if mesh:
-            if isinstance(self.mesh, type(None)):
-                raise ValueError('Skeleton has no mesh.')
-
-            self.mesh.visual.face_colors = [100, 100, 100, 100]
-
-            # Note the copy(): without it the transform in show() changes
-            # the original meshes
-            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
-        else:
-            sc = tm.Scene(self.skeleton.copy(), **kwargs)
-
-        return sc
-
-    def show(self, mesh=False, **kwargs):
-        """Render the skeleton in an opengl window. Requires pyglet.
-
-        Parameters
-        ----------
-        mesh :      bool
-                    If True, will render transparent mesh on top of the
-                    skeleton.
-
-        Returns
-        --------
-        scene :     trimesh.scene.Scene
-                    Scene with skeleton in it.
-
-        """
-        scene = self.scene(mesh=mesh)
-
-        # I encountered some issues if object space is big and the easiest
-        # way to work around this is to apply a transform such that the
-        # coordinates have -5 to +5 bounds
-        fac = 5 / np.fabs(self.skeleton.bounds).max()
-        scene.apply_transform(np.diag([fac, fac, fac, 1]))
-
-        return scene.show(**kwargs)
-
+
+ +
 33class Skeleton:
+ 34    """Class representing a skeleton.
+ 35
+ 36    Typically returned as results from a skeletonization.
+ 37
+ 38    Attributes
+ 39    ----------
+ 40    swc :       pd.DataFrame, optional
+ 41                SWC table.
+ 42    vertices :  (N, 3) array
+ 43                Vertex (node) positions.
+ 44    edges :     (M, 2) array
+ 45                Indices of connected vertex pairs.
+ 46    radii :     (N, ) array, optional
+ 47                Radii for each vertex (node) in the skeleton.
+ 48    mesh :      trimesh, optional
+ 49                The original mesh.
+ 50    mesh_map :  array, optional
+ 51                Same length as ``mesh``. Maps mesh vertices to vertices (nodes)
+ 52                in the skeleton.
+ 53    skel_map :  array of arrays, optional
+ 54                Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh
+ 55                vertices.
+ 56    method :    str, optional
+ 57                Which method was used to generate the skeleton.
+ 58
+ 59    """
+ 60
+ 61    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
+ 62        self.swc = swc
+ 63        self.mesh = mesh
+ 64        self.mesh_map = mesh_map
+ 65        self.method = method
+ 66
+ 67    def __str__(self):
+ 68        """Summary."""
+ 69        return self.__repr__()
+ 70
+ 71    def __repr__(self):
+ 72        """Return quick summary of the skeleton's geometry."""
+ 73        elements = []
+ 74        if hasattr(self, 'vertices'):
+ 75            elements.append(f'vertices={self.vertices.shape}')
+ 76        if hasattr(self, 'edges'):
+ 77            elements.append(f'edges={self.edges.shape}')
+ 78        if hasattr(self, 'method'):
+ 79            elements.append(f'method={self.method}')
+ 80        return f'<Skeleton({", ".join(elements)})>'
+ 81
+ 82    @property
+ 83    def edges(self):
+ 84        """Return skeleton edges."""
+ 85        return self.swc.loc[self.swc.parent_id >= 0,
+ 86                            ['node_id', 'parent_id']].values
+ 87
+ 88    @property
+ 89    def vertices(self):
+ 90        """Return skeleton vertices (nodes)."""
+ 91        return self.swc[['x', 'y', 'z']].values
+ 92
+ 93    @property
+ 94    def radius(self):
+ 95        """Return radii."""
+ 96        if 'radius' not in self.swc.columns:
+ 97            raise ValueError('No radius info found. Run `skeletor.post.radii()`'
+ 98                             ' to get them.')
+ 99        return self.swc['radius'].values,
+100
+101    @property
+102    def skeleton(self):
+103        """Skeleton as trimesh Path3D."""
+104        if not hasattr(self, '_skeleton'):
+105            lines = [tm.path.entities.Line(e) for e in self.edges]
+106
+107            self._skeleton = tm.path.Path3D(entities=lines,
+108                                            vertices=self.vertices,
+109                                            process=False)
+110        return self._skeleton
+111
+112    @property
+113    def skel_map(self):
+114        """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`."""
+115        if isinstance(self.mesh_map, type(None)):
+116            return None
+117        return pd.DataFrame(self.mesh_map
+118                            ).reset_index(drop=False
+119                                          ).groupby(0)['index'].apply(np.array
+120                                                                      ).values
+121
+122    @property
+123    def leafs(self):
+124        """Leaf nodes (includes root)."""
+125        swc = self.swc
+126        leafs = swc[~swc.node_id.isin(swc.parent_id.values) | (swc.parent_id < 0)]
+127        return leafs.copy()
+128
+129    def reindex(self, inplace=False):
+130        """Clean up skeleton."""
+131        x = self
+132        if not inplace:
+133            x = x.copy()
+134
+135        # Re-index to make node IDs continous again
+136        x.swc, new_ids = reindex_swc(x.swc)
+137
+138        # Update mesh map
+139        if not isinstance(x.mesh_map, type(None)):
+140            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
+141
+142        if not inplace:
+143            return x
+144
+145    def copy(self):
+146        """Return copy of the skeleton."""
+147        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
+148                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
+149                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
+150
+151    def get_graph(self):
+152        """Generate networkX representation of the skeletons.
+153
+154        Distance between nodes will be used as edge weights.
+155
+156        Returns
+157        -------
+158        networkx.DiGraph
+159
+160        """
+161        not_root = self.swc.parent_id >= 0
+162        nodes = self.swc.loc[not_root]
+163        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+164
+165        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
+166        dists = np.sqrt((dists ** 2).sum(axis=1))
+167
+168        G = nx.DiGraph()
+169        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values,
+170                                                                nodes.parent_id.values, dists)])
+171
+172        return G
+173
+174    def save_swc(self, filepath):
+175        """Save skeleton in SWC format.
+176
+177        Parameters
+178        ----------
+179        filepath :      path-like
+180                        Filepath to save SWC to.
+181
+182        """
+183        header = dedent(f"""\
+184        # SWC format file
+185        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
+186        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
+187        # PointNo Label X Y Z Radius Parent
+188        # Labels:
+189        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
+190        """)
+191
+192        # Make copy of SWC table
+193        swc = self.swc.copy()
+194
+195        # Set all labels to undefined
+196        swc['label'] = 0
+197        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
+198        n_childs = swc.groupby('parent_id').size()
+199        bp = n_childs[n_childs > 1].index.values
+200        swc.loc[swc.node_id.isin(bp), 'label'] = 5
+201
+202        # Add radius if missing
+203        if 'radius' not in swc.columns:
+204            swc['radius'] = 0
+205
+206        # Get things in order
+207        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
+208
+209        # Adjust column titles
+210        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
+211
+212        with open(filepath, 'w') as file:
+213            # Write header
+214            file.write(header)
+215
+216            # Write data
+217            writer = csv.writer(file, delimiter=' ')
+218            writer.writerows(swc.astype(str).values)
+219
+220    def scene(self, mesh=False, **kwargs):
+221        """Return a Scene object containing the skeleton.
+222
+223        Returns
+224        -------
+225        scene :     trimesh.scene.scene.Scene
+226                    Contains the skeleton and optionally the mesh.
+227
+228        """
+229        if mesh:
+230            if isinstance(self.mesh, type(None)):
+231                raise ValueError('Skeleton has no mesh.')
+232
+233            self.mesh.visual.face_colors = [100, 100, 100, 100]
+234
+235            # Note the copy(): without it the transform in show() changes
+236            # the original meshes
+237            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
+238        else:
+239            sc = tm.Scene(self.skeleton.copy(), **kwargs)
+240
+241        return sc
+242
+243    def show(self, mesh=False, **kwargs):
+244        """Render the skeleton in an opengl window. Requires pyglet.
+245
+246        Parameters
+247        ----------
+248        mesh :      bool
+249                    If True, will render transparent mesh on top of the
+250                    skeleton.
+251
+252        Returns
+253        --------
+254        scene :     trimesh.scene.Scene
+255                    Scene with skeleton in it.
+256
+257        """
+258        scene = self.scene(mesh=mesh)
+259
+260        # I encountered some issues if object space is big and the easiest
+261        # way to work around this is to apply a transform such that the
+262        # coordinates have -5 to +5 bounds
+263        fac = 5 / np.fabs(self.skeleton.bounds).max()
+264        scene.apply_transform(np.diag([fac, fac, fac, 1]))
+265
+266        return scene.show(**kwargs)
+
-

Class representing a skeleton.

@@ -941,32 +952,33 @@
Attributes
-
#   + +
+ + Skeleton(swc, mesh=None, mesh_map=None, method=None) - - Skeleton(swc, mesh=None, mesh_map=None, method=None) -
+ -
- View Source -
    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
-        self.swc = swc
-        self.mesh = mesh
-        self.mesh_map = mesh_map
-        self.method = method
-
+
+ +
61    def __init__(self, swc, mesh=None, mesh_map=None, method=None):
+62        self.swc = swc
+63        self.mesh = mesh
+64        self.mesh_map = mesh_map
+65        self.method = method
+
-
-
#   +
+ edges - edges +
- +

Return skeleton edges.

@@ -974,11 +986,12 @@
Attributes
-
#   +
+ vertices - vertices +
- +

Return skeleton vertices (nodes).

@@ -986,11 +999,12 @@
Attributes
-
#   +
+ radius - radius +
- +

Return radii.

@@ -998,11 +1012,12 @@
Attributes
-
#   +
+ skeleton - skeleton +
- +

Skeleton as trimesh Path3D.

@@ -1010,45 +1025,59 @@
Attributes
-
#   +
+ skel_map - skel_map +
- +

Skeleton vertex (nodes) to mesh vertices. Based on mesh_map.

-
-
#   +
+
+ leafs - def - reindex(self, inplace=False):
+ + +

Leaf nodes (includes root).

+
-
- View Source -
    def reindex(self, inplace=False):
-        """Clean up skeleton."""
-        x = self
-        if not inplace:
-            x = x.copy()
 
-        # Re-index to make node IDs continous again
-        x.swc, new_ids = reindex_swc(x.swc)
+                            
+
+ +
+ + def + reindex(self, inplace=False) - # Update mesh map - if not isinstance(x.mesh_map, type(None)): - x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) + - if not inplace: - return x -
+
+ +
129    def reindex(self, inplace=False):
+130        """Clean up skeleton."""
+131        x = self
+132        if not inplace:
+133            x = x.copy()
+134
+135        # Re-index to make node IDs continous again
+136        x.swc, new_ids = reindex_swc(x.swc)
+137
+138        # Update mesh map
+139        if not isinstance(x.mesh_map, type(None)):
+140            x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map])
+141
+142        if not inplace:
+143            return x
+
-

Clean up skeleton.

@@ -1056,23 +1085,23 @@
Attributes
-
#   + +
+ + def + copy(self) - - def - copy(self): -
+ -
- View Source -
    def copy(self):
-        """Return copy of the skeleton."""
-        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
-                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
-                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
-
+
+ +
145    def copy(self):
+146        """Return copy of the skeleton."""
+147        return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None,
+148                        mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None,
+149                        mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None)
+
-

Return copy of the skeleton.

@@ -1080,39 +1109,40 @@
Attributes
-
#   - - - def - get_graph(self): -
- -
- View Source -
    def get_graph(self):
-        """Generate networkX representation of the skeletons.
-
-        Distance between nodes will be used as edge weights.
-
-        Returns
-        -------
-        networkx.DiGraph
-
-        """
-        not_root = self.swc.parent_id >= 0
-        nodes = self.swc.loc[not_root]
-        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+                                        
+
+ + def + get_graph(self) - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) + - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G -
+
+ +
151    def get_graph(self):
+152        """Generate networkX representation of the skeletons.
+153
+154        Distance between nodes will be used as edge weights.
+155
+156        Returns
+157        -------
+158        networkx.DiGraph
+159
+160        """
+161        not_root = self.swc.parent_id >= 0
+162        nodes = self.swc.loc[not_root]
+163        parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values]
+164
+165        dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values
+166        dists = np.sqrt((dists ** 2).sum(axis=1))
+167
+168        G = nx.DiGraph()
+169        G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values,
+170                                                                nodes.parent_id.values, dists)])
+171
+172        return G
+
-

Generate networkX representation of the skeletons.

@@ -1128,63 +1158,63 @@
Returns
-
#   + +
+ + def + save_swc(self, filepath) + + - - def - save_swc(self, filepath):
+ +
174    def save_swc(self, filepath):
+175        """Save skeleton in SWC format.
+176
+177        Parameters
+178        ----------
+179        filepath :      path-like
+180                        Filepath to save SWC to.
+181
+182        """
+183        header = dedent(f"""\
+184        # SWC format file
+185        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
+186        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
+187        # PointNo Label X Y Z Radius Parent
+188        # Labels:
+189        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
+190        """)
+191
+192        # Make copy of SWC table
+193        swc = self.swc.copy()
+194
+195        # Set all labels to undefined
+196        swc['label'] = 0
+197        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
+198        n_childs = swc.groupby('parent_id').size()
+199        bp = n_childs[n_childs > 1].index.values
+200        swc.loc[swc.node_id.isin(bp), 'label'] = 5
+201
+202        # Add radius if missing
+203        if 'radius' not in swc.columns:
+204            swc['radius'] = 0
+205
+206        # Get things in order
+207        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
+208
+209        # Adjust column titles
+210        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
+211
+212        with open(filepath, 'w') as file:
+213            # Write header
+214            file.write(header)
+215
+216            # Write data
+217            writer = csv.writer(file, delimiter=' ')
+218            writer.writerows(swc.astype(str).values)
+
-
- View Source -
    def save_swc(self, filepath):
-        """Save skeleton in SWC format.
-
-        Parameters
-        ----------
-        filepath :      path-like
-                        Filepath to save SWC to.
-
-        """
-        header = dedent(f"""\
-        # SWC format file
-        # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
-        # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor)
-        # PointNo Label X Y Z Radius Parent
-        # Labels:
-        # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point
-        """)
-
-        # Make copy of SWC table
-        swc = self.swc.copy()
-
-        # Set all labels to undefined
-        swc['label'] = 0
-        swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6
-        n_childs = swc.groupby('parent_id').size()
-        bp = n_childs[n_childs > 1].index.values
-        swc.loc[swc.node_id.isin(bp), 'label'] = 5
-
-        # Add radius if missing
-        if 'radius' not in swc.columns:
-            swc['radius'] = 0
-
-        # Get things in order
-        swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']]
-
-        # Adjust column titles
-        swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent']
-
-        with open(filepath, 'w') as file:
-            # Write header
-            file.write(header)
-
-            # Write data
-            writer = csv.writer(file, delimiter=' ')
-            writer.writerows(swc.astype(str).values)
-
- -

Save skeleton in SWC format.

@@ -1199,40 +1229,40 @@
Parameters
-
#   - - - def - scene(self, mesh=False, **kwargs): -
- -
- View Source -
    def scene(self, mesh=False, **kwargs):
-        """Return a Scene object containing the skeleton.
-
-        Returns
-        -------
-        scene :     trimesh.scene.scene.Scene
-                    Contains the skeleton and optionally the mesh.
+                                        
+
+ + def + scene(self, mesh=False, **kwargs) - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') + - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc -
+
+ +
220    def scene(self, mesh=False, **kwargs):
+221        """Return a Scene object containing the skeleton.
+222
+223        Returns
+224        -------
+225        scene :     trimesh.scene.scene.Scene
+226                    Contains the skeleton and optionally the mesh.
+227
+228        """
+229        if mesh:
+230            if isinstance(self.mesh, type(None)):
+231                raise ValueError('Skeleton has no mesh.')
+232
+233            self.mesh.visual.face_colors = [100, 100, 100, 100]
+234
+235            # Note the copy(): without it the transform in show() changes
+236            # the original meshes
+237            sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs)
+238        else:
+239            sc = tm.Scene(self.skeleton.copy(), **kwargs)
+240
+241        return sc
+
-

Return a Scene object containing the skeleton.

@@ -1247,42 +1277,42 @@
Returns
-
#   - - - def - show(self, mesh=False, **kwargs): -
- -
- View Source -
    def show(self, mesh=False, **kwargs):
-        """Render the skeleton in an opengl window. Requires pyglet.
-
-        Parameters
-        ----------
-        mesh :      bool
-                    If True, will render transparent mesh on top of the
-                    skeleton.
-
-        Returns
-        --------
-        scene :     trimesh.scene.Scene
-                    Scene with skeleton in it.
-
-        """
-        scene = self.scene(mesh=mesh)
+                                        
+
+ + def + show(self, mesh=False, **kwargs) - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) + - return scene.show(**kwargs) -
+
+ +
243    def show(self, mesh=False, **kwargs):
+244        """Render the skeleton in an opengl window. Requires pyglet.
+245
+246        Parameters
+247        ----------
+248        mesh :      bool
+249                    If True, will render transparent mesh on top of the
+250                    skeleton.
+251
+252        Returns
+253        --------
+254        scene :     trimesh.scene.Scene
+255                    Scene with skeleton in it.
+256
+257        """
+258        scene = self.scene(mesh=mesh)
+259
+260        # I encountered some issues if object space is big and the easiest
+261        # way to work around this is to apply a transform such that the
+262        # coordinates have -5 to +5 bounds
+263        fac = 5 / np.fabs(self.skeleton.bounds).max()
+264        scene.apply_transform(np.diag([fac, fac, fac, 1]))
+265
+266        return scene.show(**kwargs)
+
-

Render the skeleton in an opengl window. Requires pyglet.

@@ -1306,42 +1336,42 @@
Returns
-
#   - - - def - example_mesh(): -
- -
- View Source -
def example_mesh():
-    """Load and return example mesh.
+                            
+
+ + def + example_mesh() - The example mesh is a fruit fly neuron (an olfactory projection neuron of - the DA1 glomerulus) segmented from an EM image data set. It is part of the - Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. + - References - ---------- - [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 - A connectome and analysis of the adult Drosophila central brain - - Returns - ------- - trimesh.Trimesh - - Examples - -------- - >>> import skeletor as sk - >>> # Load this example mesh - >>> mesh = sk.example_mesh() - - """ - return tm.load_mesh(obj_path) -
+ + +
43def example_mesh():
+44    """Load and return example mesh.
+45
+46    The example mesh is a fruit fly neuron (an olfactory projection neuron of
+47    the DA1 glomerulus) segmented from an EM image data set. It is part of the
+48    Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1].
+49
+50    References
+51    ----------
+52    [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443
+53    A connectome and analysis of the adult Drosophila central brain
+54
+55    Returns
+56    -------
+57    trimesh.Trimesh
+58
+59    Examples
+60    --------
+61    >>> import skeletor as sk
+62    >>> # Load this example mesh
+63    >>> mesh = sk.example_mesh()
+64
+65    """
+66    return tm.load_mesh(obj_path)
+
-

Load and return example mesh.

diff --git a/docs/skeletor/post.html b/docs/skeletor/post.html index 2a9d80f..4c606c6 100644 --- a/docs/skeletor/post.html +++ b/docs/skeletor/post.html @@ -3,14 +3,14 @@ - + skeletor.post API documentation - - + +
-
+

skeletor.post

@@ -75,158 +75,152 @@

Computing radius information

(re-)generate radius information for the skeletons.

-
- View Source -
#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
-#    Copyright (C) 2018 Philipp Schlegel
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program.
+                        
+
+                        
+
+                        
 1#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
+ 2#    Copyright (C) 2018 Philipp Schlegel
+ 3#
+ 4#    This program is free software: you can redistribute it and/or modify
+ 5#    it under the terms of the GNU General Public License as published by
+ 6#    the Free Software Foundation, either version 3 of the License, or
+ 7#    (at your option) any later version.
+ 8#
+ 9#    This program is distributed in the hope that it will be useful,
+10#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+11#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+12#    GNU General Public License for more details.
+13#
+14#    You should have received a copy of the GNU General Public License
+15#    along with this program.
+16
+17r"""
+18The `skeletor.post` module contains functions to post-process skeletons after
+19skeletonization.
+20
+21### Fixing issues with skeletons
+22
+23Depending on your mesh, pre-processing and the parameters you chose for
+24skeletonization, chances are that your skeleton will not come out perfectly.
+25
+26`skeletor.post.clean_up` can help you solve some potential issues:
+27
+28- skeleton nodes (vertices) that outside or right on the surface instead of
+29  centered inside the mesh
+30- superfluous "hairs" on otherwise straight bits
+31
+32### Computing radius information
+33
+34Only `skeletor.skeletonize.by_wavefront()` provides radii off the bat. For all
+35other methods, you might want to run `skeletor.post.radii` can help you
+36(re-)generate radius information for the skeletons.
+37
+38"""
+39
+40from .radiusextraction import radii
+41from .postprocessing import clean_up
+42
+43__docformat__ = "numpy"
+44__all__ = ['radii', 'clean_up']
+
-r""" -The `skeletor.post` module contains functions to post-process skeletons after -skeletonization. - -### Fixing issues with skeletons - -Depending on your mesh, pre-processing and the parameters you chose for -skeletonization, chances are that your skeleton will not come out perfectly. - -`skeletor.post.clean_up` can help you solve some potential issues: - -- skeleton nodes (vertices) that outside or right on the surface instead of - centered inside the mesh -- superfluous "hairs" on otherwise straight bits - -### Computing radius information - -Only `skeletor.skeletonize.by_wavefront()` provides radii off the bat. For all -other methods, you might want to run `skeletor.post.radii` can help you -(re-)generate radius information for the skeletons. - -""" - -from .radiusextraction import radii -from .postprocessing import clean_up - -__docformat__ = "numpy" -__all__ = ['radii', 'clean_up'] -
- -
-
#   - - - def - radii( - s, - mesh=None, - method='knn', - aggregate='mean', - validate=False, - **kwargs -): + +
+ + def + radii( s, mesh=None, method='knn', aggregate='mean', validate=False, **kwargs) + + +
+ +
 29def radii(s, mesh=None, method='knn', aggregate='mean', validate=False, **kwargs):
+ 30    """Extract radii for given skeleton table.
+ 31
+ 32    Important
+ 33    ---------
+ 34    This function really only produces useful radii if the skeleton is centered
+ 35    inside the mesh. `by_wavefront` does that by default whereas all other
+ 36    skeletonization methods don't. Your best bet to get centered skeletons is
+ 37    to contract the mesh first (`sk.pre.contract`).
+ 38
+ 39    Parameters
+ 40    ----------
+ 41    s :         skeletor.Skeleton
+ 42                Skeleton to clean up.
+ 43    mesh :      trimesh.Trimesh, optional
+ 44                Original mesh (e.g. before contraction). If not provided will
+ 45                use the mesh associated with ``s``.
+ 46    method :    "knn" | "ray"
+ 47                Whether and how to add radius information to each node::
+ 48
+ 49                    - "knn" uses k-nearest-neighbors to get radii: fast but
+ 50                      potential for being very wrong
+ 51                    - "ray" uses ray-casting to get radii: slower but sometimes
+ 52                      less wrong
+ 53
+ 54    aggregate : "mean" | "median" | "max" | "min" | "percentile75"
+ 55                Function used to aggregate radii over sample (i.e. across
+ 56                k nearest-neighbors or ray intersections)
+ 57    validate :  bool
+ 58                If True, will try to fix potential issues with the mesh
+ 59                (e.g. infinite values, duplicate vertices, degenerate faces)
+ 60                before skeletonization. Note that this might make changes to
+ 61                your mesh inplace!
+ 62    **kwargs
+ 63                Keyword arguments are passed to the respective method:
+ 64
+ 65                For method "knn"::
+ 66
+ 67                    n :             int (default 5)
+ 68                                    Radius will be the mean over n nearest-neighbors.
+ 69
+ 70                For method "ray"::
+ 71
+ 72                    n_rays :        int (default 20)
+ 73                                    Number of rays to cast for each node.
+ 74                    projection :    "sphere" (default) | "tangents"
+ 75                                    Whether to cast rays in a sphere around each node or in a
+ 76                                    circle orthogonally to the node's tangent vector.
+ 77                    fallback :      "knn" (default) | None | number
+ 78                                    If a point is outside or right on the surface of the mesh
+ 79                                    the raycasting will return nonesense results. We can either
+ 80                                    ignore those cases (``None``), assign a arbitrary number or
+ 81                                    we can fall back to radii from k-nearest-neighbors (``knn``).
+ 82
+ 83    Returns
+ 84    -------
+ 85    None
+ 86                    But attaches `radius` to the skeleton's SWC table. Existing
+ 87                    values are replaced!
+ 88
+ 89    """
+ 90    if isinstance(mesh, type(None)):
+ 91        mesh = s.mesh
+ 92
+ 93    mesh = make_trimesh(mesh, validate=True)
+ 94
+ 95    if method == 'knn':
+ 96        radius = get_radius_knn(s.swc[['x', 'y', 'z']].values,
+ 97                                aggregate=aggregate,
+ 98                                mesh=mesh, **kwargs)
+ 99    elif method == 'ray':
+100        radius = get_radius_ray(s.swc,
+101                                mesh=mesh,
+102                                aggregate=aggregate,
+103                                **kwargs)
+104    else:
+105        raise ValueError(f'Unknown method "{method}"')
+106
+107    s.swc['radius'] = radius
+108
+109    return
+
-
- View Source -
def radii(s, mesh=None, method='knn', aggregate='mean', validate=False, **kwargs):
-    """Extract radii for given skeleton table.
-
-    Important
-    ---------
-    This function really only produces useful radii if the skeleton is centered
-    inside the mesh. `by_wavefront` does that by default whereas all other
-    skeletonization methods don't. Your best bet to get centered skeletons is
-    to contract the mesh first (`sk.pre.contract`).
-
-    Parameters
-    ----------
-    s :         skeletor.Skeleton
-                Skeleton to clean up.
-    mesh :      trimesh.Trimesh, optional
-                Original mesh (e.g. before contraction). If not provided will
-                use the mesh associated with ``s``.
-    method :    "knn" | "ray"
-                Whether and how to add radius information to each node::
-
-                    - "knn" uses k-nearest-neighbors to get radii: fast but
-                      potential for being very wrong
-                    - "ray" uses ray-casting to get radii: slower but sometimes
-                      less wrong
-
-    aggregate : "mean" | "median" | "max" | "min" | "percentile75"
-                Function used to aggregate radii over sample (i.e. across
-                k nearest-neighbors or ray intersections)
-    validate :  bool
-                If True, will try to fix potential issues with the mesh
-                (e.g. infinite values, duplicate vertices, degenerate faces)
-                before skeletonization. Note that this might make changes to
-                your mesh inplace!
-    **kwargs
-                Keyword arguments are passed to the respective method:
-
-                For method "knn"::
-
-                    n :             int (default 5)
-                                    Radius will be the mean over n nearest-neighbors.
-
-                For method "ray"::
-
-                    n_rays :        int (default 20)
-                                    Number of rays to cast for each node.
-                    projection :    "sphere" (default) | "tangents"
-                                    Whether to cast rays in a sphere around each node or in a
-                                    circle orthogonally to the node's tangent vector.
-                    fallback :      "knn" (default) | None | number
-                                    If a point is outside or right on the surface of the mesh
-                                    the raycasting will return nonesense results. We can either
-                                    ignore those cases (``None``), assign a arbitrary number or
-                                    we can fall back to radii from k-nearest-neighbors (``knn``).
-
-    Returns
-    -------
-    None
-                    But attaches `radius` to the skeleton's SWC table. Existing
-                    values are replaced!
-
-    """
-    if isinstance(mesh, type(None)):
-        mesh = s.mesh
-
-    mesh = make_trimesh(mesh, validate=True)
-
-    if method == 'knn':
-        radius = get_radius_knn(s.swc[['x', 'y', 'z']].values,
-                                aggregate=aggregate,
-                                mesh=mesh, **kwargs)
-    elif method == 'ray':
-        radius = get_radius_ray(s.swc,
-                                mesh=mesh,
-                                aggregate=aggregate,
-                                **kwargs)
-    else:
-        raise ValueError(f'Unknown method "{method}"')
-
-    s.swc['radius'] = radius
-
-    return
-
- -

Extract radii for given skeleton table.

@@ -296,79 +290,79 @@
Returns
-
#   - - - def - clean_up(s, mesh=None, validate=False, inplace=False, **kwargs): -
+ +
+ + def + clean_up(s, mesh=None, validate=False, inplace=False, **kwargs) -
- View Source -
def clean_up(s, mesh=None, validate=False, inplace=False, **kwargs):
-    """Clean up the skeleton.
+                
 
-    This function bundles a bunch of procedures to clean up the skeleton:
-
-      1. Remove twigs that are running parallel to their parent branch
-      2. Move nodes outside the mesh back inside (or at least snap to surface)
-
-    Note that this is not a magic bullet and some of this will not work (well)
-    if the original mesh was degenerate (e.g. internal faces or not watertight)
-    to begin with.
-
-    Parameters
-    ----------
-    s :         skeletor.Skeleton
-                Skeleton to clean up.
-    mesh :      trimesh.Trimesh, optional
-                Original mesh (e.g. before contraction). If not provided will
-                use the mesh associated with ``s``.
-    validate :  bool
-                If True, will try to fix potential issues with the mesh
-                (e.g. infinite values, duplicate vertices, degenerate faces)
-                before cleaning up. Note that this might change your mesh
-                inplace!
-    inplace :   bool
-                If False will make and return a copy of the skeleton. If True,
-                will modify the `s` inplace.
-
-    **kwargs
-                Keyword arguments are passed to the bundled function.
-
-                For `skeletor.postprocessing.drop_parallel_twigs`::
-
-                 theta :     float (default 0.01)
-                             For each twig we generate the dotproduct between the tangent
-                             vectors of it and its parents. If these line up perfectly the
-                             dotproduct will equal 1. ``theta`` determines how much that
-                             value can differ from 1 for us to still prune the twig: higher
-                             theta = more pruning.
-
-    Returns
-    -------
-    s_clean :   skeletor.Skeleton
-                Hopefully improved skeleton.
-
-    """
-    if isinstance(mesh, type(None)):
-        mesh = s.mesh
-
-    mesh = make_trimesh(mesh, validate=validate)
-
-    if not inplace:
-        s = s.copy()
-
-    # Drop parallel twigs
-    _ = drop_parallel_twigs(s, theta=kwargs.get('theta', 0.01), inplace=True)
-
-    # Recenter vertices
-    _ = recenter_vertices(s, mesh, inplace=True)
-
-    return s
-
+
+ +
29def clean_up(s, mesh=None, validate=False, inplace=False, **kwargs):
+30    """Clean up the skeleton.
+31
+32    This function bundles a bunch of procedures to clean up the skeleton:
+33
+34      1. Remove twigs that are running parallel to their parent branch
+35      2. Move nodes outside the mesh back inside (or at least snap to surface)
+36
+37    Note that this is not a magic bullet and some of this will not work (well)
+38    if the original mesh was degenerate (e.g. internal faces or not watertight)
+39    to begin with.
+40
+41    Parameters
+42    ----------
+43    s :         skeletor.Skeleton
+44                Skeleton to clean up.
+45    mesh :      trimesh.Trimesh, optional
+46                Original mesh (e.g. before contraction). If not provided will
+47                use the mesh associated with ``s``.
+48    validate :  bool
+49                If True, will try to fix potential issues with the mesh
+50                (e.g. infinite values, duplicate vertices, degenerate faces)
+51                before cleaning up. Note that this might change your mesh
+52                inplace!
+53    inplace :   bool
+54                If False will make and return a copy of the skeleton. If True,
+55                will modify the `s` inplace.
+56
+57    **kwargs
+58                Keyword arguments are passed to the bundled function.
+59
+60                For `skeletor.postprocessing.drop_parallel_twigs`::
+61
+62                 theta :     float (default 0.01)
+63                             For each twig we generate the dotproduct between the tangent
+64                             vectors of it and its parents. If these line up perfectly the
+65                             dotproduct will equal 1. ``theta`` determines how much that
+66                             value can differ from 1 for us to still prune the twig: higher
+67                             theta = more pruning.
+68
+69    Returns
+70    -------
+71    s_clean :   skeletor.Skeleton
+72                Hopefully improved skeleton.
+73
+74    """
+75    if isinstance(mesh, type(None)):
+76        mesh = s.mesh
+77
+78    mesh = make_trimesh(mesh, validate=validate)
+79
+80    if not inplace:
+81        s = s.copy()
+82
+83    # Drop parallel twigs
+84    _ = drop_parallel_twigs(s, theta=kwargs.get('theta', 0.01), inplace=True)
+85
+86    # Recenter vertices
+87    _ = recenter_vertices(s, mesh, inplace=True)
+88
+89    return s
+
-

Clean up the skeleton.

diff --git a/docs/skeletor/pre.html b/docs/skeletor/pre.html index 9fcfc9b..e9042f5 100644 --- a/docs/skeletor/pre.html +++ b/docs/skeletor/pre.html @@ -3,14 +3,14 @@ - + skeletor.pre API documentation - - + +
-
+

skeletor.pre

@@ -79,152 +79,143 @@
References
contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

-
- View Source -
#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
-#    Copyright (C) 2018 Philipp Schlegel
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program.
+                        
+
+                        
+
+                        
 1#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
+ 2#    Copyright (C) 2018 Philipp Schlegel
+ 3#
+ 4#    This program is free software: you can redistribute it and/or modify
+ 5#    it under the terms of the GNU General Public License as published by
+ 6#    the Free Software Foundation, either version 3 of the License, or
+ 7#    (at your option) any later version.
+ 8#
+ 9#    This program is distributed in the hope that it will be useful,
+10#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+11#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+12#    GNU General Public License for more details.
+13#
+14#    You should have received a copy of the GNU General Public License
+15#    along with this program.
+16
+17"""
+18The `skeletor.pre` module contains functions to pre-process meshes before
+19skeletonization.
+20
+21#### Fixing faulty meshes
+22
+23Some skeletonization methods are susceptible to faulty meshes (degenerate faces,
+24wrong normals, etc.). If your skeleton looks off, it might be worth a shot
+25trying to fix the mesh using `skeletor.pre.fix_mesh()`.
+26
+27#### Mesh contraction
+28
+29As a rule of thumb: the more your mesh looks like a skeleton, the easier it is
+30to extract one (duh). Mesh contraction using `skeletor.pre.contract()` [1] can
+31help you to get your mesh "in shape".
+32
+33References
+34----------
+35[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh
+36    contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
+37
+38"""
+39
+40from .meshcontraction import contract
+41from .preprocessing import fix_mesh, simplify, remesh
+42
+43__docformat__ = "numpy"
+44__all__ = ['fix_mesh', 'simplify', 'remesh', 'contract']
+
-""" -The `skeletor.pre` module contains functions to pre-process meshes before -skeletonization. - -#### Fixing faulty meshes - -Some skeletonization methods are susceptible to faulty meshes (degenerate faces, -wrong normals, etc.). If your skeleton looks off, it might be worth a shot -trying to fix the mesh using `skeletor.pre.fix_mesh()`. - -#### Mesh contraction - -As a rule of thumb: the more your mesh looks like a skeleton, the easier it is -to extract one (duh). Mesh contraction using `skeletor.pre.contract()` [1] can -help you to get your mesh "in shape". - -References ----------- -[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh - contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44. - -""" - -from .meshcontraction import contract -from .preprocessing import fix_mesh, simplify, remesh - -__docformat__ = "numpy" -__all__ = ['fix_mesh', 'simplify', 'remesh', 'contract'] -
- -
-
#   - - - def - fix_mesh( - mesh, - remote_infinite=True, - merge_duplicate_verts=True, - remove_degenerate_faces=True, - remove_unreferenced_verts=True, - drop_winglets=True, - fix_normals=False, - remove_disconnected=False, - inplace=False -): + +
+ + def + fix_mesh( mesh, remote_infinite=True, merge_duplicate_verts=True, remove_degenerate_faces=True, remove_unreferenced_verts=True, drop_winglets=True, fix_normals=False, remove_disconnected=False, inplace=False) + + +
+ +
 37def fix_mesh(mesh, remote_infinite=True, merge_duplicate_verts=True,
+ 38             remove_degenerate_faces=True, remove_unreferenced_verts=True,
+ 39             drop_winglets=True, fix_normals=False, remove_disconnected=False,
+ 40             inplace=False):
+ 41    """Try to fix some common problems with mesh.
+ 42
+ 43     1. Remove infinite values
+ 44     2. Merge duplicate vertices
+ 45     3. Remove duplicate and degenerate faces
+ 46     4. Remove unreference vertices
+ 47     5. Drop winglets (faces that have only one adjacent face)
+ 48     5. Fix normals (Optional)
+ 49     6. Remove disconnected fragments (Optional)
+ 50
+ 51    Parameters
+ 52    ----------
+ 53    mesh :                  mesh-like object
+ 54                            Mesh to fix. Must have `.vertices` and `.faces`
+ 55                            properties.
+ 56    remove_disconnected :   False | int
+ 57                            If a number is given, will iterate over the mesh's
+ 58                            connected components and remove those consisting of
+ 59                            less than the given number of vertices. For example,
+ 60                            ``remove_disconnected=5`` will drop parts of the
+ 61                            mesh that consist of five or less connected
+ 62                            vertices.
+ 63    inplace :               bool
+ 64                            If True, will perform fixes on the input mesh.
+ 65                            If False, will make a copy first. This is silently
+ 66                            ignored if `mesh` is not already a trimesh.
+ 67
+ 68    Returns
+ 69    -------
+ 70    fixed mesh :        trimesh.Trimesh
+ 71
+ 72    """
+ 73    if not isinstance(mesh, tm.Trimesh):
+ 74        mesh = make_trimesh(mesh, validate=False)
+ 75    elif not inplace:
+ 76        mesh = mesh.copy()
+ 77
+ 78    if remove_disconnected:
+ 79        to_drop = []
+ 80        for c in nx.connected_components(mesh.vertex_adjacency_graph):
+ 81            if len(c) <= remove_disconnected:
+ 82                to_drop += list(c)
+ 83
+ 84        # Remove dropped vertices
+ 85        remove = np.isin(np.arange(mesh.vertices.shape[0]), to_drop)
+ 86        mesh.update_vertices(~remove)
+ 87
+ 88    if remote_infinite:
+ 89        mesh.remove_infinite_values()
+ 90
+ 91    if merge_duplicate_verts:
+ 92        mesh.merge_vertices()
+ 93
+ 94    if remove_degenerate_faces:
+ 95        mesh.remove_duplicate_faces()
+ 96        mesh.remove_degenerate_faces()
+ 97
+ 98    if remove_unreferenced_verts:
+ 99        mesh.remove_unreferenced_vertices()
+100
+101    if drop_winglets:
+102        mesh = remove_winglets(mesh)
+103
+104    # This should be done after all clean-up operations
+105    if fix_normals:
+106        mesh.fix_normals()
+107
+108    return mesh
+
-
- View Source -
def fix_mesh(mesh, remote_infinite=True, merge_duplicate_verts=True,
-             remove_degenerate_faces=True, remove_unreferenced_verts=True,
-             drop_winglets=True, fix_normals=False, remove_disconnected=False,
-             inplace=False):
-    """Try to fix some common problems with mesh.
-
-     1. Remove infinite values
-     2. Merge duplicate vertices
-     3. Remove duplicate and degenerate faces
-     4. Remove unreference vertices
-     5. Drop winglets (faces that have only one adjacent face)
-     5. Fix normals (Optional)
-     6. Remove disconnected fragments (Optional)
-
-    Parameters
-    ----------
-    mesh :                  mesh-like object
-                            Mesh to fix. Must have `.vertices` and `.faces`
-                            properties.
-    remove_disconnected :   False | int
-                            If a number is given, will iterate over the mesh's
-                            connected components and remove those consisting of
-                            less than the given number of vertices. For example,
-                            ``remove_disconnected=5`` will drop parts of the
-                            mesh that consist of five or less connected
-                            vertices.
-    inplace :               bool
-                            If True, will perform fixes on the input mesh.
-                            If False, will make a copy first. This is silently
-                            ignored if `mesh` is not already a trimesh.
-
-    Returns
-    -------
-    fixed mesh :        trimesh.Trimesh
-
-    """
-    if not isinstance(mesh, tm.Trimesh):
-        mesh = make_trimesh(mesh, validate=False)
-    elif not inplace:
-        mesh = mesh.copy()
-
-    if remove_disconnected:
-        to_drop = []
-        for c in nx.connected_components(mesh.vertex_adjacency_graph):
-            if len(c) <= remove_disconnected:
-                to_drop += list(c)
-
-        # Remove dropped vertices
-        remove = np.isin(np.arange(mesh.vertices.shape[0]), to_drop)
-        mesh.update_vertices(~remove)
-
-    if remote_infinite:
-        mesh.remove_infinite_values()
-
-    if merge_duplicate_verts:
-        mesh.merge_vertices()
-
-    if remove_degenerate_faces:
-        mesh.remove_duplicate_faces()
-        mesh.remove_degenerate_faces()
-
-    if remove_unreferenced_verts:
-        mesh.remove_unreferenced_vertices()
-
-    if drop_winglets:
-        mesh = remove_winglets(mesh)
-
-    # This should be done after all clean-up operations
-    if fix_normals:
-        mesh.fix_normals()
-
-    return mesh
-
- -

Try to fix some common problems with mesh.

@@ -267,71 +258,71 @@
Returns
-
#   + +
+ + def + simplify(mesh, ratio) + + - - def - simplify(mesh, ratio):
+ +
192def simplify(mesh, ratio):
+193    """Simplify mesh using Blender 3D.
+194
+195    Uses Blender's "decimate" modifier in "collapse" mode.
+196
+197    Parameters
+198    ----------
+199    mesh :  trimesh.Trimesh
+200            Mesh to simplify.
+201    ratio : float
+202            Factor to which to reduce faces. For example, a ratio of 0.5 will
+203            reduce the number of faces to 50%.
+204
+205    Returns
+206    -------
+207    trimesh.Trimesh
+208            Simplified mesh.
+209
+210    """
+211    if not tm.interfaces.blender.exists:
+212        raise ImportError('No Blender available (executable not found).')
+213    _blender_executable = tm.interfaces.blender._blender_executable
+214
+215    assert ratio < 1 and ratio > 0, 'ratio must be between 0 and 1'
+216
+217    # We need to import here to avoid circular imports
+218    from ..utilities import make_trimesh
+219    mesh = make_trimesh(mesh, validate=False)
+220    assert isinstance(mesh, tm.Trimesh)
+221
+222    # Load the template
+223    temp_name = 'blender_decimate.py.template'
+224    if temp_name in _cache:
+225        template = _cache[temp_name]
+226    else:
+227        with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f:
+228            template = f.read()
+229        _cache[temp_name] = template
+230
+231    # Replace placeholder with actual ratio
+232    script = template.replace('$RATIO', str(ratio))
+233
+234    # Let trimesh's MeshScript take care of exectution and clean-up
+235    with tm.interfaces.generic.MeshScript(meshes=[mesh],
+236                                          script=script,
+237                                          debug=False) as blend:
+238        result = blend.run(_blender_executable
+239                           + ' --background --python $SCRIPT')
+240
+241    # Blender apparently returns actively incorrect face normals
+242    result.face_normals = None
+243
+244    return result
+
-
- View Source -
def simplify(mesh, ratio):
-    """Simplify mesh using Blender 3D.
-
-    Uses Blender's "decimate" modifier in "collapse" mode.
-
-    Parameters
-    ----------
-    mesh :  trimesh.Trimesh
-            Mesh to simplify.
-    ratio : float
-            Factor to which to reduce faces. For example, a ratio of 0.5 will
-            reduce the number of faces to 50%.
-
-    Returns
-    -------
-    trimesh.Trimesh
-            Simplified mesh.
-
-    """
-    if not tm.interfaces.blender.exists:
-        raise ImportError('No Blender available (executable not found).')
-    _blender_executable = tm.interfaces.blender._blender_executable
-
-    assert ratio < 1 and ratio > 0, 'ratio must be between 0 and 1'
-
-    # We need to import here to avoid circular imports
-    from ..utilities import make_trimesh
-    mesh = make_trimesh(mesh, validate=False)
-    assert isinstance(mesh, tm.Trimesh)
-
-    # Load the template
-    temp_name = 'blender_decimate.py.template'
-    if temp_name in _cache:
-        template = _cache[temp_name]
-    else:
-        with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f:
-            template = f.read()
-        _cache[temp_name] = template
-
-    # Replace placeholder with actual ratio
-    script = template.replace('$RATIO', str(ratio))
-
-    # Let trimesh's MeshScript take care of exectution and clean-up
-    with tm.interfaces.generic.MeshScript(meshes=[mesh],
-                                          script=script,
-                                          debug=False) as blend:
-        result = blend.run(_blender_executable
-                           + ' --background --python $SCRIPT')
-
-    # Blender apparently returns actively incorrect face normals
-    result.face_normals = None
-
-    return result
-
- -

Simplify mesh using Blender 3D.

@@ -357,74 +348,74 @@
Returns
-
#   + +
+ + def + remesh(mesh, voxel_size=50, adaptivity=5) + + - - def - remesh(mesh, voxel_size=50, adaptivity=5):
+ +
247def remesh(mesh, voxel_size=50, adaptivity=5):
+248    """Remesh mesh using Blender 3D.
+249
+250    Uses Blender's "remesh" modifier in "voxel" mode.
+251
+252    Parameters
+253    ----------
+254    mesh :  trimesh.Trimesh
+255            Mesh to remesh.
+256    voxel_size : float
+257            Size of individual voxels (edge length).
+258    adaptivity: float
+259            Reduces final face count where detail is not important.
+260
+261    Returns
+262    -------
+263    trimesh.Trimesh
+264            Remeshed mesh.
+265
+266    """
+267    if not tm.interfaces.blender.exists:
+268        raise ImportError('No Blender available (executable not found).')
+269    _blender_executable = tm.interfaces.blender._blender_executable
+270
+271    assert voxel_size > 0, '`voxel_size` must be a positive number'
+272    assert adaptivity > 0, '`adaptivity` must be a positive number'
+273
+274    # We need to import here to avoid circular imports
+275    from ..utilities import make_trimesh
+276    mesh = make_trimesh(mesh, validate=False)
+277    assert isinstance(mesh, tm.Trimesh)
+278
+279    # Load the template
+280    temp_name = 'blender_remesh.py.template'
+281    if temp_name in _cache:
+282        template = _cache[temp_name]
+283    else:
+284        with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f:
+285            template = f.read()
+286        _cache[temp_name] = template
+287
+288    # Replace placeholder with actual ratio
+289    script = template.replace('$VOXEL_SIZE', str(voxel_size)
+290                              ).replace('$ADAPTIVITY', str(adaptivity))
+291
+292    # Let trimesh's MeshScript take care of exectution and clean-up
+293    with tm.interfaces.generic.MeshScript(meshes=[mesh],
+294                                          script=script,
+295                                          debug=False) as blend:
+296        result = blend.run(_blender_executable
+297                           + ' --background --python $SCRIPT')
+298
+299    # Blender apparently returns actively incorrect face normals
+300    result.face_normals = None
+301
+302    return result
+
-
- View Source -
def remesh(mesh, voxel_size=50, adaptivity=5):
-    """Remesh mesh using Blender 3D.
-
-    Uses Blender's "remesh" modifier in "voxel" mode.
-
-    Parameters
-    ----------
-    mesh :  trimesh.Trimesh
-            Mesh to remesh.
-    voxel_size : float
-            Size of individual voxels (edge length).
-    adaptivity: float
-            Reduces final face count where detail is not important.
-
-    Returns
-    -------
-    trimesh.Trimesh
-            Remeshed mesh.
-
-    """
-    if not tm.interfaces.blender.exists:
-        raise ImportError('No Blender available (executable not found).')
-    _blender_executable = tm.interfaces.blender._blender_executable
-
-    assert voxel_size > 0, '`voxel_size` must be a positive number'
-    assert adaptivity > 0, '`adaptivity` must be a positive number'
-
-    # We need to import here to avoid circular imports
-    from ..utilities import make_trimesh
-    mesh = make_trimesh(mesh, validate=False)
-    assert isinstance(mesh, tm.Trimesh)
-
-    # Load the template
-    temp_name = 'blender_remesh.py.template'
-    if temp_name in _cache:
-        template = _cache[temp_name]
-    else:
-        with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f:
-            template = f.read()
-        _cache[temp_name] = template
-
-    # Replace placeholder with actual ratio
-    script = template.replace('$VOXEL_SIZE', str(voxel_size)
-                              ).replace('$ADAPTIVITY', str(adaptivity))
-
-    # Let trimesh's MeshScript take care of exectution and clean-up
-    with tm.interfaces.generic.MeshScript(meshes=[mesh],
-                                          script=script,
-                                          debug=False) as blend:
-        result = blend.run(_blender_executable
-                           + ' --background --python $SCRIPT')
-
-    # Blender apparently returns actively incorrect face normals
-    result.face_normals = None
-
-    return result
-
- -

Remesh mesh using Blender 3D.

@@ -451,247 +442,235 @@
Returns
-
#   - - - def - contract( - mesh, - epsilon=1e-06, - iter_lim=100, - time_lim=None, - precision=1e-07, - SL=2, - WH0=1, - WL0='auto', - operator='cotangent', - progress=True, - validate=True -): + +
+ + def + contract( mesh, epsilon=1e-06, iter_lim=100, time_lim=None, precision=1e-07, SL=2, WH0=1, WL0='auto', operator='cotangent', progress=True, validate=True) + + +
+ +
 37def contract(mesh, epsilon=1e-06, iter_lim=100, time_lim=None, precision=1e-07,
+ 38             SL=2, WH0=1, WL0='auto', operator='cotangent', progress=True,
+ 39             validate=True):
+ 40    """Contract mesh.
+ 41
+ 42    In a nutshell: this function contracts the mesh by applying rounds of
+ 43    _constraint_ Laplacian smoothing. This function can be fairly expensive
+ 44    and I highly recommend you play around with ``SL`` to contract the
+ 45    mesh in as few steps as possible. The contraction doesn't have to be perfect
+ 46    for good skeletonization results (<10%, i.e. `epsilon<0.1`).
+ 47
+ 48    Also: parameterization matters a lot! Default parameters will get you there
+ 49    but playing around with `SL` and `WH0` might speed things up by an order of
+ 50    magnitude.
+ 51
+ 52    Parameters
+ 53    ----------
+ 54    mesh :          mesh obj
+ 55                    The mesh to be contracted. Can be any object (e.g.
+ 56                    a trimesh.Trimesh) that has ``.vertices`` and ``.faces``
+ 57                    properties or a tuple ``(vertices, faces)`` or a dictionary
+ 58                    ``{'vertices': vertices, 'faces': faces}``.
+ 59                    Vertices and faces must be (N, 3) numpy arrays.
+ 60    epsilon :       float (0-1), optional
+ 61                    Target contraction rate as measured by the sum of all face
+ 62                    areas in the contracted versus the original mesh. Algorithm
+ 63                    will stop once mesh is contracted below this threshold.
+ 64                    Depending on your mesh (number of faces, shape) reaching a
+ 65                    strong contraction can be extremely costly with comparatively
+ 66                    little benefit for the subsequent skeletonization. Note that
+ 67                    the algorithm might stop short of this target if ``iter_lim``
+ 68                    or ``time_lim`` is reached first or if the sum of face areas
+ 69                    is increasing from one iteration to the next instead of
+ 70                    decreasing.
+ 71    iter_lim :      int (>1), optional
+ 72                    Maximum rounds of contractions.
+ 73    time_lim :      int, optional
+ 74                    Maximum run time in seconds. Note that this limit is not
+ 75                    checked during but after each round of contraction. Hence,
+ 76                    the actual total time will likely overshoot ``time_lim``.
+ 77    precision :     float, optional
+ 78                    Sets the precision for finding the least-square solution.
+ 79                    This is the main determinant for speed vs quality: lower
+ 80                    values will take (much) longer but will get you closer to an
+ 81                    optimally contracted mesh. Higher values will be faster but
+ 82                    the iterative contractions might stop early.
+ 83    SL :            float, optional
+ 84                    Factor by which the contraction matrix is multiplied for
+ 85                    each iteration. Higher values = quicker contraction, lower
+ 86                    values = more likely to get you an optimal contraction.
+ 87    WH0 :           float, optional
+ 88                    Initial weight factor for the attraction constraints.
+ 89                    The ratio of the initial weights ``WL0`` and ``WH0``
+ 90                    controls the smoothness and the degree of contraction of the
+ 91                    first iteration result, thus it determines the amount of
+ 92                    details retained in subsequent and final contracted meshes:
+ 93                    higher ``WH0`` = more details retained.
+ 94    WL0 :           "auto" | float
+ 95                    Initial weight factor for the contraction constraints. By
+ 96                    default ("auto"), this will be set to ``1e-3 * sqrt(A)``
+ 97                    with ``A`` being the average face area. This ensures that
+ 98                    contraction forces scale with the coarseness of the mesh.
+ 99    operator :      "cotangent" | "umbrella"
+100                    Which Laplacian operator to use:
+101
+102                      - The "cotangent" operator (default) takes both topology
+103                        and geometry of the mesh into account and is hence a
+104                        better descriptor of the curvature flow. This is the
+105                        operator used in the original paper.
+106                      - The "umbrella" operator (aka "uniform weighting") uses
+107                        only topological features of the mesh. This also makes
+108                        it more robust against flaws in the mesh! Use it when
+109                        the cotangent operator produces oddly contracted meshes.
+110
+111    progress :      bool
+112                    Whether or not to show a progress bar.
+113    validate :      bool
+114                    If True, will try to fix potential issues with the mesh
+115                    (e.g. infinite values, duplicate vertices, degenerate faces)
+116                    before collapsing. Degenerate meshes can lead to effectively
+117                    infinite runtime for this function!
+118
+119    Returns
+120    -------
+121    trimesh.Trimesh
+122                    Contracted copy of original mesh. The final contraction rate
+123                    is attached to the mesh as ``.epsilon`` property.
+124
+125    References
+126    ----------
+127    [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh
+128        contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
+129
+130    """
+131    assert operator in ('cotangent', 'umbrella')
+132    start = time.time()
+133
+134    # Force into trimesh
+135    m = make_trimesh(mesh, validate=validate)
+136    n = len(m.vertices)
+137
+138    # Initialize attraction weights
+139    zeros = np.zeros((n, 3))
+140    WH0_diag = np.zeros(n)
+141    WH0_diag.fill(WH0)
+142    WH0 = sp.sparse.spdiags(WH0_diag, 0, WH0_diag.size, WH0_diag.size)
+143    # Make a copy but keep original values
+144    WH = sp.sparse.dia_matrix(WH0)
+145
+146    # Initialize contraction weights
+147    if WL0 == 'auto':
+148        WL0 = 1e-03 * np.sqrt(averageFaceArea(m))
+149        #WL0 = 1.0 / 10.0 * np.sqrt(averageFaceArea(m))
+150    WL_diag = np.zeros(n)
+151    WL_diag.fill(WL0)
+152    WL = sp.sparse.spdiags(WL_diag, 0, WL_diag.size, WL_diag.size)
+153
+154    # Copy mesh
+155    dm = m.copy()
+156
+157    area_ratios = [1.0]
+158    originalRingAreas = getOneRingAreas(dm)
+159    goodvertices = dm.vertices
+160    bar_format = ("{l_bar}{bar}| [{elapsed}<{remaining}, "
+161                  "{postfix[0]}/{postfix[1]}it, "
+162                  "{rate_fmt}, epsilon {postfix[2]:.2g}")
+163    with tqdm(total=100,
+164              bar_format=bar_format,
+165              disable=progress is False,
+166              postfix=[1, iter_lim, 1]) as pbar:
+167        for i in range(iter_lim):
+168            # Get Laplace weights
+169            if operator == 'cotangent':
+170                L = laplacian_cotangent(dm, normalized=True)
+171            else:
+172                L = laplacian_umbrella(dm)
+173
+174            V = getMeshVPos(dm)
+175            A = sp.sparse.vstack([WL.dot(L), WH])
+176            b = np.vstack((zeros, WH.dot(V)))
+177
+178            cpts = np.zeros((n, 3))
+179            for j in range(3):
+180                """
+181                # Solve A*x = b
+182                # Note that we force scipy's lsqr() to use current vertex
+183                # positions as start points - this speeds things up and
+184                # without it we get suboptimal solutions that lead to early
+185                # termination
+186                cpts[:, j] = lsqr(A, b[:, j],
+187                                  atol=precision, btol=precision,
+188                                  damp=1,
+189                                  x0=dm.vertices[:, j])[0]
+190                """
+191                # The solution below is recommended in scipy's lsqr docstring
+192                # for when we have an initial estimate
+193                # Gives use the same results as above but is slightly faster
+194
+195                # Initial estimate (i.e. our current positions)
+196                x0 = dm.vertices[:, j]
+197                # Compute residual vector
+198                r0 = b[:, j] - A * x0
+199                # Use LSQR to solve the system
+200                dx = lsqr(A, r0,
+201                          atol=precision, btol=precision,
+202                          damp=1)[0]
+203                # Add the correction dx to obtain a final solution
+204                cpts[:, j] = x0 + dx
+205
+206            # Update mesh with new vertex position
+207            dm.vertices = cpts
+208
+209            # Update iteration in progress bar
+210            if progress:
+211                pbar.postfix[0] = i + 1
+212
+213            # Break if face area has increased compared to the last iteration
+214            new_eps = dm.area / m.area
+215            if (new_eps > area_ratios[-1]):
+216                dm.vertices = goodvertices
+217                if progress:
+218                    tqdm.write("Total face area increased from last iteration."
+219                               f" Contraction stopped prematurely after {i} "
+220                               f"iterations at epsilon {area_ratios[-1]:.2g}.")
+221                break
+222            area_ratios.append(new_eps)
+223
+224            # Update progress bar
+225            if progress:
+226                pbar.postfix[2] = area_ratios[-1]
+227                prog = round((area_ratios[-2] - area_ratios[-1]) / (1 - epsilon) * 100)
+228                pbar.update(min(prog, 100-pbar.n))
+229
+230            goodvertices = cpts
+231
+232            # Update contraction weights -> at each iteration the contraction
+233            # forces increase to counteract the increased attraction forces
+234            WL = sp.sparse.dia_matrix(WL.multiply(SL))
+235
+236            # Update attraction weights -> the smaller the one ring areas
+237            # the higher the attraction forces
+238            changeinarea = np.sqrt(originalRingAreas / getOneRingAreas(dm))
+239            WH = sp.sparse.dia_matrix(WH0.multiply(changeinarea))
+240
+241            # Stop if we reached our target contraction rate
+242            if (area_ratios[-1] <= epsilon):
+243                break
+244
+245            # Stop if time limit is reached
+246            if not isinstance(time_lim, (bool, type(None))):
+247                if (time.time() - start) >= time_lim:
+248                    break
+249
+250        # Keep track of final epsilon
+251        dm.epsilon = area_ratios[-1]
+252
+253        return dm
+
-
- View Source -
def contract(mesh, epsilon=1e-06, iter_lim=100, time_lim=None, precision=1e-07,
-             SL=2, WH0=1, WL0='auto', operator='cotangent', progress=True,
-             validate=True):
-    """Contract mesh.
-
-    In a nutshell: this function contracts the mesh by applying rounds of
-    _constraint_ Laplacian smoothing. This function can be fairly expensive
-    and I highly recommend you play around with ``SL`` to contract the
-    mesh in as few steps as possible. The contraction doesn't have to be perfect
-    for good skeletonization results (<10%, i.e. `epsilon<0.1`).
-
-    Also: parameterization matters a lot! Default parameters will get you there
-    but playing around with `SL` and `WH0` might speed things up by an order of
-    magnitude.
-
-    Parameters
-    ----------
-    mesh :          mesh obj
-                    The mesh to be contracted. Can be any object (e.g.
-                    a trimesh.Trimesh) that has ``.vertices`` and ``.faces``
-                    properties or a tuple ``(vertices, faces)`` or a dictionary
-                    ``{'vertices': vertices, 'faces': faces}``.
-                    Vertices and faces must be (N, 3) numpy arrays.
-    epsilon :       float (0-1), optional
-                    Target contraction rate as measured by the sum of all face
-                    areas in the contracted versus the original mesh. Algorithm
-                    will stop once mesh is contracted below this threshold.
-                    Depending on your mesh (number of faces, shape) reaching a
-                    strong contraction can be extremely costly with comparatively
-                    little benefit for the subsequent skeletonization. Note that
-                    the algorithm might stop short of this target if ``iter_lim``
-                    or ``time_lim`` is reached first or if the sum of face areas
-                    is increasing from one iteration to the next instead of
-                    decreasing.
-    iter_lim :      int (>1), optional
-                    Maximum rounds of contractions.
-    time_lim :      int, optional
-                    Maximum run time in seconds. Note that this limit is not
-                    checked during but after each round of contraction. Hence,
-                    the actual total time will likely overshoot ``time_lim``.
-    precision :     float, optional
-                    Sets the precision for finding the least-square solution.
-                    This is the main determinant for speed vs quality: lower
-                    values will take (much) longer but will get you closer to an
-                    optimally contracted mesh. Higher values will be faster but
-                    the iterative contractions might stop early.
-    SL :            float, optional
-                    Factor by which the contraction matrix is multiplied for
-                    each iteration. Higher values = quicker contraction, lower
-                    values = more likely to get you an optimal contraction.
-    WH0 :           float, optional
-                    Initial weight factor for the attraction constraints.
-                    The ratio of the initial weights ``WL0`` and ``WH0``
-                    controls the smoothness and the degree of contraction of the
-                    first iteration result, thus it determines the amount of
-                    details retained in subsequent and final contracted meshes:
-                    higher ``WH0`` = more details retained.
-    WL0 :           "auto" | float
-                    Initial weight factor for the contraction constraints. By
-                    default ("auto"), this will be set to ``1e-3 * sqrt(A)``
-                    with ``A`` being the average face area. This ensures that
-                    contraction forces scale with the coarseness of the mesh.
-    operator :      "cotangent" | "umbrella"
-                    Which Laplacian operator to use:
-
-                      - The "cotangent" operator (default) takes both topology
-                        and geometry of the mesh into account and is hence a
-                        better descriptor of the curvature flow. This is the
-                        operator used in the original paper.
-                      - The "umbrella" operator (aka "uniform weighting") uses
-                        only topological features of the mesh. This also makes
-                        it more robust against flaws in the mesh! Use it when
-                        the cotangent operator produces oddly contracted meshes.
-
-    progress :      bool
-                    Whether or not to show a progress bar.
-    validate :      bool
-                    If True, will try to fix potential issues with the mesh
-                    (e.g. infinite values, duplicate vertices, degenerate faces)
-                    before collapsing. Degenerate meshes can lead to effectively
-                    infinite runtime for this function!
-
-    Returns
-    -------
-    trimesh.Trimesh
-                    Contracted copy of original mesh. The final contraction rate
-                    is attached to the mesh as ``.epsilon`` property.
-
-    References
-    ----------
-    [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh
-        contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
-
-    """
-    assert operator in ('cotangent', 'umbrella')
-    start = time.time()
-
-    # Force into trimesh
-    m = make_trimesh(mesh, validate=validate)
-    n = len(m.vertices)
-
-    # Initialize attraction weights
-    zeros = np.zeros((n, 3))
-    WH0_diag = np.zeros(n)
-    WH0_diag.fill(WH0)
-    WH0 = sp.sparse.spdiags(WH0_diag, 0, WH0_diag.size, WH0_diag.size)
-    # Make a copy but keep original values
-    WH = sp.sparse.dia_matrix(WH0)
-
-    # Initialize contraction weights
-    if WL0 == 'auto':
-        WL0 = 1e-03 * np.sqrt(averageFaceArea(m))
-        #WL0 = 1.0 / 10.0 * np.sqrt(averageFaceArea(m))
-    WL_diag = np.zeros(n)
-    WL_diag.fill(WL0)
-    WL = sp.sparse.spdiags(WL_diag, 0, WL_diag.size, WL_diag.size)
-
-    # Copy mesh
-    dm = m.copy()
-
-    area_ratios = [1.0]
-    originalRingAreas = getOneRingAreas(dm)
-    goodvertices = dm.vertices
-    bar_format = ("{l_bar}{bar}| [{elapsed}<{remaining}, "
-                  "{postfix[0]}/{postfix[1]}it, "
-                  "{rate_fmt}, epsilon {postfix[2]:.2g}")
-    with tqdm(total=100,
-              bar_format=bar_format,
-              disable=progress is False,
-              postfix=[1, iter_lim, 1]) as pbar:
-        for i in range(iter_lim):
-            # Get Laplace weights
-            if operator == 'cotangent':
-                L = laplacian_cotangent(dm, normalized=True)
-            else:
-                L = laplacian_umbrella(dm)
-
-            V = getMeshVPos(dm)
-            A = sp.sparse.vstack([WL.dot(L), WH])
-            b = np.vstack((zeros, WH.dot(V)))
-
-            cpts = np.zeros((n, 3))
-            for j in range(3):
-                """
-                # Solve A*x = b
-                # Note that we force scipy's lsqr() to use current vertex
-                # positions as start points - this speeds things up and
-                # without it we get suboptimal solutions that lead to early
-                # termination
-                cpts[:, j] = lsqr(A, b[:, j],
-                                  atol=precision, btol=precision,
-                                  damp=1,
-                                  x0=dm.vertices[:, j])[0]
-                """
-                # The solution below is recommended in scipy's lsqr docstring
-                # for when we have an initial estimate
-                # Gives use the same results as above but is slightly faster
-
-                # Initial estimate (i.e. our current positions)
-                x0 = dm.vertices[:, j]
-                # Compute residual vector
-                r0 = b[:, j] - A * x0
-                # Use LSQR to solve the system
-                dx = lsqr(A, r0,
-                          atol=precision, btol=precision,
-                          damp=1)[0]
-                # Add the correction dx to obtain a final solution
-                cpts[:, j] = x0 + dx
-
-            # Update mesh with new vertex position
-            dm.vertices = cpts
-
-            # Update iteration in progress bar
-            if progress:
-                pbar.postfix[0] = i + 1
-
-            # Break if face area has increased compared to the last iteration
-            new_eps = dm.area / m.area
-            if (new_eps > area_ratios[-1]):
-                dm.vertices = goodvertices
-                if progress:
-                    tqdm.write("Total face area increased from last iteration."
-                               f" Contraction stopped prematurely after {i} "
-                               f"iterations at epsilon {area_ratios[-1]:.2g}.")
-                break
-            area_ratios.append(new_eps)
-
-            # Update progress bar
-            if progress:
-                pbar.postfix[2] = area_ratios[-1]
-                prog = round((area_ratios[-2] - area_ratios[-1]) / (1 - epsilon) * 100)
-                pbar.update(min(prog, 100-pbar.n))
-
-            goodvertices = cpts
-
-            # Update contraction weights -> at each iteration the contraction
-            # forces increase to counteract the increased attraction forces
-            WL = sp.sparse.dia_matrix(WL.multiply(SL))
-
-            # Update attraction weights -> the smaller the one ring areas
-            # the higher the attraction forces
-            changeinarea = np.sqrt(originalRingAreas / getOneRingAreas(dm))
-            WH = sp.sparse.dia_matrix(WH0.multiply(changeinarea))
-
-            # Stop if we reached our target contraction rate
-            if (area_ratios[-1] <= epsilon):
-                break
-
-            # Stop if time limit is reached
-            if not isinstance(time_lim, (bool, type(None))):
-                if (time.time() - start) >= time_lim:
-                    break
-
-        # Keep track of final epsilon
-        dm.epsilon = area_ratios[-1]
-
-        return dm
-
- -

Contract mesh.

diff --git a/docs/skeletor/skeletonize.html b/docs/skeletor/skeletonize.html index 3009b90..5e403ee 100644 --- a/docs/skeletor/skeletonize.html +++ b/docs/skeletor/skeletonize.html @@ -3,14 +3,14 @@ - + skeletor.skeletonize API documentation - - + +
-
+

skeletor.skeletonize

@@ -158,234 +158,235 @@

References

-
- View Source -
#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
-#    Copyright (C) 2018 Philipp Schlegel
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program.
-
-r"""
-The `skeletor.skeletonize` module contains functions to for skeletonization
-of meshes.
-
-There are several approaches to skeletonizing a mesh. Which one to pick depends
-(among other things) on the shape of your mesh and the skeleton quality you want
-to get out of it. In general, unless you mesh already looks like a tube I
-recommend looking into mesh contraction [^1].
-
-Please see the documentation of the individual functions for details but here
-is a quick summary:
-
-| function                                    | speed | robust | radii [^2] | mesh map [^3] | description                                        |
-| ------------------------------------------- | :---: | :----: | :--------: | :-----------: | ---------------------------------------------------|
-| `skeletor.skeletonize.by_wavefront()`       | +++   | ++     | yes        | yes           | works well for tubular meshes                      |
-| `skeletor.skeletonize.by_vertex_clusters()` | ++    | +      | no         | yes           | best with contracted meshes [^1]                   |
-| `skeletor.skeletonize.by_teasar()`          | +     | ++     | no         | yes           | works on mesh surface                              |
-| `skeletor.skeletonize.by_tangent_ball()`    | ++    | 0      | yes        | yes           | works with mesh normals                            |
-| `skeletor.skeletonize.by_edge_collapse()`   | -     | 0      | no         | no            | published with [1] - never got this to work well   |
-
-[^1]: use `skeletor.pre.contract()`
-[^2]: radii can also be added in postprocessing with `skeletor.post.radii()`
-[^3]: a mapping from the meshes vertices to skeleton nodes
-
-## References
-
-`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
-
-"""
-
-from .edge_collapse import *
-from .vertex_cluster import *
-from .wave import *
-from .teasar import *
-from .tangent_ball import *
-
-__docformat__ = "numpy"
-__all__ = ['by_teasar', 'by_wavefront', 'by_vertex_clusters',
-           'by_edge_collapse', 'by_tangent_ball']
-
- -
+ + + + +
 1#    This script is part of skeletor (http://www.github.com/navis-org/skeletor).
+ 2#    Copyright (C) 2018 Philipp Schlegel
+ 3#
+ 4#    This program is free software: you can redistribute it and/or modify
+ 5#    it under the terms of the GNU General Public License as published by
+ 6#    the Free Software Foundation, either version 3 of the License, or
+ 7#    (at your option) any later version.
+ 8#
+ 9#    This program is distributed in the hope that it will be useful,
+10#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+11#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+12#    GNU General Public License for more details.
+13#
+14#    You should have received a copy of the GNU General Public License
+15#    along with this program.
+16
+17r"""
+18The `skeletor.skeletonize` module contains functions to for skeletonization
+19of meshes.
+20
+21There are several approaches to skeletonizing a mesh. Which one to pick depends
+22(among other things) on the shape of your mesh and the skeleton quality you want
+23to get out of it. In general, unless you mesh already looks like a tube I
+24recommend looking into mesh contraction [^1].
+25
+26Please see the documentation of the individual functions for details but here
+27is a quick summary:
+28
+29| function                                    | speed | robust | radii [^2] | mesh map [^3] | description                                        |
+30| ------------------------------------------- | :---: | :----: | :--------: | :-----------: | ---------------------------------------------------|
+31| `skeletor.skeletonize.by_wavefront()`       | +++   | ++     | yes        | yes           | works well for tubular meshes                      |
+32| `skeletor.skeletonize.by_vertex_clusters()` | ++    | +      | no         | yes           | best with contracted meshes [^1]                   |
+33| `skeletor.skeletonize.by_teasar()`          | +     | ++     | no         | yes           | works on mesh surface                              |
+34| `skeletor.skeletonize.by_tangent_ball()`    | ++    | 0      | yes        | yes           | works with mesh normals                            |
+35| `skeletor.skeletonize.by_edge_collapse()`   | -     | 0      | no         | no            | published with [1] - never got this to work well   |
+36
+37[^1]: use `skeletor.pre.contract()`
+38[^2]: radii can also be added in postprocessing with `skeletor.post.radii()`
+39[^3]: a mapping from the meshes vertices to skeleton nodes
+40
+41## References
+42
+43`[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.`
+44
+45"""
+46
+47from .edge_collapse import *
+48from .vertex_cluster import *
+49from .wave import *
+50from .teasar import *
+51from .tangent_ball import *
+52
+53__docformat__ = "numpy"
+54__all__ = ['by_teasar', 'by_wavefront', 'by_vertex_clusters',
+55           'by_edge_collapse', 'by_tangent_ball']
+
+
-
#   + +
+ + def + by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True) - - def - by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True): -
+ -
- View Source -
def by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True):
-    """Skeletonize a mesh mesh using the TEASAR algorithm [1].
-
-    This algorithm finds the longest path from a root vertex, invalidates all
-    vertices that are within `inv_dist`. Then picks the second longest (and
-    still valid) path and does the same. Rinse & repeat until all vertices have
-    been invalidated. It's fast + works very well with tubular meshes, and with
-    `inv_dist` you have control over the level of detail. Note that by its
-    nature the skeleton will be exactly on the surface of the mesh.
-
-    Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and
-    Forrest Collman in `meshparty` (https://github.com/sdorkenw/MeshParty).
-
-    Parameters
-    ----------
-    mesh :          mesh obj
-                    The mesh to be skeletonize. Can an object that has
-                    ``.vertices`` and ``.faces`` properties  (e.g. a
-                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
-                    dictionary ``{'vertices': vertices, 'faces': faces}``.
-    inv_dist :      int | float
-                    Distance along the mesh used for invalidation of vertices.
-                    This controls how detailed (or noisy) the skeleton will be.
-    min_length :    float, optional
-                    If provided, will skip any branch that is shorter than
-                    `min_length`. Use this to get rid of noise but note that
-                    it will lead to vertices not being mapped to skeleton nodes.
-                    Such vertices will show up with index -1 in
-                    `Skeleton.mesh_map`.
-    root :          int, optional
-                    Vertex ID of a root. If not provided will use ``0``.
-    progress :      bool, optional
-                    If True, will show progress bar.
-
-    Returns
-    -------
-    skeletor.Skeleton
-                    Holds results of the skeletonization and enables quick
-                    visualization.
-
-    References
-    ----------
-    [1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.
-        (n.d.). TEASAR: tree-structure extraction algorithm for accurate and
-        robust skeletons. In Proceedings the Eighth Pacific Conference on
-        Computer Graphics and Applications. IEEE Comput. Soc.
-        https://doi.org/10.1109/pccga.2000.883951
-
-    """
-    mesh = make_trimesh(mesh, validate=False)
-
-    # Generate Graph (must be undirected)
-    G = ig.Graph(edges=mesh.edges_unique, directed=False)
-    G.es['weight'] = mesh.edges_unique_length
-
-    if not root:
-        root = 0
-
-    edges = np.array([], dtype=np.int64)
-    mesh_map = np.full(mesh.vertices.shape[0], fill_value=-1)
-
-    with tqdm(desc='Invalidating', total=len(G.vs),
-              disable=not progress, leave=False) as pbar:
-        for cc in sorted(G.clusters(), key=len, reverse=True):
-            # Make a subgraph for this connected component
-            SG = G.subgraph(cc)
-            cc = np.array(cc)
-
-            # Find root within subgraph
-            if root in cc:
-                this_root = np.where(cc == root)[0][0]
-            else:
-                this_root = 0
-
-            # Get the sparse adjacency matrix of the subgraph
-            sp = SG.get_adjacency_sparse('weight')
-
-            # Get lengths of paths to all nodes from root
-            paths = SG.shortest_paths(this_root, target=None, weights='weight',
-                                      mode='ALL')[0]
-            paths = np.array(paths)
-
-            # Prep array for invalidation
-            valid = ~np.zeros(paths.shape).astype(bool)
-            invalidated = 0
-
-            while np.any(valid):
-                # Find the farthest point
-                farthest = np.argmax(paths)
-
-                # Get path from root to farthest point
-                path = SG.get_shortest_paths(this_root, farthest,
-                                             weights='weight', mode='ALL')[0]
-
-                # Get IDs of edges along the path
-                eids = SG.get_eids(path=path, directed=False)
-
-                # Stop if farthest point is closer than min_length
-                add = True
-                if min_length:
-                    # This should only be distance to the first branchpoint
-                    # from the tip since we set other weights to zero
-                    le = sum(SG.es[eids].get_attribute_values('weight'))
-                    if le < min_length:
-                        add = False
-
-                if add:
-                    # Add these new edges
-                    new_edges = np.vstack((cc[path[:-1]], cc[path[1:]])).T
-                    edges = np.append(edges, new_edges).reshape(-1, 2)
-
-                # Invalidate points in the path
-                valid[path] = False
-                paths[path] = 0
-
-                # Must set weights along path to 0 so that this path is
-                # taken again in future iterations
-                SG.es[eids]['weight'] = 0
-
-                # Get all nodes within `inv_dist` to this path
-                # Note: can we somehow only include still valid nodes to speed
-                # things up?
-                dist, _, sources = dijkstra(sp, directed=False, indices=path,
-                                            limit=inv_dist, min_only=True,
-                                            return_predecessors=True)
-
-                # Invalidate
-                in_dist = dist <= inv_dist
-                to_invalidate = np.where(in_dist)[0]
-                valid[to_invalidate] = False
-                paths[to_invalidate] = 0
-
-                # Update mesh vertex to skeleton node map
-                mesh_map[cc[in_dist]] = cc[sources[in_dist]]
-
-                pbar.update((~valid).sum() - invalidated)
-                invalidated = (~valid).sum()
-
-    # Make unique edges (paths will have overlapped!)
-    edges = unique(edges, axis=0)
-
-    # Create a directed acyclic and hierarchical graph
-    G_nx = edges_to_graph(edges=edges[:, [1, 0]],
-                          fix_tree=True, fix_edges=False,
-                          weight=False)
-
-    # Generate the SWC table
-    swc, new_ids = make_swc(G_nx, coords=mesh.vertices, reindex=True)
-
-    # Update vertex to node ID map
-    mesh_map = np.array([new_ids.get(n, -1) for n in mesh_map])
-
-    return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, method='teasar')
-
+
+ +
 39def by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True):
+ 40    """Skeletonize a mesh mesh using the TEASAR algorithm [1].
+ 41
+ 42    This algorithm finds the longest path from a root vertex, invalidates all
+ 43    vertices that are within `inv_dist`. Then picks the second longest (and
+ 44    still valid) path and does the same. Rinse & repeat until all vertices have
+ 45    been invalidated. It's fast + works very well with tubular meshes, and with
+ 46    `inv_dist` you have control over the level of detail. Note that by its
+ 47    nature the skeleton will be exactly on the surface of the mesh.
+ 48
+ 49    Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and
+ 50    Forrest Collman in `meshparty` (https://github.com/sdorkenw/MeshParty).
+ 51
+ 52    Parameters
+ 53    ----------
+ 54    mesh :          mesh obj
+ 55                    The mesh to be skeletonize. Can an object that has
+ 56                    ``.vertices`` and ``.faces`` properties  (e.g. a
+ 57                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
+ 58                    dictionary ``{'vertices': vertices, 'faces': faces}``.
+ 59    inv_dist :      int | float
+ 60                    Distance along the mesh used for invalidation of vertices.
+ 61                    This controls how detailed (or noisy) the skeleton will be.
+ 62    min_length :    float, optional
+ 63                    If provided, will skip any branch that is shorter than
+ 64                    `min_length`. Use this to get rid of noise but note that
+ 65                    it will lead to vertices not being mapped to skeleton nodes.
+ 66                    Such vertices will show up with index -1 in
+ 67                    `Skeleton.mesh_map`.
+ 68    root :          int, optional
+ 69                    Vertex ID of a root. If not provided will use ``0``.
+ 70    progress :      bool, optional
+ 71                    If True, will show progress bar.
+ 72
+ 73    Returns
+ 74    -------
+ 75    skeletor.Skeleton
+ 76                    Holds results of the skeletonization and enables quick
+ 77                    visualization.
+ 78
+ 79    References
+ 80    ----------
+ 81    [1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.
+ 82        (n.d.). TEASAR: tree-structure extraction algorithm for accurate and
+ 83        robust skeletons. In Proceedings the Eighth Pacific Conference on
+ 84        Computer Graphics and Applications. IEEE Comput. Soc.
+ 85        https://doi.org/10.1109/pccga.2000.883951
+ 86
+ 87    """
+ 88    mesh = make_trimesh(mesh, validate=False)
+ 89
+ 90    # Generate Graph (must be undirected)
+ 91    G = ig.Graph(edges=mesh.edges_unique, directed=False)
+ 92    G.es['weight'] = mesh.edges_unique_length
+ 93
+ 94    if not root:
+ 95        root = 0
+ 96
+ 97    edges = np.array([], dtype=np.int64)
+ 98    mesh_map = np.full(mesh.vertices.shape[0], fill_value=-1)
+ 99
+100    with tqdm(desc='Invalidating', total=len(G.vs),
+101              disable=not progress, leave=False) as pbar:
+102        for cc in sorted(G.clusters(), key=len, reverse=True):
+103            # Make a subgraph for this connected component
+104            SG = G.subgraph(cc)
+105            cc = np.array(cc)
+106
+107            # Find root within subgraph
+108            if root in cc:
+109                this_root = np.where(cc == root)[0][0]
+110            else:
+111                this_root = 0
+112
+113            # Get the sparse adjacency matrix of the subgraph
+114            sp = SG.get_adjacency_sparse('weight')
+115
+116            # Get lengths of paths to all nodes from root
+117            paths = SG.shortest_paths(this_root, target=None, weights='weight',
+118                                      mode='ALL')[0]
+119            paths = np.array(paths)
+120
+121            # Prep array for invalidation
+122            valid = ~np.zeros(paths.shape).astype(bool)
+123            invalidated = 0
+124
+125            while np.any(valid):
+126                # Find the farthest point
+127                farthest = np.argmax(paths)
+128
+129                # Get path from root to farthest point
+130                path = SG.get_shortest_paths(this_root, farthest,
+131                                             weights='weight', mode='ALL')[0]
+132
+133                # Get IDs of edges along the path
+134                eids = SG.get_eids(path=path, directed=False)
+135
+136                # Stop if farthest point is closer than min_length
+137                add = True
+138                if min_length:
+139                    # This should only be distance to the first branchpoint
+140                    # from the tip since we set other weights to zero
+141                    le = sum(SG.es[eids].get_attribute_values('weight'))
+142                    if le < min_length:
+143                        add = False
+144
+145                if add:
+146                    # Add these new edges
+147                    new_edges = np.vstack((cc[path[:-1]], cc[path[1:]])).T
+148                    edges = np.append(edges, new_edges).reshape(-1, 2)
+149
+150                # Invalidate points in the path
+151                valid[path] = False
+152                paths[path] = 0
+153
+154                # Must set weights along path to 0 so that this path is
+155                # taken again in future iterations
+156                SG.es[eids]['weight'] = 0
+157
+158                # Get all nodes within `inv_dist` to this path
+159                # Note: can we somehow only include still valid nodes to speed
+160                # things up?
+161                dist, _, sources = dijkstra(sp, directed=False, indices=path,
+162                                            limit=inv_dist, min_only=True,
+163                                            return_predecessors=True)
+164
+165                # Invalidate
+166                in_dist = dist <= inv_dist
+167                to_invalidate = np.where(in_dist)[0]
+168                valid[to_invalidate] = False
+169                paths[to_invalidate] = 0
+170
+171                # Update mesh vertex to skeleton node map
+172                mesh_map[cc[in_dist]] = cc[sources[in_dist]]
+173
+174                pbar.update((~valid).sum() - invalidated)
+175                invalidated = (~valid).sum()
+176
+177    # Make unique edges (paths will have overlapped!)
+178    edges = unique(edges, axis=0)
+179
+180    # Create a directed acyclic and hierarchical graph
+181    G_nx = edges_to_graph(edges=edges[:, [1, 0]],
+182                          fix_tree=True, fix_edges=False,
+183                          weight=False)
+184
+185    # Generate the SWC table
+186    swc, new_ids = make_swc(G_nx, coords=mesh.vertices, reindex=True)
+187
+188    # Update vertex to node ID map
+189    mesh_map = np.array([new_ids.get(n, -1) for n in mesh_map])
+190
+191    return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, method='teasar')
+
-

Skeletonize a mesh mesh using the TEASAR algorithm [1].

@@ -435,156 +436,149 @@
References
(n.d.). TEASAR: tree-structure extraction algorithm for accurate and robust skeletons. In Proceedings the Eighth Pacific Conference on Computer Graphics and Applications. IEEE Comput. Soc. - https://doi.org/10.1109/pccga.2000.883951

+ https://doi.org/10.1109/pccga.2000.883951

-
#   - - - def - by_wavefront( - mesh, - waves=1, - origins=None, - step_size=1, - radius_agg='mean', - progress=True -): + +
+ + def + by_wavefront( mesh, waves=1, origins=None, step_size=1, radius_agg='mean', progress=True) + + +
+ +
 39def by_wavefront(mesh,
+ 40                 waves=1,
+ 41                 origins=None,
+ 42                 step_size=1,
+ 43                 radius_agg='mean',
+ 44                 progress=True):
+ 45    """Skeletonize a mesh using wave fronts.
+ 46
+ 47    The algorithm tries to find rings of vertices and collapse them to
+ 48    their center. This is done by propagating a wave across the mesh starting at
+ 49    a single seed vertex. As the wave travels across the mesh we keep track of
+ 50    which vertices are are encountered at each step. Groups of connected
+ 51    vertices that are "hit" by the wave at the same time are considered rings
+ 52    and subsequently collapsed. By its nature this works best with tubular meshes.
+ 53
+ 54    Parameters
+ 55    ----------
+ 56    mesh :          mesh obj
+ 57                    The mesh to be skeletonize. Can an object that has
+ 58                    ``.vertices`` and ``.faces`` properties  (e.g. a
+ 59                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
+ 60                    dictionary ``{'vertices': vertices, 'faces': faces}``.
+ 61    waves :         int
+ 62                    Number of waves to run across the mesh. Each wave is
+ 63                    initialized at a different vertex which produces slightly
+ 64                    different rings. The final skeleton is produced from a mean
+ 65                    across all waves. More waves produce higher resolution
+ 66                    skeletons but also introduce more noise.
+ 67    origins :       int | list of ints, optional
+ 68                    Vertex ID(s) where the wave(s) are initialized. If we run
+ 69                    out of origins (either because less `origins` than `waves`
+ 70                    or because no origin for one of the connected components)
+ 71                    will fall back to semi-random origin.
+ 72    step_size :     int
+ 73                    Values greater 1 effectively lead to binning of rings. For
+ 74                    example a stepsize of 2 means that two adjacent vertex rings
+ 75                    will be collapsed to the same center. This can help reduce
+ 76                    noise in the skeleton (and as such counteracts a large
+ 77                    number of waves).
+ 78    radius_agg :    "mean" | "median" | "max" | "min" | "percentile75" | "percentile25"
+ 79                    Function used to aggregate radii over sample (i.e. the
+ 80                    vertices forming a ring that we collapse to its center).
+ 81    progress :      bool
+ 82                    If True, will show progress bar.
+ 83
+ 84    Returns
+ 85    -------
+ 86    skeletor.Skeleton
+ 87                    Holds results of the skeletonization and enables quick
+ 88                    visualization.
+ 89
+ 90    """
+ 91    agg_map = {'mean': np.mean, 'max': np.max, 'min': np.min,
+ 92               'median': np.median,
+ 93               'percentile75': lambda x: np.percentile(x, 75),
+ 94               'percentile25': lambda x: np.percentile(x, 25)}
+ 95    assert radius_agg in agg_map, f'Unknown `radius_agg`: "{radius_agg}"'
+ 96    rad_agg_func = agg_map[radius_agg]
+ 97
+ 98    mesh = make_trimesh(mesh, validate=False)
+ 99
+100    centers_final, radii_final, G = _cast_waves(mesh, waves=waves,
+101                                                origins=origins,
+102                                                step_size=step_size,
+103                                                rad_agg_func=rad_agg_func,
+104                                                progress=progress)
+105
+106    # Collapse vertices into nodes
+107    (node_centers,
+108     vertex_to_node_map) = np.unique(centers_final,
+109                                     return_inverse=True, axis=0)
+110
+111    # Map radii for individual vertices to the collapsed nodes
+112    # Using pandas is the fastest way here
+113    node_radii = pd.DataFrame()
+114    node_radii['node_id'] = vertex_to_node_map
+115    node_radii['radius'] = radii_final
+116    node_radii = node_radii.groupby('node_id').radius.apply(rad_agg_func).values
+117
+118    # Contract vertices
+119    G.contract_vertices(vertex_to_node_map)
+120
+121    # Remove self loops and duplicate edges
+122    G = G.simplify()
+123
+124    # Generate hierarchical tree
+125    el = np.array(G.get_edgelist())
+126
+127    if PRESERVE_BACKBONE:
+128        # Use the minimum radius between vertices in an edge
+129        weights_rad = np.vstack((node_radii[el[:, 0]],
+130                                 node_radii[el[:, 1]])).mean(axis=0)
+131
+132        # For each node generate a vector based on its immediate neighbors
+133        vect, alpha = dotprops(node_centers)
+134        weights_alpha = np.vstack((alpha[el[:, 0]],
+135                                   alpha[el[:, 1]])).mean(axis=0)
+136
+137        # Combine both which means we are most likely to cut at small branches
+138        # outside of the backbone
+139        weights = weights_rad * weights_alpha
+140
+141        # MST doesn't like 0 for weights
+142        weights[weights <= 0] = weights[weights > 0].min() / 2
+143
+144    else:
+145        weights = np.linalg.norm(node_centers[el[:, 0]] - node_centers[el[:, 1]], axis=1)
+146    tree = G.spanning_tree(weights=1 / weights)
+147
+148    # Create a directed acyclic and hierarchical graph
+149    G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()),
+150                          nodes=np.arange(0, len(G.vs)),
+151                          fix_tree=True,  # this makes sure graph is oriented
+152                          drop_disconnected=False)
+153
+154    # Generate the SWC table
+155    swc = make_swc(G_nx, coords=node_centers, reindex=False, validate=True)
+156    swc['radius'] = node_radii[swc.node_id.values]
+157    _, new_ids = reindex_swc(swc, inplace=True)
+158
+159    # Update vertex to node ID map
+160    vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map])
+161
+162    return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map,
+163                    method='wavefront')
+
-
- View Source -
def by_wavefront(mesh,
-                 waves=1,
-                 origins=None,
-                 step_size=1,
-                 radius_agg='mean',
-                 progress=True):
-    """Skeletonize a mesh using wave fronts.
-
-    The algorithm tries to find rings of vertices and collapse them to
-    their center. This is done by propagating a wave across the mesh starting at
-    a single seed vertex. As the wave travels across the mesh we keep track of
-    which vertices are are encountered at each step. Groups of connected
-    vertices that are "hit" by the wave at the same time are considered rings
-    and subsequently collapsed. By its nature this works best with tubular meshes.
-
-    Parameters
-    ----------
-    mesh :          mesh obj
-                    The mesh to be skeletonize. Can an object that has
-                    ``.vertices`` and ``.faces`` properties  (e.g. a
-                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
-                    dictionary ``{'vertices': vertices, 'faces': faces}``.
-    waves :         int
-                    Number of waves to run across the mesh. Each wave is
-                    initialized at a different vertex which produces slightly
-                    different rings. The final skeleton is produced from a mean
-                    across all waves. More waves produce higher resolution
-                    skeletons but also introduce more noise.
-    origins :       int | list of ints, optional
-                    Vertex ID(s) where the wave(s) are initialized. If we run
-                    out of origins (either because less `origins` than `waves`
-                    or because no origin for one of the connected components)
-                    will fall back to semi-random origin.
-    step_size :     int
-                    Values greater 1 effectively lead to binning of rings. For
-                    example a stepsize of 2 means that two adjacent vertex rings
-                    will be collapsed to the same center. This can help reduce
-                    noise in the skeleton (and as such counteracts a large
-                    number of waves).
-    radius_agg :    "mean" | "median" | "max" | "min" | "percentile75" | "percentile25"
-                    Function used to aggregate radii over sample (i.e. the
-                    vertices forming a ring that we collapse to its center).
-    progress :      bool
-                    If True, will show progress bar.
-
-    Returns
-    -------
-    skeletor.Skeleton
-                    Holds results of the skeletonization and enables quick
-                    visualization.
-
-    """
-    agg_map = {'mean': np.mean, 'max': np.max, 'min': np.min,
-               'median': np.median,
-               'percentile75': lambda x: np.percentile(x, 75),
-               'percentile25': lambda x: np.percentile(x, 25)}
-    assert radius_agg in agg_map, f'Unknown `radius_agg`: "{radius_agg}"'
-    rad_agg_func = agg_map[radius_agg]
-
-    mesh = make_trimesh(mesh, validate=False)
-
-    centers_final, radii_final, G = _cast_waves(mesh, waves=waves,
-                                                origins=origins,
-                                                step_size=step_size,
-                                                rad_agg_func=rad_agg_func,
-                                                progress=progress)
-
-    # Collapse vertices into nodes
-    (node_centers,
-     vertex_to_node_map) = np.unique(centers_final,
-                                     return_inverse=True, axis=0)
-
-    # Map radii for individual vertices to the collapsed nodes
-    # Using pandas is the fastest way here
-    node_radii = pd.DataFrame()
-    node_radii['node_id'] = vertex_to_node_map
-    node_radii['radius'] = radii_final
-    node_radii = node_radii.groupby('node_id').radius.apply(rad_agg_func).values
-
-    # Contract vertices
-    G.contract_vertices(vertex_to_node_map)
-
-    # Remove self loops and duplicate edges
-    G = G.simplify()
-
-    # Generate hierarchical tree
-    el = np.array(G.get_edgelist())
-
-    if PRESERVE_BACKBONE:
-        # Use the minimum radius between vertices in an edge
-        weights_rad = np.vstack((node_radii[el[:, 0]],
-                                 node_radii[el[:, 1]])).mean(axis=0)
-
-        # For each node generate a vector based on its immediate neighbors
-        vect, alpha = dotprops(node_centers)
-        weights_alpha = np.vstack((alpha[el[:, 0]],
-                                   alpha[el[:, 1]])).mean(axis=0)
-
-        # Combine both which means we are most likely to cut at small branches
-        # outside of the backbone
-        weights = weights_rad * weights_alpha
-
-        # MST doesn't like 0 for weights
-        weights[weights <= 0] = weights[weights > 0].min() / 2
-
-    else:
-        weights = np.linalg.norm(node_centers[el[:, 0]] - node_centers[el[:, 1]], axis=1)
-    tree = G.spanning_tree(weights=1 / weights)
-
-    # Create a directed acyclic and hierarchical graph
-    G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()),
-                          nodes=np.arange(0, len(G.vs)),
-                          fix_tree=True,  # this makes sure graph is oriented
-                          drop_disconnected=False)
-
-    # Generate the SWC table
-    swc = make_swc(G_nx, coords=node_centers, reindex=False, validate=True)
-    swc['radius'] = node_radii[swc.node_id.values]
-    _, new_ids = reindex_swc(swc, inplace=True)
-
-    # Update vertex to node ID map
-    vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map])
-
-    return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map,
-                    method='wavefront')
-
- -

Skeletonize a mesh using wave fronts.

@@ -638,174 +632,174 @@
Returns
-
#   + +
+ + def + by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True) + + - - def - by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True):
+ +
 40def by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True):
+ 41    """Skeletonize a (contracted) mesh by clustering vertices.
+ 42
+ 43    The algorithm traverses the mesh graph and groups vertices together that
+ 44    are within a given distance to each other. This uses the geodesic
+ 45    (along-the-mesh) distance, not simply the Eucledian distance. Subsequently
+ 46    these groups of vertices are collapsed and re-connected respecting the
+ 47    topology of the input mesh.
+ 48
+ 49    The graph traversal is fast and scales well, so this method is well suited
+ 50    for meshes with lots of vertices. On the downside: this implementation is
+ 51    not very clever and you might have to play around with the parameters
+ 52    (mostly ``sampling_dist``) to get decent results.
+ 53
+ 54    Parameters
+ 55    ----------
+ 56    mesh :          mesh obj
+ 57                    The mesh to be skeletonize. Can an object that has
+ 58                    ``.vertices`` and ``.faces`` properties  (e.g. a
+ 59                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
+ 60                    dictionary ``{'vertices': vertices, 'faces': faces}``.
+ 61    sampling_dist : float | int
+ 62                    Maximal distance at which vertices are clustered. This
+ 63                    parameter should be tuned based on the resolution of your
+ 64                    mesh (see Examples).
+ 65    cluster_pos :   "median" | "center"
+ 66                    How to determine the x/y/z coordinates of the collapsed
+ 67                    vertex clusters (i.e. the skeleton's nodes)::
+ 68
+ 69                      - "median": Use the vertex closest to cluster's center of
+ 70                        mass.
+ 71                      - "center": Use the center of mass. This makes for smoother
+ 72                        skeletons but can lead to nodes outside the mesh.
+ 73    progress :      bool
+ 74                    If True, will show progress bar.
+ 75
+ 76    Examples
+ 77    --------
+ 78    >>> import skeletor as sk
+ 79    >>> mesh = sk.example_mesh()
+ 80    >>> cont = sk.pre.contract(mesh, epsilon=0.1)
+ 81    >>> skel = sk.skeletonize.vertex_cluster(cont)
+ 82    >>> skel.mesh = mesh
+ 83
+ 84    Returns
+ 85    -------
+ 86    skeletor.Skeleton
+ 87                    Holds results of the skeletonization and enables quick
+ 88                    visualization.
+ 89
+ 90    """
+ 91    assert cluster_pos in ['center', 'median']
+ 92
+ 93    mesh = make_trimesh(mesh, validate=False)
+ 94
+ 95    # Produce weighted edges
+ 96    edges = np.concatenate((mesh.edges_unique,
+ 97                            mesh.edges_unique_length.reshape(mesh.edges_unique.shape[0], 1)),
+ 98                           axis=1)
+ 99
+100    # Generate Graph (must be undirected)
+101    G = nx.Graph()
+102    G.add_weighted_edges_from(edges)
+103
+104    # Run the graph traversal that groups vertices into spatial clusters
+105    not_visited = set(G.nodes)
+106    seen = set()
+107    clusters = []
+108    to_visit = len(not_visited)
+109    with tqdm(desc='Clustering', total=len(not_visited), disable=progress is False) as pbar:
+110        while not_visited:
+111            # Pick a random node
+112            start = not_visited.pop()
+113            # Get all nodes in the geodesic vicinity
+114            cl, seen = dfs(G, n=start, dist_traveled=0,
+115                           max_dist=sampling_dist, seen=seen)
+116            cl = set(cl)
+117
+118            # Append this cluster and track visited/not-visited nodes
+119            clusters.append(cl)
+120            not_visited = not_visited - cl
+121
+122            # Update  progress bar
+123            pbar.update(to_visit - len(not_visited))
+124            to_visit = len(not_visited)
+125
+126    # `clusters` is a list of sets -> let's turn it into list of arrays
+127    clusters = [np.array(list(c)).astype(int) for c in clusters]
+128
+129    # Get positions of clusters
+130    if cluster_pos == 'center':
+131        # Get the center of each cluster
+132        cl_coords = np.array([np.mean(mesh.vertices[c], axis=0) for c in clusters])
+133    elif cluster_pos == 'median':
+134        # Get the node that's closest to to the clusters center
+135        cl_coords = []
+136        for c in clusters:
+137            cnt = np.mean(mesh.vertices[c], axis=0)
+138            cnt_dist = np.sum(np.fabs(mesh.vertices[c] - cnt), axis=1)
+139            median = mesh.vertices[c][np.argmin(cnt_dist)]
+140            cl_coords.append(median)
+141        cl_coords = np.array(cl_coords)
+142
+143    # Generate edges
+144    cl_edges = np.array(mesh.edges_unique)
+145    if fastremap:
+146        mapping = {n: i for i, l in enumerate(clusters) for n in l}
+147        cl_edges = fastremap.remap(cl_edges, mapping, preserve_missing_labels=False, in_place=True)
+148    else:
+149        for i, c in enumerate(clusters):
+150            cl_edges[np.isin(cl_edges, c)] = i
+151
+152    # Remove directionality from cluster edges
+153    cl_edges = np.sort(cl_edges, axis=1)
+154
+155    # Get unique edges
+156    cl_edges = np.unique(cl_edges, axis=0)
+157
+158    # Calculate edge lengths
+159    co1 = cl_coords[cl_edges[:, 0]]
+160    co2 = cl_coords[cl_edges[:, 1]]
+161    cl_edge_lengths = np.sqrt(np.sum((co1 - co2)**2, axis=1))
+162
+163    # Produce adjacency matrix from edges and edge lengths
+164    n_clusters = len(clusters)
+165    adj = scipy.sparse.coo_matrix((cl_edge_lengths,
+166                                   (cl_edges[:, 0], cl_edges[:, 1])),
+167                                  shape=(n_clusters, n_clusters))
+168
+169    # The cluster graph likely still contain cycles, let's get rid of them using
+170    # a minimum spanning tree
+171    mst = scipy.sparse.csgraph.minimum_spanning_tree(adj,
+172                                                     overwrite=True)
+173
+174    # Turn into COO matrix
+175    coo = mst.tocoo()
+176
+177    # Extract edge list
+178    edges = np.array([coo.row, coo.col]).T
+179
+180    # Produce final graph - this also takes care of some fixing
+181    G = edges_to_graph(edges, nodes=np.unique(cl_edges.flatten()),
+182                       drop_disconnected=False, fix_tree=True)
+183
+184    # Generate a mesh vertex -> skeleton vertex map
+185    # Note that nodes are labeled by index of the cluster
+186    vertex_to_node_map = [i for i, cl in enumerate(clusters) for n in cl]
+187
+188    # Generate SWC
+189    swc, new_ids = make_swc(G, cl_coords, reindex=True, validate=False)
+190
+191    # Update mesh map
+192    vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map])
+193
+194    return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map,
+195                    method='vertex_clusters')
+
-
- View Source -
def by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True):
-    """Skeletonize a (contracted) mesh by clustering vertices.
-
-    The algorithm traverses the mesh graph and groups vertices together that
-    are within a given distance to each other. This uses the geodesic
-    (along-the-mesh) distance, not simply the Eucledian distance. Subsequently
-    these groups of vertices are collapsed and re-connected respecting the
-    topology of the input mesh.
-
-    The graph traversal is fast and scales well, so this method is well suited
-    for meshes with lots of vertices. On the downside: this implementation is
-    not very clever and you might have to play around with the parameters
-    (mostly ``sampling_dist``) to get decent results.
-
-    Parameters
-    ----------
-    mesh :          mesh obj
-                    The mesh to be skeletonize. Can an object that has
-                    ``.vertices`` and ``.faces`` properties  (e.g. a
-                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
-                    dictionary ``{'vertices': vertices, 'faces': faces}``.
-    sampling_dist : float | int
-                    Maximal distance at which vertices are clustered. This
-                    parameter should be tuned based on the resolution of your
-                    mesh (see Examples).
-    cluster_pos :   "median" | "center"
-                    How to determine the x/y/z coordinates of the collapsed
-                    vertex clusters (i.e. the skeleton's nodes)::
-
-                      - "median": Use the vertex closest to cluster's center of
-                        mass.
-                      - "center": Use the center of mass. This makes for smoother
-                        skeletons but can lead to nodes outside the mesh.
-    progress :      bool
-                    If True, will show progress bar.
-
-    Examples
-    --------
-    >>> import skeletor as sk
-    >>> mesh = sk.example_mesh()
-    >>> cont = sk.pre.contract(mesh, epsilon=0.1)
-    >>> skel = sk.skeletonize.vertex_cluster(cont)
-    >>> skel.mesh = mesh
-
-    Returns
-    -------
-    skeletor.Skeleton
-                    Holds results of the skeletonization and enables quick
-                    visualization.
-
-    """
-    assert cluster_pos in ['center', 'median']
-
-    mesh = make_trimesh(mesh, validate=False)
-
-    # Produce weighted edges
-    edges = np.concatenate((mesh.edges_unique,
-                            mesh.edges_unique_length.reshape(mesh.edges_unique.shape[0], 1)),
-                           axis=1)
-
-    # Generate Graph (must be undirected)
-    G = nx.Graph()
-    G.add_weighted_edges_from(edges)
-
-    # Run the graph traversal that groups vertices into spatial clusters
-    not_visited = set(G.nodes)
-    seen = set()
-    clusters = []
-    to_visit = len(not_visited)
-    with tqdm(desc='Clustering', total=len(not_visited), disable=progress is False) as pbar:
-        while not_visited:
-            # Pick a random node
-            start = not_visited.pop()
-            # Get all nodes in the geodesic vicinity
-            cl, seen = dfs(G, n=start, dist_traveled=0,
-                           max_dist=sampling_dist, seen=seen)
-            cl = set(cl)
-
-            # Append this cluster and track visited/not-visited nodes
-            clusters.append(cl)
-            not_visited = not_visited - cl
-
-            # Update  progress bar
-            pbar.update(to_visit - len(not_visited))
-            to_visit = len(not_visited)
-
-    # `clusters` is a list of sets -> let's turn it into list of arrays
-    clusters = [np.array(list(c)).astype(int) for c in clusters]
-
-    # Get positions of clusters
-    if cluster_pos == 'center':
-        # Get the center of each cluster
-        cl_coords = np.array([np.mean(mesh.vertices[c], axis=0) for c in clusters])
-    elif cluster_pos == 'median':
-        # Get the node that's closest to to the clusters center
-        cl_coords = []
-        for c in clusters:
-            cnt = np.mean(mesh.vertices[c], axis=0)
-            cnt_dist = np.sum(np.fabs(mesh.vertices[c] - cnt), axis=1)
-            median = mesh.vertices[c][np.argmin(cnt_dist)]
-            cl_coords.append(median)
-        cl_coords = np.array(cl_coords)
-
-    # Generate edges
-    cl_edges = np.array(mesh.edges_unique)
-    if fastremap:
-        mapping = {n: i for i, l in enumerate(clusters) for n in l}
-        cl_edges = fastremap.remap(cl_edges, mapping, preserve_missing_labels=False, in_place=True)
-    else:
-        for i, c in enumerate(clusters):
-            cl_edges[np.isin(cl_edges, c)] = i
-
-    # Remove directionality from cluster edges
-    cl_edges = np.sort(cl_edges, axis=1)
-
-    # Get unique edges
-    cl_edges = np.unique(cl_edges, axis=0)
-
-    # Calculate edge lengths
-    co1 = cl_coords[cl_edges[:, 0]]
-    co2 = cl_coords[cl_edges[:, 1]]
-    cl_edge_lengths = np.sqrt(np.sum((co1 - co2)**2, axis=1))
-
-    # Produce adjacency matrix from edges and edge lengths
-    n_clusters = len(clusters)
-    adj = scipy.sparse.coo_matrix((cl_edge_lengths,
-                                   (cl_edges[:, 0], cl_edges[:, 1])),
-                                  shape=(n_clusters, n_clusters))
-
-    # The cluster graph likely still contain cycles, let's get rid of them using
-    # a minimum spanning tree
-    mst = scipy.sparse.csgraph.minimum_spanning_tree(adj,
-                                                     overwrite=True)
-
-    # Turn into COO matrix
-    coo = mst.tocoo()
-
-    # Extract edge list
-    edges = np.array([coo.row, coo.col]).T
-
-    # Produce final graph - this also takes care of some fixing
-    G = edges_to_graph(edges, nodes=np.unique(cl_edges.flatten()),
-                       drop_disconnected=False, fix_tree=True)
-
-    # Generate a mesh vertex -> skeleton vertex map
-    # Note that nodes are labeled by index of the cluster
-    vertex_to_node_map = [i for i, cl in enumerate(clusters) for n in cl]
-
-    # Generate SWC
-    swc, new_ids = make_swc(G, cl_coords, reindex=True, validate=False)
-
-    # Update mesh map
-    vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map])
-
-    return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map,
-                    method='vertex_clusters')
-
- -

Skeletonize a (contracted) mesh by clustering vertices.

@@ -866,341 +860,341 @@
Returns
-
#   + +
+ + def + by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True) + + - - def - by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True):
+ +
 38def by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True):
+ 39    """Skeletonize a (contracted) mesh by iteratively collapsing edges.
+ 40
+ 41    This algorithm (described in [1]) iteratively collapses edges that are part
+ 42    of a face until no more faces are left. Edges are chosen based on a cost
+ 43    function that penalizes collapses that would change the shape of the object
+ 44    or would introduce long edges.
+ 45
+ 46    This is somewhat sensitive to the dimensions of the input mesh: too large
+ 47    and you might experience slow-downs or numpy OverflowErrors; too low and
+ 48    you might get skeletons that don't quite match the mesh (e.g. too few nodes).
+ 49    If you experience either, try down- or up-scaling your mesh, respectively.
+ 50
+ 51    Parameters
+ 52    ----------
+ 53    mesh :          mesh obj
+ 54                    The mesh to be skeletonize. Can an object that has
+ 55                    ``.vertices`` and ``.faces`` properties  (e.g. a
+ 56                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
+ 57                    dictionary ``{'vertices': vertices, 'faces': faces}``.
+ 58    shape_weight :  float, optional
+ 59                    Weight for shape costs which penalize collapsing edges that
+ 60                    would drastically change the shape of the object.
+ 61    sample_weight : float, optional
+ 62                    Weight for sampling costs which penalize collapses that
+ 63                    would generate prohibitively long edges.
+ 64    progress :      bool
+ 65                    If True, will show progress bar.
+ 66
+ 67    Returns
+ 68    -------
+ 69    skeletor.Skeleton
+ 70                    Holds results of the skeletonization and enables quick
+ 71                    visualization.
+ 72
+ 73    References
+ 74    ----------
+ 75    [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh
+ 76        contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
+ 77
+ 78    """
+ 79    mesh = make_trimesh(mesh, validate=False)
+ 80
+ 81    # Shorthand faces and edges
+ 82    # We convert to arrays to (a) make a copy and (b) remove potential overhead
+ 83    # from these originally being trimesh TrackedArrays
+ 84    edges = np.array(mesh.edges_unique)
+ 85    verts = np.array(mesh.vertices)
+ 86
+ 87    # For cost calculations we will normalise coordinates
+ 88    # This prevents getting ridiculuously large cost values ?e300
+ 89    # verts = (verts - verts.min()) / (verts.max() - verts.min())
+ 90    edge_lengths = np.sqrt(np.sum((verts[edges[:, 0]] - verts[edges[:, 1]])**2, axis=1))
+ 91
+ 92    # Get a list of faces: [(edge1, edge2, edge3), ...]
+ 93    face_edges = np.array(mesh.faces_unique_edges)
+ 94    # Make sure these faces are unique, i.e. no [(e1, e2, e3), (e3, e2, e1)]
+ 95    face_edges = np.unique(np.sort(face_edges, axis=1), axis=0)
+ 96
+ 97    # Shape cost initialisation:
+ 98    # Each vertex has a matrix Q which is used to determine the shape cost
+ 99    # of collapsing each node. We need to generate a matrix (Q) for each
+100    # vertex, then when we collapse two nodes, we can update using
+101    # Qj <- Qi + Qj, so the edges previously associated with vertex i
+102    # are now associated with vertex j.
+103
+104    # For each edge, generate a matrix (K). K is made up of two sets of
+105    # coordinates in 3D space, a and b. a is the normalised edge vector
+106    # of edge(i,j) and b = a * <x/y/z coordinates of vertex i>
+107    #
+108    # The matrix K takes the form:
+109    #
+110    #        Kij = 0, -az, ay, -bx
+111    #              az, 0, -ax, -by
+112    #             -ay, ax, 0,  -bz
+113
+114    edge_co0, edge_co1 = verts[edges[:, 0]], verts[edges[:, 1]]
+115    a = (edge_co1 - edge_co0) / edge_lengths.reshape(edges.shape[0], 1)
+116    # Note: It's a bit unclear to me whether the normalised edge vector should
+117    # be allowed to have negative values but I seem to be getting better
+118    # results if I use absolute values
+119    a = np.fabs(a)
+120    b = a * edge_co0
+121
+122    # Bunch of zeros
+123    zero = np.zeros(a.shape[0])
+124
+125    # Generate matrix K
+126    K = [[zero,    -a[:, 2], a[:, 1],    -b[:, 0]],
+127         [a[:, 2],  zero,    -a[:, 0],   -b[:, 1]],
+128         [-a[:, 1], a[:, 0], zero,       -b[:, 2]]]
+129    K = np.array(K)
+130
+131    # Q for vertex i is then the sum of the products of (kT,k) for ALL edges
+132    # connected to vertex i:
+133    # Initialize matrix of correct shape
+134    Q_array = np.zeros((4, 4, verts.shape[0]), dtype=np.float64)
+135
+136    # Generate (kT, K)
+137    kT = np.transpose(K, axes=(1, 0, 2))
+138
+139    # To get the sum of the products in the correct format we have to
+140    # do some annoying transposes to get to (4, 4, len(edges))
+141    K_dot = np.matmul(K.T, kT.T).T
+142
+143    # Iterate over all vertices
+144    for v in range(len(verts)):
+145        # Find edges that contain this vertex
+146        cond1 = edges[:, 0] == v
+147        cond2 = edges[:, 1] == v
+148        # Note that this does not take directionality of edges into account
+149        # Not sure if that's intended?
+150
+151        # Get indices of these edges
+152        indices = np.where(cond1 | cond2)[0]
+153
+154        # Get the products for all edges adjacent to mesh
+155        Q = K_dot[:, :, indices]
+156        # Sum over all edges
+157        Q = Q.sum(axis=2)
+158        # Add to Q array
+159        Q_array[:, :, v] = Q
+160
+161    # Not sure if we are doing something wrong when calculating the Q array but
+162    # we end up having negative values which translate into negative scores.
+163    # This in turn is bad because we propagate that negative score when
+164    # collapsing edges which leads to a "zipper-effect" where nodes collapse
+165    # in sequence a->b->c->d until they hit some node with really high cost
+166    # Q_array -= Q_array.min()
+167
+168    # Edge collapse:
+169    # Determining which edge to collapse is a weighted sum of the shape and
+170    # sampling cost. The shape cost of vertex i is Fa(p) = pT Qi p where p is
+171    # the coordinates of point p (vertex i here) in homogeneous representation.
+172    # The variable w from above is the value for the homogeneous 4th dimension.
+173    # T denotes transpose of matrix.
+174    # The shape cost of collapsing the edge Fa(i,j) = Fi(vj) + Fj(vj).
+175    # vi and vj being the coordinates of the vertex in homogeneous representation
+176    # (p in equation before)
+177    # The sampling cost penalises edge collapses that generate overly long edges,
+178    # based on the distance traveled by all edges to vi, when vi is merged with
+179    # vj. (Eq. 7 in paper)
+180    # You cannot collapse an edge (i -> j) if k is a common adjacent vertex of
+181    # both i and j, but (i/j/k) is not a face.
+182    # We will set the cost of these edges to infinity.
+183
+184    # Now work out the shape cost of collapsing each node (eq. 7)
+185    # First get coordinates of the first node of each edge
+186    # Note that in Nik's implementation this was the second node
+187    p = verts[edges[:, 0]]
+188
+189    # Append weight factor
+190    w = 1
+191    p = np.append(p, np.full((p.shape[0], 1), w), axis=1)
+192
+193    this_Q1 = Q_array[:, :, edges[:, 0]]
+194    this_Q2 = Q_array[:, :, edges[:, 1]]
+195
+196    F1 = np.einsum('ij,kji->ij', p, this_Q1)[:, [0, 1]]
+197    F2 = np.einsum('ij,kji->ij', p, this_Q2)[:, [0, 1]]
+198
+199    # Calculate and append shape cost
+200    F = np.append(F1, F2, axis=1)
+201    shape_cost = np.sum(F, axis=1)
+202
+203    # Sum lengths of all edges associated with a given vertex
+204    # This is easiest by generating a sparse matrix from the edges
+205    # and then summing by row
+206    adj = scipy.sparse.coo_matrix((edge_lengths,
+207                                   (edges[:, 0], edges[:, 1])),
+208                                  shape=(verts.shape[0], verts.shape[0]))
+209
+210    # This makes sure the matrix is symmetrical, i.e. a->b == a<-b
+211    # Note that I'm not sure whether this is strictly necessary but it really
+212    # can't hurt
+213    adj = adj + adj.T
+214
+215    # Get the lengths associated with each vertex
+216    verts_lengths = adj.sum(axis=1)
+217
+218    # We need to flatten this (something funny with summing sparse matrices)
+219    verts_lengths = np.array(verts_lengths).flatten()
+220
+221    # Map the sum of vertex lengths onto edges (as per first vertex in edge)
+222    ik_edge = verts_lengths[edges[:, 0]]
+223
+224    # Calculate sampling cost
+225    sample_cost = edge_lengths * (ik_edge - edge_lengths)
+226
+227    # Determine which edge to collapse and collapse it
+228    # Total Cost - weighted sum of shape and sample cost, equation 8 in paper
+229    F_T = shape_cost * shape_weight + sample_cost * sample_weight
+230
+231    # Now start collapsing edges one at a time
+232    face_count = face_edges.shape[0]  # keep track of face counts for progress bar
+233    is_collapsed = np.full(edges.shape[0], False)
+234    keep = np.full(edges.shape[0], False)
+235    with tqdm(desc='Collapsing edges', total=face_count, disable=progress is False) as pbar:
+236        while face_edges.size:
+237            # Uncomment to get a more-or-less random edge collapse
+238            # F_T[:] = 0
+239
+240            # Update progress bar
+241            pbar.update(face_count - face_edges.shape[0])
+242            face_count = face_edges.shape[0]
+243
+244            # This has to come at the beginning of the loop
+245            # Set cost of collapsing edges without faces to infinite
+246            F_T[keep] = np.inf
+247            F_T[is_collapsed] = np.inf
+248
+249            # Get the edge that we want to collapse
+250            collapse_ix = np.argmin(F_T)
+251            # Get the vertices this edge connects
+252            u, v = edges[collapse_ix]
+253            # Get all edges that contain these vertices:
+254            # First, edges that are (uv, x)
+255            connects_uv = np.isin(edges[:, 0], [u, v])
+256            # Second, check if any (uv, x) edges are (uv, uv)
+257            connects_uv[connects_uv] = np.isin(edges[connects_uv, 1], [u, v])
+258
+259            # Remove uu and vv edges
+260            uuvv = edges[:, 0] == edges[:, 1]
+261            connects_uv = connects_uv & ~uuvv
+262            # Get the edge's indices
+263            clps_edges = np.where(connects_uv)[0]
+264
+265            # Now find find the faces the collapsed edge is part of
+266            # Note: splitting this into three conditions is marginally faster than
+267            # np.any(np.isin(face_edges, clps_edges), axis=1)
+268            uv0 = np.isin(face_edges[:, 0], clps_edges)
+269            uv1 = np.isin(face_edges[:, 1], clps_edges)
+270            uv2 = np.isin(face_edges[:, 2], clps_edges)
+271            has_uv = uv0 | uv1 | uv2
+272
+273            # If these edges do not have adjacent faces anymore
+274            if not np.any(has_uv):
+275                # Track this edge as a keeper
+276                keep[clps_edges] = True
+277                continue
+278
+279            # Get the collapsed faces [(e1, e2, e3), ...] for this edge
+280            clps_faces = face_edges[has_uv]
+281
+282            # Remove the collapsed faces
+283            face_edges = face_edges[~has_uv]
+284
+285            # Track these edges as collapsed
+286            is_collapsed[clps_edges] = True
+287
+288            # Get the adjacent edges (i.e. non-uv edges)
+289            adj_edges = clps_faces[~np.isin(clps_faces, clps_edges)].reshape(clps_faces.shape[0], 2)
+290
+291            # We have to do some sorting and finding unique edges to make sure
+292            # remapping is done correctly further down
+293            # NOTE: Not sure we really need this, so leaving it out for now
+294            # adj_edges = np.unique(np.sort(adj_edges, axis=1), axis=0)
+295
+296            # We need to keep track of changes to the adjacent faces
+297            # Basically each face in (i, j, k) will be reduced to one edge
+298            # which points from u -> v
+299            # -> replace occurrences of loosing edge with winning edge
+300            for win, loose in adj_edges:
+301                if fastremap:
+302                    face_edges = fastremap.remap(face_edges, {loose: win},
+303                                                 preserve_missing_labels=True,
+304                                                 in_place=True)
+305                else:
+306                    face_edges[face_edges == loose] = win
+307                is_collapsed[loose] = True
+308
+309            # Replace occurrences of first node u with second node v
+310            if fastremap:
+311                edges = fastremap.remap(edges, {u: v},
+312                                        preserve_missing_labels=True,
+313                                        in_place=True)
+314            else:
+315                edges[edges == u] = v
+316
+317            # Add shape cost of u to shape costs of v
+318            Q_array[:, :, v] += Q_array[:, :, u]
+319
+320            # Determine which edges require update of costs:
+321            # In theory we only need to update costs for edges that are
+322            # associated with vertices v and u (which now also v)
+323            has_v = (edges[:, 0] == v) | (edges[:, 1] == v)
+324
+325            # Uncomment to temporarily force updating costs for all edges
+326            # has_v[:] = True
+327
+328            # Update shape costs
+329            this_Q1 = Q_array[:, :, edges[has_v, 0]]
+330            this_Q2 = Q_array[:, :, edges[has_v, 1]]
+331
+332            F1 = np.einsum('ij,kji->ij', p[edges[has_v, 0]], this_Q1)[:, [0, 1]]
+333            F2 = np.einsum('ij,kji->ij', p[edges[has_v, 1]], this_Q2)[:, [0, 1]]
+334
+335            F = np.append(F1, F2, axis=1)
+336            new_shape_cost = np.sum(F, axis=1)
+337
+338            # Update sum of incoming edge lengths
+339            # Technically we would have to recalculate lengths of adjacent edges
+340            # every time but we will take the cheap way out and simply add them up
+341            verts_lengths[v] += verts_lengths[u]
+342            # Update sample costs for edges associated with v
+343            ik_edge = verts_lengths[edges[has_v, 0]]
+344            new_sample_cost = edge_lengths[has_v] * (ik_edge - edge_lengths[has_v])
+345
+346            F_T[has_v] = new_shape_cost * shape_weight + new_sample_cost * sample_weight
+347
+348    # After the edge collapse, the edges are garbled - I have yet to figure out
+349    # why and whether that can be prevented. However the vertices in those
+350    # edges are correct and so we just need to reconstruct their connectivity
+351    # by extracting a minimum spanning tree over the mesh.
+352    corrected_edges = mst_over_mesh(mesh, edges[keep].flatten())
+353
+354    # Generate graph
+355    G = edges_to_graph(corrected_edges, vertices=mesh.vertices, fix_tree=True,
+356                       weight=False, drop_disconnected=False)
+357
+358    swc, new_ids = make_swc(G, mesh, reindex=True)
+359
+360    return Skeleton(swc=swc, mesh=mesh, mesh_map=None, method='edge_collapse')
+
-
- View Source -
def by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True):
-    """Skeletonize a (contracted) mesh by iteratively collapsing edges.
-
-    This algorithm (described in [1]) iteratively collapses edges that are part
-    of a face until no more faces are left. Edges are chosen based on a cost
-    function that penalizes collapses that would change the shape of the object
-    or would introduce long edges.
-
-    This is somewhat sensitive to the dimensions of the input mesh: too large
-    and you might experience slow-downs or numpy OverflowErrors; too low and
-    you might get skeletons that don't quite match the mesh (e.g. too few nodes).
-    If you experience either, try down- or up-scaling your mesh, respectively.
-
-    Parameters
-    ----------
-    mesh :          mesh obj
-                    The mesh to be skeletonize. Can an object that has
-                    ``.vertices`` and ``.faces`` properties  (e.g. a
-                    trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
-                    dictionary ``{'vertices': vertices, 'faces': faces}``.
-    shape_weight :  float, optional
-                    Weight for shape costs which penalize collapsing edges that
-                    would drastically change the shape of the object.
-    sample_weight : float, optional
-                    Weight for sampling costs which penalize collapses that
-                    would generate prohibitively long edges.
-    progress :      bool
-                    If True, will show progress bar.
-
-    Returns
-    -------
-    skeletor.Skeleton
-                    Holds results of the skeletonization and enables quick
-                    visualization.
-
-    References
-    ----------
-    [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh
-        contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
-
-    """
-    mesh = make_trimesh(mesh, validate=False)
-
-    # Shorthand faces and edges
-    # We convert to arrays to (a) make a copy and (b) remove potential overhead
-    # from these originally being trimesh TrackedArrays
-    edges = np.array(mesh.edges_unique)
-    verts = np.array(mesh.vertices)
-
-    # For cost calculations we will normalise coordinates
-    # This prevents getting ridiculuously large cost values ?e300
-    # verts = (verts - verts.min()) / (verts.max() - verts.min())
-    edge_lengths = np.sqrt(np.sum((verts[edges[:, 0]] - verts[edges[:, 1]])**2, axis=1))
-
-    # Get a list of faces: [(edge1, edge2, edge3), ...]
-    face_edges = np.array(mesh.faces_unique_edges)
-    # Make sure these faces are unique, i.e. no [(e1, e2, e3), (e3, e2, e1)]
-    face_edges = np.unique(np.sort(face_edges, axis=1), axis=0)
-
-    # Shape cost initialisation:
-    # Each vertex has a matrix Q which is used to determine the shape cost
-    # of collapsing each node. We need to generate a matrix (Q) for each
-    # vertex, then when we collapse two nodes, we can update using
-    # Qj <- Qi + Qj, so the edges previously associated with vertex i
-    # are now associated with vertex j.
-
-    # For each edge, generate a matrix (K). K is made up of two sets of
-    # coordinates in 3D space, a and b. a is the normalised edge vector
-    # of edge(i,j) and b = a * <x/y/z coordinates of vertex i>
-    #
-    # The matrix K takes the form:
-    #
-    #        Kij = 0, -az, ay, -bx
-    #              az, 0, -ax, -by
-    #             -ay, ax, 0,  -bz
-
-    edge_co0, edge_co1 = verts[edges[:, 0]], verts[edges[:, 1]]
-    a = (edge_co1 - edge_co0) / edge_lengths.reshape(edges.shape[0], 1)
-    # Note: It's a bit unclear to me whether the normalised edge vector should
-    # be allowed to have negative values but I seem to be getting better
-    # results if I use absolute values
-    a = np.fabs(a)
-    b = a * edge_co0
-
-    # Bunch of zeros
-    zero = np.zeros(a.shape[0])
-
-    # Generate matrix K
-    K = [[zero,    -a[:, 2], a[:, 1],    -b[:, 0]],
-         [a[:, 2],  zero,    -a[:, 0],   -b[:, 1]],
-         [-a[:, 1], a[:, 0], zero,       -b[:, 2]]]
-    K = np.array(K)
-
-    # Q for vertex i is then the sum of the products of (kT,k) for ALL edges
-    # connected to vertex i:
-    # Initialize matrix of correct shape
-    Q_array = np.zeros((4, 4, verts.shape[0]), dtype=np.float64)
-
-    # Generate (kT, K)
-    kT = np.transpose(K, axes=(1, 0, 2))
-
-    # To get the sum of the products in the correct format we have to
-    # do some annoying transposes to get to (4, 4, len(edges))
-    K_dot = np.matmul(K.T, kT.T).T
-
-    # Iterate over all vertices
-    for v in range(len(verts)):
-        # Find edges that contain this vertex
-        cond1 = edges[:, 0] == v
-        cond2 = edges[:, 1] == v
-        # Note that this does not take directionality of edges into account
-        # Not sure if that's intended?
-
-        # Get indices of these edges
-        indices = np.where(cond1 | cond2)[0]
-
-        # Get the products for all edges adjacent to mesh
-        Q = K_dot[:, :, indices]
-        # Sum over all edges
-        Q = Q.sum(axis=2)
-        # Add to Q array
-        Q_array[:, :, v] = Q
-
-    # Not sure if we are doing something wrong when calculating the Q array but
-    # we end up having negative values which translate into negative scores.
-    # This in turn is bad because we propagate that negative score when
-    # collapsing edges which leads to a "zipper-effect" where nodes collapse
-    # in sequence a->b->c->d until they hit some node with really high cost
-    # Q_array -= Q_array.min()
-
-    # Edge collapse:
-    # Determining which edge to collapse is a weighted sum of the shape and
-    # sampling cost. The shape cost of vertex i is Fa(p) = pT Qi p where p is
-    # the coordinates of point p (vertex i here) in homogeneous representation.
-    # The variable w from above is the value for the homogeneous 4th dimension.
-    # T denotes transpose of matrix.
-    # The shape cost of collapsing the edge Fa(i,j) = Fi(vj) + Fj(vj).
-    # vi and vj being the coordinates of the vertex in homogeneous representation
-    # (p in equation before)
-    # The sampling cost penalises edge collapses that generate overly long edges,
-    # based on the distance traveled by all edges to vi, when vi is merged with
-    # vj. (Eq. 7 in paper)
-    # You cannot collapse an edge (i -> j) if k is a common adjacent vertex of
-    # both i and j, but (i/j/k) is not a face.
-    # We will set the cost of these edges to infinity.
-
-    # Now work out the shape cost of collapsing each node (eq. 7)
-    # First get coordinates of the first node of each edge
-    # Note that in Nik's implementation this was the second node
-    p = verts[edges[:, 0]]
-
-    # Append weight factor
-    w = 1
-    p = np.append(p, np.full((p.shape[0], 1), w), axis=1)
-
-    this_Q1 = Q_array[:, :, edges[:, 0]]
-    this_Q2 = Q_array[:, :, edges[:, 1]]
-
-    F1 = np.einsum('ij,kji->ij', p, this_Q1)[:, [0, 1]]
-    F2 = np.einsum('ij,kji->ij', p, this_Q2)[:, [0, 1]]
-
-    # Calculate and append shape cost
-    F = np.append(F1, F2, axis=1)
-    shape_cost = np.sum(F, axis=1)
-
-    # Sum lengths of all edges associated with a given vertex
-    # This is easiest by generating a sparse matrix from the edges
-    # and then summing by row
-    adj = scipy.sparse.coo_matrix((edge_lengths,
-                                   (edges[:, 0], edges[:, 1])),
-                                  shape=(verts.shape[0], verts.shape[0]))
-
-    # This makes sure the matrix is symmetrical, i.e. a->b == a<-b
-    # Note that I'm not sure whether this is strictly necessary but it really
-    # can't hurt
-    adj = adj + adj.T
-
-    # Get the lengths associated with each vertex
-    verts_lengths = adj.sum(axis=1)
-
-    # We need to flatten this (something funny with summing sparse matrices)
-    verts_lengths = np.array(verts_lengths).flatten()
-
-    # Map the sum of vertex lengths onto edges (as per first vertex in edge)
-    ik_edge = verts_lengths[edges[:, 0]]
-
-    # Calculate sampling cost
-    sample_cost = edge_lengths * (ik_edge - edge_lengths)
-
-    # Determine which edge to collapse and collapse it
-    # Total Cost - weighted sum of shape and sample cost, equation 8 in paper
-    F_T = shape_cost * shape_weight + sample_cost * sample_weight
-
-    # Now start collapsing edges one at a time
-    face_count = face_edges.shape[0]  # keep track of face counts for progress bar
-    is_collapsed = np.full(edges.shape[0], False)
-    keep = np.full(edges.shape[0], False)
-    with tqdm(desc='Collapsing edges', total=face_count, disable=progress is False) as pbar:
-        while face_edges.size:
-            # Uncomment to get a more-or-less random edge collapse
-            # F_T[:] = 0
-
-            # Update progress bar
-            pbar.update(face_count - face_edges.shape[0])
-            face_count = face_edges.shape[0]
-
-            # This has to come at the beginning of the loop
-            # Set cost of collapsing edges without faces to infinite
-            F_T[keep] = np.inf
-            F_T[is_collapsed] = np.inf
-
-            # Get the edge that we want to collapse
-            collapse_ix = np.argmin(F_T)
-            # Get the vertices this edge connects
-            u, v = edges[collapse_ix]
-            # Get all edges that contain these vertices:
-            # First, edges that are (uv, x)
-            connects_uv = np.isin(edges[:, 0], [u, v])
-            # Second, check if any (uv, x) edges are (uv, uv)
-            connects_uv[connects_uv] = np.isin(edges[connects_uv, 1], [u, v])
-
-            # Remove uu and vv edges
-            uuvv = edges[:, 0] == edges[:, 1]
-            connects_uv = connects_uv & ~uuvv
-            # Get the edge's indices
-            clps_edges = np.where(connects_uv)[0]
-
-            # Now find find the faces the collapsed edge is part of
-            # Note: splitting this into three conditions is marginally faster than
-            # np.any(np.isin(face_edges, clps_edges), axis=1)
-            uv0 = np.isin(face_edges[:, 0], clps_edges)
-            uv1 = np.isin(face_edges[:, 1], clps_edges)
-            uv2 = np.isin(face_edges[:, 2], clps_edges)
-            has_uv = uv0 | uv1 | uv2
-
-            # If these edges do not have adjacent faces anymore
-            if not np.any(has_uv):
-                # Track this edge as a keeper
-                keep[clps_edges] = True
-                continue
-
-            # Get the collapsed faces [(e1, e2, e3), ...] for this edge
-            clps_faces = face_edges[has_uv]
-
-            # Remove the collapsed faces
-            face_edges = face_edges[~has_uv]
-
-            # Track these edges as collapsed
-            is_collapsed[clps_edges] = True
-
-            # Get the adjacent edges (i.e. non-uv edges)
-            adj_edges = clps_faces[~np.isin(clps_faces, clps_edges)].reshape(clps_faces.shape[0], 2)
-
-            # We have to do some sorting and finding unique edges to make sure
-            # remapping is done correctly further down
-            # NOTE: Not sure we really need this, so leaving it out for now
-            # adj_edges = np.unique(np.sort(adj_edges, axis=1), axis=0)
-
-            # We need to keep track of changes to the adjacent faces
-            # Basically each face in (i, j, k) will be reduced to one edge
-            # which points from u -> v
-            # -> replace occurrences of loosing edge with winning edge
-            for win, loose in adj_edges:
-                if fastremap:
-                    face_edges = fastremap.remap(face_edges, {loose: win},
-                                                 preserve_missing_labels=True,
-                                                 in_place=True)
-                else:
-                    face_edges[face_edges == loose] = win
-                is_collapsed[loose] = True
-
-            # Replace occurrences of first node u with second node v
-            if fastremap:
-                edges = fastremap.remap(edges, {u: v},
-                                        preserve_missing_labels=True,
-                                        in_place=True)
-            else:
-                edges[edges == u] = v
-
-            # Add shape cost of u to shape costs of v
-            Q_array[:, :, v] += Q_array[:, :, u]
-
-            # Determine which edges require update of costs:
-            # In theory we only need to update costs for edges that are
-            # associated with vertices v and u (which now also v)
-            has_v = (edges[:, 0] == v) | (edges[:, 1] == v)
-
-            # Uncomment to temporarily force updating costs for all edges
-            # has_v[:] = True
-
-            # Update shape costs
-            this_Q1 = Q_array[:, :, edges[has_v, 0]]
-            this_Q2 = Q_array[:, :, edges[has_v, 1]]
-
-            F1 = np.einsum('ij,kji->ij', p[edges[has_v, 0]], this_Q1)[:, [0, 1]]
-            F2 = np.einsum('ij,kji->ij', p[edges[has_v, 1]], this_Q2)[:, [0, 1]]
-
-            F = np.append(F1, F2, axis=1)
-            new_shape_cost = np.sum(F, axis=1)
-
-            # Update sum of incoming edge lengths
-            # Technically we would have to recalculate lengths of adjacent edges
-            # every time but we will take the cheap way out and simply add them up
-            verts_lengths[v] += verts_lengths[u]
-            # Update sample costs for edges associated with v
-            ik_edge = verts_lengths[edges[has_v, 0]]
-            new_sample_cost = edge_lengths[has_v] * (ik_edge - edge_lengths[has_v])
-
-            F_T[has_v] = new_shape_cost * shape_weight + new_sample_cost * sample_weight
-
-    # After the edge collapse, the edges are garbled - I have yet to figure out
-    # why and whether that can be prevented. However the vertices in those
-    # edges are correct and so we just need to reconstruct their connectivity
-    # by extracting a minimum spanning tree over the mesh.
-    corrected_edges = mst_over_mesh(mesh, edges[keep].flatten())
-
-    # Generate graph
-    G = edges_to_graph(corrected_edges, vertices=mesh.vertices, fix_tree=True,
-                       weight=False, drop_disconnected=False)
-
-    swc, new_ids = make_swc(G, mesh, reindex=True)
-
-    return Skeleton(swc=swc, mesh=mesh, mesh_map=None, method='edge_collapse')
-
- -

Skeletonize a (contracted) mesh by iteratively collapsing edges.

@@ -1248,175 +1242,175 @@
References
-
#   + +
+ + def + by_tangent_ball(mesh) - - def - by_tangent_ball(mesh): -
+ -
- View Source -
def by_tangent_ball(mesh):
-    """Skeletonize a mesh by finding the maximal tangent ball.
-
-    This algorithm casts a ray from every mesh vertex along its inverse normals
-    (requires `ncollpyde`). It then creates a sphere that is tangent to the
-    vertex and to where the ray hit the inside of a face on the opposite side.
-    Next it drops spheres that overlap with another, larger sphere. Modified
-    from [1].
-
-    The method works best on smooth meshes and is rather sensitive to errors in
-    the mesh such as incorrect normals (see `skeletor.pre.fix_mesh`), internal
-    faces, noisy surface (try smoothing or downsampling) or holes in the mesh.
-
-    Parameters
-    ----------
-    mesh :              mesh obj
-                        The mesh to be skeletonize. Can an object that has
-                        ``.vertices`` and ``.faces`` properties  (e.g. a
-                        trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
-                        dictionary ``{'vertices': vertices, 'faces': faces}``.
-
-    Returns
-    -------
-    skeletor.Skeleton
-                        Holds results of the skeletonization and enables quick
-                        visualization.
-
-    Examples
-    --------
-    >>> import skeletor as sk
-    >>> mesh = sk.example_mesh()
-    >>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)
-    >>> skel = sk.skeletonize.by_tangent_ball(fixed)
-
-    References
-    ----------
-    [1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using
-        nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012).
-        https://doi.org/10.1007/s00371-011-0594-7
-
-    """
-    mesh = make_trimesh(mesh, validate=False)
-
-    # Generate the KD tree
-    tree = scipy.spatial.cKDTree(mesh.vertices)
-
-    dist = tree.query(mesh.vertices, k=2)[0][:, 1]
-
-    centers = np.zeros(mesh.vertices.shape)
-    radii = np.zeros(mesh.vertices.shape[0])
-
-    coll = ncollpyde.Volume(mesh.vertices, mesh.faces, validate=False)
-    sources = mesh.vertices - mesh.vertex_normals * 0.01
-    targets = mesh.vertices - mesh.vertex_normals * (dist.max() * 10)
-    ix, loc, is_backface = coll.intersections(sources, targets)
-
-    # Now we need to invalidate centers
-    intersects = np.zeros(mesh.vertices.shape[0]).astype(bool)
-    intersects[ix[is_backface]] = True
-    centers[ix] = mesh.vertices[ix] + (loc - mesh.vertices[ix]) / 2
-    radii[ix] = np.linalg.norm(loc - mesh.vertices[ix], axis=1) / 2
-
-    # Now we need to post processing
-    inv = np.zeros(mesh.vertices.shape[0]).astype(bool)
-
-    # Invalidate vertices that didn't intersect
-    inv[~intersects] = True
-
-    # Now invalidate any ball that is outside the mesh
-    inv[~coll.contains(centers)] = True
-
-    # Find tangent balls that are fully contained in another tangent ball
-    # (those are not maximal inscribed)
-    original_ind = np.arange(mesh.vertices.shape[0])
-    while True:
-        tree2 = scipy.spatial.cKDTree(centers[~inv])
-        # For any not-yet-invalidated center find the closest other center
-        dist, ix = tree2.query(centers[~inv], k=2)
-
-        # Drop self-hits
-        ix, dist = ix[:, 1], dist[:, 1]
-
-        # In radius
-        in_radius = dist < radii[~inv]
-
-        # Stop if no more overlapping pairs
-        if not in_radius.any():
-            break
-
-        # Collect radii to determine which of the overlapping ball survives
-        pair_rad = np.vstack((radii[~inv][in_radius],
-                              radii[~inv][ix[in_radius]])).T
-        pair_ix = np.vstack((original_ind[~inv][in_radius],
-                             original_ind[~inv][ix[in_radius]])).T
-
-        # Invalidate the loosers
-        looses = np.argmax(pair_rad, axis=1)
-        looser_ix = np.unique(pair_ix[np.arange(pair_ix.shape[0]), looses])
-        inv[looser_ix] = True
-
-    # Now we need to collapse nodes into the remaining centers
-    G = ig.Graph(n=mesh.vertices.shape[0],
-                 edges=mesh.edges_unique,
-                 directed=False)
-
-    # Make sure that every connected component has at least one valid target
-    for cc in G.clusters():
-        if not np.isin(cc, original_ind[~inv]).any():
-            inv[cc[0]] = False
-            centers[cc[0]] = mesh.vertices[cc[0]]
-
-    # For each invalidated vertex, find the closest vertex that is still valid
-    # This works on unweighted edges but should be good enough - way faster
-    # than a proper path search for sure
-    pairs = find_closest(G, sources=original_ind[inv],
-                         targets=original_ind[~inv])
-
-    # Generate a mesh vertex to skeleton node map
-    mesh_map = original_ind.copy()
-    mesh_map[pairs[:, 0]] = pairs[:, 1]
-
-    # Renumber the vertices from 0 -> N_vertices
-    uni, ind, mesh_map = np.unique(mesh_map, return_inverse=True, return_index=True)
-
-    # Make sure centers and radii match the new order
-    centers = centers[uni]
-    radii = radii[uni]
-
-    # Contract vertices to nodes according to the mesh
-    G.contract_vertices(mesh_map, combine_attrs=None)
-
-    # This only drops duplicate and self-loop edges
-    G = G.simplify()
-
-    # Generate weights between remaining centers
-    el = np.array(G.get_edgelist())
-    weights = np.linalg.norm(centers[el[:, 0]] - centers[el[:, 1]], axis=1)
-
-    # Generate hierarchical tree
-    tree = G.spanning_tree(weights=weights)
-
-    # Create a directed acyclic and hierarchical graph
-    G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()),
-                          nodes=np.arange(0, len(G.vs)),
-                          fix_tree=True,
-                          drop_disconnected=False)
-
-    # Generate the SWC table
-    swc = make_swc(G_nx, coords=centers, reindex=False)
-    swc['radius'] = radii[swc.node_id.values]
-    _, new_ids = reindex_swc(swc, inplace=True)
-
-    # Update vertex to node ID map
-    mesh_map = np.array([new_ids[n] for n in mesh_map])
-
-    return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map,
-                    method='tangent_ball')
-
+
+ +
125def by_tangent_ball(mesh):
+126    """Skeletonize a mesh by finding the maximal tangent ball.
+127
+128    This algorithm casts a ray from every mesh vertex along its inverse normals
+129    (requires `ncollpyde`). It then creates a sphere that is tangent to the
+130    vertex and to where the ray hit the inside of a face on the opposite side.
+131    Next it drops spheres that overlap with another, larger sphere. Modified
+132    from [1].
+133
+134    The method works best on smooth meshes and is rather sensitive to errors in
+135    the mesh such as incorrect normals (see `skeletor.pre.fix_mesh`), internal
+136    faces, noisy surface (try smoothing or downsampling) or holes in the mesh.
+137
+138    Parameters
+139    ----------
+140    mesh :              mesh obj
+141                        The mesh to be skeletonize. Can an object that has
+142                        ``.vertices`` and ``.faces`` properties  (e.g. a
+143                        trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a
+144                        dictionary ``{'vertices': vertices, 'faces': faces}``.
+145
+146    Returns
+147    -------
+148    skeletor.Skeleton
+149                        Holds results of the skeletonization and enables quick
+150                        visualization.
+151
+152    Examples
+153    --------
+154    >>> import skeletor as sk
+155    >>> mesh = sk.example_mesh()
+156    >>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)
+157    >>> skel = sk.skeletonize.by_tangent_ball(fixed)
+158
+159    References
+160    ----------
+161    [1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using
+162        nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012).
+163        https://doi.org/10.1007/s00371-011-0594-7
+164
+165    """
+166    mesh = make_trimesh(mesh, validate=False)
+167
+168    # Generate the KD tree
+169    tree = scipy.spatial.cKDTree(mesh.vertices)
+170
+171    dist = tree.query(mesh.vertices, k=2)[0][:, 1]
+172
+173    centers = np.zeros(mesh.vertices.shape)
+174    radii = np.zeros(mesh.vertices.shape[0])
+175
+176    coll = ncollpyde.Volume(mesh.vertices, mesh.faces, validate=False)
+177    sources = mesh.vertices - mesh.vertex_normals * 0.01
+178    targets = mesh.vertices - mesh.vertex_normals * (dist.max() * 10)
+179    ix, loc, is_backface = coll.intersections(sources, targets)
+180
+181    # Now we need to invalidate centers
+182    intersects = np.zeros(mesh.vertices.shape[0]).astype(bool)
+183    intersects[ix[is_backface]] = True
+184    centers[ix] = mesh.vertices[ix] + (loc - mesh.vertices[ix]) / 2
+185    radii[ix] = np.linalg.norm(loc - mesh.vertices[ix], axis=1) / 2
+186
+187    # Now we need to post processing
+188    inv = np.zeros(mesh.vertices.shape[0]).astype(bool)
+189
+190    # Invalidate vertices that didn't intersect
+191    inv[~intersects] = True
+192
+193    # Now invalidate any ball that is outside the mesh
+194    inv[~coll.contains(centers)] = True
+195
+196    # Find tangent balls that are fully contained in another tangent ball
+197    # (those are not maximal inscribed)
+198    original_ind = np.arange(mesh.vertices.shape[0])
+199    while True:
+200        tree2 = scipy.spatial.cKDTree(centers[~inv])
+201        # For any not-yet-invalidated center find the closest other center
+202        dist, ix = tree2.query(centers[~inv], k=2)
+203
+204        # Drop self-hits
+205        ix, dist = ix[:, 1], dist[:, 1]
+206
+207        # In radius
+208        in_radius = dist < radii[~inv]
+209
+210        # Stop if no more overlapping pairs
+211        if not in_radius.any():
+212            break
+213
+214        # Collect radii to determine which of the overlapping ball survives
+215        pair_rad = np.vstack((radii[~inv][in_radius],
+216                              radii[~inv][ix[in_radius]])).T
+217        pair_ix = np.vstack((original_ind[~inv][in_radius],
+218                             original_ind[~inv][ix[in_radius]])).T
+219
+220        # Invalidate the loosers
+221        looses = np.argmax(pair_rad, axis=1)
+222        looser_ix = np.unique(pair_ix[np.arange(pair_ix.shape[0]), looses])
+223        inv[looser_ix] = True
+224
+225    # Now we need to collapse nodes into the remaining centers
+226    G = ig.Graph(n=mesh.vertices.shape[0],
+227                 edges=mesh.edges_unique,
+228                 directed=False)
+229
+230    # Make sure that every connected component has at least one valid target
+231    for cc in G.clusters():
+232        if not np.isin(cc, original_ind[~inv]).any():
+233            inv[cc[0]] = False
+234            centers[cc[0]] = mesh.vertices[cc[0]]
+235
+236    # For each invalidated vertex, find the closest vertex that is still valid
+237    # This works on unweighted edges but should be good enough - way faster
+238    # than a proper path search for sure
+239    pairs = find_closest(G, sources=original_ind[inv],
+240                         targets=original_ind[~inv])
+241
+242    # Generate a mesh vertex to skeleton node map
+243    mesh_map = original_ind.copy()
+244    mesh_map[pairs[:, 0]] = pairs[:, 1]
+245
+246    # Renumber the vertices from 0 -> N_vertices
+247    uni, ind, mesh_map = np.unique(mesh_map, return_inverse=True, return_index=True)
+248
+249    # Make sure centers and radii match the new order
+250    centers = centers[uni]
+251    radii = radii[uni]
+252
+253    # Contract vertices to nodes according to the mesh
+254    G.contract_vertices(mesh_map, combine_attrs=None)
+255
+256    # This only drops duplicate and self-loop edges
+257    G = G.simplify()
+258
+259    # Generate weights between remaining centers
+260    el = np.array(G.get_edgelist())
+261    weights = np.linalg.norm(centers[el[:, 0]] - centers[el[:, 1]], axis=1)
+262
+263    # Generate hierarchical tree
+264    tree = G.spanning_tree(weights=weights)
+265
+266    # Create a directed acyclic and hierarchical graph
+267    G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()),
+268                          nodes=np.arange(0, len(G.vs)),
+269                          fix_tree=True,
+270                          drop_disconnected=False)
+271
+272    # Generate the SWC table
+273    swc = make_swc(G_nx, coords=centers, reindex=False)
+274    swc['radius'] = radii[swc.node_id.values]
+275    _, new_ids = reindex_swc(swc, inplace=True)
+276
+277    # Update vertex to node ID map
+278    mesh_map = np.array([new_ids[n] for n in mesh_map])
+279
+280    return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map,
+281                    method='tangent_ball')
+
-

Skeletonize a mesh by finding the maximal tangent ball.

@@ -1459,7 +1453,7 @@
References

[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012). - https://doi.org/10.1007/s00371-011-0594-7

+ https://doi.org/10.1007/s00371-011-0594-7