I’m facing size (or unit)-dependent time costs when using Delaunay3D filter on a discrete scalar field, and do not understand those.
I’m actually working on the distance field to some sphere, for gridpoints on a structured (regular here) grid. Using the exact same number of gridpoints, but different grid spacing and sphere radii, I have completely different time costs of the Delaunay3D filter.
The behavior is illustrated by the following Python code (I launched it with IPython 5.5.0 / Python 2.7.17 on Ubuntu 18.04):
# writing in a structured grid the distance field to a sphere of some radius, and testing size-dependance of treatment costs import time,vtk radVal = [0.001,0.1] # considered sphere radius values def distToSph(point,radius): '''Returns the signed distance between a [x,y,z] point and a sphere of some radius''' return (point**2+point**2+point**2)**0.5 - radius for rad in radVal: # considering the 2 radius values sgrid = vtk.vtkStructuredGrid() # a 23*23*23 grid enclosing the sphere of radius rad in both cases sgrid.SetDimensions([23,23,23]) gridPts = vtk.vtkPoints() gridPts.Allocate(23**3) distField = vtk.vtkDoubleArray() # the scalar field stored on the grid: shortest distance to the sphere of radius rad distField.SetNumberOfComponents(1) for k in range(23): for j in range(23): for i in range(23): gp = [(-1.1+i/10.)*rad,(-1.1+j/10.)*rad,(-1.1+k/10.)*rad] gridPts.InsertNextPoint(gp) distField.InsertNextValue(distToSph(gp,rad)) sgrid.SetPoints(gridPts) sgrid.GetPointData().SetScalars(distField) # Delaunay filter to the data: t1 = time.time() delaunay = vtk.vtkDelaunay3D() delaunay.SetInputData(sgrid) delaunay.Update() t2 = time.time() print 'For radius =',rad,'Delaunay filter took',t2-t1,'s'
On my machine, I get as an output:
For radius = 0.001 Delaunay filter took 0.00500893592834 s For radius = 0.1 Delaunay filter took 2.61835503578 s
The time difference surprises (and annoys…) me since there is exactly the same amount of data to process in both cases…
Hence the question: Is there a dimensional argument to the Delaunay3D filter I should use to avoid such a difference ? (more general explanations would also be welcome)
(As background information, I’m applying this filter before extracting the zero-contour and the sphere surface, which is my final goal – for more complex shapes than spheres. By the way, I know Delaunay triangulation may not be suitable for such structured mesh, but that is the best method I found for now…)