[vtkusers] vtkTubeFilter with independently varying radius and color
Bill Lorensen
bill.lorensen at gmail.com
Sat Jan 2 11:18:50 EST 2010
Marcus,
I added the your example here:
http://www.vtk.org/Wiki/VTK/Examples/VisualizationAlgorithms/Cxx/TubesWithVaryingRadiusAndColors
I'll also be adding it the Examples distributed with the vtk source
distribution. I made some minor edits to conform to VTK style.
Thanks for taking the time to do this,
Bill
On Sat, Jan 2, 2010 at 8:47 AM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
> 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