在VTK中的StructuredGrid或PolyData中设置颜色映射?

时间:2013-09-09 05:50:31

标签: c++ vtk

我正在尝试为PolyData创建一个颜色贴图,其点构成核反应堆的结构。似乎每次我改变颜色时,单元格的大小会根据我分配给它们的标量值而改变。我只想要一个颜色图,它显示我的结构单元格甚至点之间的插值颜色。 这是导致我的颜色映射更改单元格大小的代码。

#include <vtkFloatArray.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkLookupTable.h>
#include <vtkPointData.h>
#include <vtkCubeSource.h>
#include <vtkPolyData.h>
#include <vtkGlyph3DMapper.h>


int main(){
    vtkSmartPointer<vtkPoints> points=//points used to set deminsions of grid
        vtkSmartPointer<vtkPoints>::New();
    // cube source 
     vtkSmartPointer<vtkCubeSource> cube = 
        vtkSmartPointer<vtkCubeSource>::New();
     cube->SetZLength(2);
     //-----------------------------------------------
    vtkSmartPointer<vtkPolyData> polydata =
        vtkSmartPointer<vtkPolyData>::New();
     points->Allocate(3136);
     for(int i=0;i<27;++i){
         if(i!=0){i+=1;}
        for(int j=4;j<12;++j){  
            points->InsertNextPoint(j, 0, (i)); 
        }
        for(int k=2;k<14;++k){
            points->InsertNextPoint(k, 1, i);
            }           
        for(int m=2;m<4;++m)                            
            for(int l=1;l<15;++l){
                points->InsertNextPoint(l, m, i);
                }
        for(int n=4;n<12;++n)
            for(int p=0;p<16;++p){
                points->InsertNextPoint(p, n, i);
                }
        for(int q=12;q<14;++q)  
            for(int r=1;r<15;++r){
                points->InsertNextPoint(r, q, i);
                }
        for(int s=2;s<14;++s){
            points->InsertNextPoint(s, 14, i);
            }
        for(int t=4;t<12;++t){
            points->InsertNextPoint(t, 15, i);
            }
        }
    //--------------------build scalor array--------------------------
        vtkSmartPointer<vtkFloatArray> sarray=
    vtkSmartPointer<vtkFloatArray>::New();
            sarray->SetNumberOfValues(3136);
            for(int i=0;i<3136;++i){
            if(i<2000)
                sarray->InsertValue(i,1);
            else
                sarray->InsertValue(i,10);
            }
    vtkSmartPointer<vtkLookupTable>cTable = 
           vtkSmartPointer<vtkLookupTable>::New();
    int tableSize =  10;// not sure if I need this
    cTable->SetNumberOfTableValues(tableSize);// not sure if I need this
    cTable->Build();
     //--------------------------------------------------------------------------------
    polydata->SetPoints(points);
    polydata->BuildCells();
    polydata->GetPointData()->SetScalars(sarray);
     //---------------------------------------------

      vtkSmartPointer<vtkGlyph3DMapper> mapper = 
        vtkSmartPointer<vtkGlyph3DMapper>::New();
     mapper->SetSourceConnection(cube->GetOutputPort());
    #if VTK_MAJOR_VERSION <= 5
      mapper->SetInputConnection(polydata->GetProducerPort());
    #else
      mapper->SetInputData(polydata);
    #endif
    mapper->Update();
    mapper->SetScalarRange(1, 10);
    mapper->SetLookupTable(cTable);
    //-----------------------------------------------------------------
    vtkSmartPointer<vtkActor> actor = 
     vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetPointSize(3);

    vtkSmartPointer<vtkRenderer> renderer = 
    vtkSmartPointer<vtkRenderer>::New();

    vtkSmartPointer<vtkRenderWindow> renderWindow = 
     vtkSmartPointer<vtkRenderWindow>::New();

      renderWindow->AddRenderer(renderer);

      vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
        vtkSmartPointer<vtkRenderWindowInteractor>::New();

      renderWindowInteractor->SetRenderWindow(renderWindow);

      renderer->AddActor(actor);
      renderer->SetBackground(.2, .3, .4);
      renderer->ResetCamera();
      renderWindow->Render();
      renderWindowInteractor->Start();

      return EXIT_SUCCESS;
    }

0 个答案:

没有答案