[vtkusers] How do I interpolate scalars along the geometric surface?

Takayoshi Kurachi kurakurara at gmail.com
Tue Feb 17 22:54:46 EST 2009


After taking look at the filter "vtkInterpolateDataSetAttributes",
I understood that it simply calls:

vtkDataSetAttribute::InterpolateTime()

I also took a look at vtkDataSetAttributes::InterpolatePoint()
and found it simply calls:

vtkAbstractArray::InterpolateTuple()

Then I took a look at vtkTupleInterpolator::InterpolateTuple(), but
found that it doesn't take the point coordinate into account.

Marcel was right, none of the above seems to fulfil the task I need.

It seems that I have to write the code of point by point operation
giving each point the interpolation weights according to the geometric
distances by myself. :(

Thanks,
Taka



> Hi Marcel,
> 
> Thanks for your quick reply.
> 
> I still want to believe that VTK has a class to solve this task...
> It can interpolate between multiple points with colors very well,
> even in the simple example code of "Cube" (Cube.cxx)...
> 
> Reading the class description, "vtkInterpolateDataSetAttributes"
> seems to be the one I need, but haven't figured out how to use. :(
> 
> 
> Does anyone know how to use this class?
> 
> 
>  >> Hell Marcel,
>  > how could you know? ... ]:-}>
> Well, of course I know your name. I even know you are a PhD student
> at the Department of Neurophysics Max Planck Institute for Human
> Cognitive and Brain Sciences. :)
> 
> Taka
> 
> 
> Marcel Weiss wrote:
>>> Hell Marcel,
>> how could you know? ... ]:-}>
>>
>>> The question is how do I calculate the weighted averaging using
>>> the geodesic distances for the interpolation?
>>> Is there any class for this purpose? I've been trying to use
>>> vtkInterpolateDataSetAttributes and vtkTupleInterpolator, but
>>> neither do not work well so far... :(
>>> Or do I need to write the filter by myself??
>>
>> At least I don´t see any filter in VTK being able to solve this task.
>> but I assume there might be some code available online ... especially 
>> for the distance problem ... 
>> Marcel Weiss
>> PhD student
>> Department of Neurophysics
>> Max Planck Institute for Human Cognitive and Brain Sciences
>>
>> Marcel Weiss wrote:
>>> using the geodesic distances (along the brain surface mesh) to points 
>>> with given scalar (source points)  vectors should enable to do some 
>>> kind of weighted averaging for mesh points without scalars using the  
>>> n closest source points ...
>>> Marcel Weiss
>>> PhD student
>>> Department of Neurophysics
>>> Max Planck Institute for Human Cognitive and Brain Sciences
>>> ----- Original Message -----
>>> From: "Takayoshi Kurachi" <kurakurara at gmail.com>
>>> To: vtkusers at vtk.org
>>> Sent: Monday, February 16, 2009 2:54:19 PM GMT +01:00 Amsterdam / 
>>> Berlin / Bern / Rome / Stockholm / Vienna
>>> Subject: [vtkusers] How do I interpolate scalars along the geometric 
>>> surface?
>>>
>>> Hello All,
>>>
>>> I'm trying to interpolate scalar values along the geometric
>>> surface and having a very difficult time.
>>>
>>> I have a geometric data of a brain in 3DS file and want to set
>>> scalar value (of electroencephalogram) in its 21 locations of
>>> the surface points, and interpolate for the rest of the points
>>> along the surface to show the scalar values in color.
>>>
>>> With the code below, I could get the vtkPointData and set
>>> scalar values on some of the points as the dataset attribute,
>>> but it seems that the value is shown in color only within the
>>> cell that contains the point with the attribute value I set.
>>> I want to interpolate the scalar along the entire surface by
>>> the 21 given values.
>>>
>>> How can I interpolate scalar values along the surface?
>>>
>>> Many thanks in advance.
>>>
>>> Taka
>>>
>>>
>>> // Read geometric data from 3DS file
>>> vtk3DSImporter* importer = vtk3DSImporter::New();
>>> importer->ComputeNormalsOff();
>>> importer->SetFileName("data/brain.3ds");
>>> importer->Read();
>>>
>>> // create lookup table (white <-> red)
>>> vtkLookupTable *lut = vtkLookupTable::New();
>>> lut->SetTableRange (0, 1);
>>> lut->SetHueRange (1, 1);
>>> lut->SetSaturationRange (0, 1);
>>> lut->SetValueRange (1, 1);
>>> lut->Build();
>>>
>>> // create render window and interactor
>>> vtkRenderWindow* renWin = vtkRenderWindow::New();
>>> vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
>>>
>>> // get data from the importer as vtkDataSet
>>> vtkActorCollection* actors = importer->GetRenderer()->GetActors();
>>> actors->InitTraversal();
>>> vtkActor* actor = actors->GetLastActor();
>>> vtkMapper* mapper = actor->GetMapper();
>>> vtkDataSet* data = mapper->GetInput();
>>> vtkPointData* ptData = data->GetPointData();
>>>
>>> data->Update();
>>>
>>> // get point ids of 4 points for testing (actually i will set 21 points)
>>> double bounds[6];
>>> data->GetBounds(bounds);
>>> vtkIdType id1 = data->FindPoint(0, 0, bounds[5]);
>>> vtkIdType id2 = data->FindPoint(0, 0, bounds[6]);
>>> vtkIdType id3 = data->FindPoint(bounds[0], 0, 0);
>>> vtkIdType id4 = data->FindPoint(bounds[1], 0, 0);
>>>
>>> // create array of scalars in vtkFloatArray
>>> vtkFloatArray *scalars = vtkFloatArray::New();
>>> scalars->InsertTuple1(id1, 1.0); // set the value 1.0 for testing
>>> scalars->InsertTuple1(id2, 1.0);
>>> scalars->InsertTuple1(id3, 1.0);
>>> scalars->InsertTuple1(id4, 1.0);
>>> scalars->SetLookupTable(lut);
>>>
>>> // set the scalars to the vtkPointData as the dataset attribute
>>> ptData->Initialize();
>>> ptData->SetScalars(scalars);
>>>
>>> // ... setting up mapper, actor, camera, etc.
>>>
>>>
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at 
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the VTK FAQ at: 
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>
> 



More information about the vtkusers mailing list