[vtkusers] vtkTubeFilter with independently varying radius and color

Bill Lorensen bill.lorensen at gmail.com
Sat Jan 2 08:47:51 EST 2010


Marcus,

Thanks, I'll add it to the wiki examples and send a pointer.

Bill

On Sat, Jan 2, 2010 at 4:44 AM, Marcus Thamson <markie_thomson at yahoo.de> wrote:
> Dear All,
>
> I have finally solved my little problem, by using SetScalarModeToUsePointFieldData in conjunction with SelectColorArray (in the end nothing special, but I had to find the correct combination of commands...).
>
> I came across about 5 other unresolved threads on this same issue, so I have pasted a demonstrative code below in case this helps anyone in the future.
>
> Regards, MT
>
> // VTK: Spiral with vtkTubeFilter
> // Varying tube radius and independent RGB colors with an unsignedCharArray
>
> #include <math.h>
> #include <iostream>
> using namespace std;
>
> #include <vtkPolyData.h>
> #include <vtkPoints.h>
> #include <vtkCellArray.h>
> #include <vtkDoubleArray.h>
> #include <vtkPolyData.h>
> #include <vtkPointData.h>
>
> #include <vtkCell.h>
> #include <vtkCellData.h>
> #include <vtkDataSet.h>
> #include <vtkDataSetAttributes.h>
> #include <vtkProperty.h>
> #include <vtkSmartPointer.h>
> #include <vtkTubeFilter.h>
>
> #include <vtkDataSetMapper.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkActor.h>
> #include <vtkRenderer.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkInteractorStyleTrackballCamera.h>
>
> #define PI 3.14159265
>
> int main()
> {
>        // Spiral tube
>        double vx, vy, vz;
>        unsigned int nV=256;            // No. of vertices
>        unsigned int ncyc=5;    // No. of spiral cycles
>        double Rt1=0.1, Rt2=0.5;                                // Start/end tube radii
>        double Rs=2;                            // Spiral radius
>        double h=10;                            // Height
>        unsigned int Ntv=8;             // No. of surface elements for each tube vertex
>
>        unsigned int i;
>
>        vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
>        for(i=0; i<nV; i++) {
>                // Spiral coordinates
>                vx = Rs*cos(2*PI*ncyc*i/(nV-1));
>                vy = Rs*sin(2*PI*ncyc*i/(nV-1));
>                vz = h*i/nV;
>                points->InsertPoint(i,vx,vy,vz);
>        }
>
>        vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
>        lines->InsertNextCell(nV);
>        for (i=0; i<nV; i++) lines->InsertCellPoint(i);
>
>        vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
>        polyData->SetPoints(points);
>        polyData->SetLines(lines);
>        polyData->BuildLinks();
>
>        // Varying tube radius - vary using sine-function
>        vtkSmartPointer<vtkDoubleArray> tuberad = vtkSmartPointer<vtkDoubleArray>::New();
>        tuberad->SetName("tuberad");
>        tuberad->SetNumberOfTuples(nV);
>        for (i=0 ;i<nV ; i++) tuberad->SetTuple1(i,Rt1+(Rt2-Rt1)*sin(PI*i/(nV-1)));
>        polyData->GetPointData()->AddArray(tuberad);
>        polyData->GetPointData()->SetActiveScalars("tuberad");
>
>        // RBG array (could add A channel too I guess...)
>        // Varying from blue to red
>        vtkSmartPointer<vtkUnsignedCharArray> cols = vtkSmartPointer<vtkUnsignedCharArray>::New();
>        cols->SetName("cols");
>        cols->SetNumberOfComponents(3);
>        cols->SetNumberOfTuples(nV);
>        for (i=0; i<nV ; i++) {
>                cols->InsertTuple3(i, int(255*i/(nV-1)) , 0 , int(255*(nV-1-i)/(nV-1)) );
>        }
>        polyData->GetPointData()->AddArray(cols);
>
>        vtkSmartPointer<vtkTubeFilter> tube = vtkSmartPointer<vtkTubeFilter>::New();
>        tube->SetNumberOfSides(Ntv);
>        tube->SetInput(polyData);
>        tube->SetVaryRadiusToVaryRadiusByAbsoluteScalar();
>
>        vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
>        mapper->SetInput(tube->GetOutput());
>        mapper->ScalarVisibilityOn();
>        mapper->SetScalarModeToUsePointFieldData();
>        mapper->SelectColorArray("cols");
>
>        vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
>        actor->SetMapper(mapper);
>
>        vtkRenderer *renderer = vtkRenderer::New();
>        renderer->AddActor(actor);
>
>        vtkRenderWindow *renWin = vtkRenderWindow::New();
>        vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
>
>        iren->SetRenderWindow(renWin);
>        renWin->AddRenderer(renderer);
>        renWin->SetSize(500,500);
>        renWin->Render();
>
>        vtkInteractorStyleTrackballCamera *style =
>                vtkInteractorStyleTrackballCamera::New();
>        iren->SetInteractorStyle(style);
>
>        iren->Start();
>
>        renderer->Delete();
>        renWin->Delete();
>        iren->Delete();
>        style->Delete();
>
>        return 0;
> }
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen Massenmails.
> http://mail.yahoo.com
> _______________________________________________
> 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