[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