After obtaining and examining a traceback, I found the segmentation fault was occurring in vtkHexahedron::InterpolationFunctions, which apparently expects the double*weights to be an array of 8 doubles. This is aggravating, since the documentation says nothing about the expected length of *weights. The example at <a href="http://www.cmake.org/Wiki/VTK/Examples/Cxx/PolyData/PointInsideObject2">http://www.cmake.org/Wiki/VTK/Examples/Cxx/PolyData/PointInsideObject2</a> uses double weights[3], which also makes no sense since there's no way to make a 3-dimensional cell with only 3 faces/vertices. Can anyone tell me exactly what's expected to be passed to vtkPointSet::FindCell()??<br>
<br>traceback:<br><br>#0 0x00000031c31885ee in vtkHexahedron::InterpolationFunctions (<br> pcoords=0x7fffffffd8a0, sf=0x0)<br> at /usr/src/debug/VTK/Filtering/vtkHexahedron.cxx:202<br>#1 0x00000031c3189bdf in vtkHexahedron::EvaluatePosition (<br>
this=<value optimized out>, x=<value optimized out>, <br> closestPoint=<value optimized out>, subId=<value optimized out>, <br> pcoords=0x7fffffffd8a0, dist2=@0x7fffffffd7f8, weights=0x0)<br>
at /usr/src/debug/VTK/Filtering/vtkHexahedron.cxx:82<br>#2 0x00000031c320927f in vtkPointSet::FindCell (this=0x6250d0, <br> x=<value optimized out>, cell=0x0, gencell=<value optimized out>, <br> cellId=43508, tol2=<value optimized out>, subId=<value optimized out>, <br>
pcoords=0x7fffffffd8a0, weights=0x0)<br> at /usr/src/debug/VTK/Filtering/vtkPointSet.cxx:217<br>#3 0x0000000000401187 in vtkBlenderTexture::SamplePoint (this=0x6238a0, <br> x=0.01, y=0, z=0, array=0) at vtkFindCellTest.cpp:73<br>
#4 0x0000000000401420 in main (argc=1, argv=0x7fffffffdb38)<br> at vtkFindCellTest.cpp:111<br><br><br><div class="gmail_quote">On Thu, Oct 21, 2010 at 4:00 PM, John Haiducek <span dir="ltr"><<a href="mailto:jhaiduce@gmail.com">jhaiduce@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I'm writing a program that samples points from a VTKUnstructuredGrid
dataset by using calls to vtkDataSet::FindPoint(). Every call to
FindPoint results in a segmentation fault. Any help would be
appreciated.<br><br>John<br>
<br>[code]<br>#include <sstream><br>#include <iostream><br><br>#include <cstddef><br>#include "vtkDataSetReader.h"<br>#include "vtkSmartPointer.h"<br>#include "vtkDataSet.h"<br>
#include "vtkGenericCell.h"<br>#include "vtkPointData.h"<br><br>class vtkBlenderTexture<br>{<br> private:<br> vtkSmartPointer <vtkDataSet> dataset;<br> int dims[3];<br> <br>
void load_vtk(char* filename);<br> char vtkfilename[240];<br> vtkGenericCell *gencell;<br> <br> public:<br> <br> vtkBlenderTexture();<br> <br> double SamplePoint(double x, double y, double z, int array);<br>
<br> void SetInputFilename(char* filename);<br> <br> char* GetInputFilename();<br>};<br><br>void vtkBlenderTexture::load_vtk(char filename[240])<br> {<br> strcpy(vtkfilename,filename);<br>
vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();<br> reader->SetFileName(filename);<br> if(reader->IsFileValid("unstructured_grid")||reader->IsFileValid("structured_grid"))<br>
{<br> reader->Update();<br> dataset=reader->GetOutput();<br> cout << "Done reading "<< filename <<endl;<br> }<br> else<br>
{<br> cout << "Invalid VTK file "<<filename<<endl;<br> dataset=NULL;<br> }<br> }<br> <br>vtkBlenderTexture::vtkBlenderTexture()<br>
{<br> gencell = vtkGenericCell::New();<br> }<br> <br>double vtkBlenderTexture::SamplePoint(double x, double y, double z, int array)<br> {<br> double value=0;<br> if(dataset!=NULL)<br>
{<br> double pos[3]={x,y,z};<br> double pcoords[3];<br> vtkIdType cellId=NULL;<br> int subId;<br> double * weights;<br> cellId = dataset->FindCell(pos,NULL,gencell,cellId,0.01,subId,pcoords,weights);<br>
if(cellId>=0)<br> {<br> vtkIdList*pointIds;<br> dataset->GetCellPoints(cellId,pointIds);<br> value = dataset->GetPointData()->GetScalars()->GetComponent(pointIds->GetId(0),array);<br>
}<br> }<br> <br> return value;<br> }<br> <br>void vtkBlenderTexture::SetInputFilename(char filename[240])<br> {<br> load_vtk(filename);<br>
}<br> <br>char* vtkBlenderTexture::GetInputFilename()<br> {<br> return vtkfilename;<br> }<br><br><br>int main( int argc, const char* argv[] )<br>{<br> vtkBlenderTexture * texobj = new vtkBlenderTexture();<br>
<br> char filename[240]="/home/haiduced/PumpStudy/pumpstudy.vtk";<br> texobj->SetInputFilename(filename);<br> double value = texobj->SamplePoint(0.01, 0, 0,0);<br> cout << value << endl;<br>
return 0;<br>}<br>[/code]
</blockquote></div><br>