VTK: vtkTubeFilter生成管道

来源:互联网 发布:mac chili中国专柜价格 编辑:程序博客网 时间:2024/06/07 06:19

                 vtkTubeFilter可以用来生成包围一条折线的管道。下面是一个vtkTubeFilter的使用例子。围绕一条线创建一个圆柱形管道。

         

#include <vtkSmartPointer.h>#include <vtkLine.h>#include <vtkCellArray.h>#include <vtkTubeFilter.h>#include <vtkLineSource.h>#include <vtkPolyData.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkRenderWindow.h>#include <vtkRenderer.h>#include <vtkRenderWindowInteractor.h>#include <vtkProperty.h>   int main(int, char *[]){  // Create a line  vtkSmartPointer<vtkLineSource> lineSource =     vtkSmartPointer<vtkLineSource>::New();  lineSource->SetPoint1(1.0, 0.0, 0.0);  lineSource->SetPoint2(0.0, 1.0, 0.0);   // Create a mapper and actor  vtkSmartPointer<vtkPolyDataMapper> lineMapper =     vtkSmartPointer<vtkPolyDataMapper>::New();  lineMapper->SetInputConnection(lineSource->GetOutputPort());  vtkSmartPointer<vtkActor> lineActor =     vtkSmartPointer<vtkActor>::New();  lineActor->GetProperty()->SetColor(0.0,0.0,0.1); // Give some color to the line  lineActor->SetMapper(lineMapper);   // Create a tube (cylinder) around the line  vtkSmartPointer<vtkTubeFilter> tubeFilter =     vtkSmartPointer<vtkTubeFilter>::New();  tubeFilter->SetInputConnection(lineSource->GetOutputPort());  tubeFilter->SetRadius(.025); //default is .5  tubeFilter->SetNumberOfSides(50);  tubeFilter->Update();   // Create a mapper and actor  vtkSmartPointer<vtkPolyDataMapper> tubeMapper =     vtkSmartPointer<vtkPolyDataMapper>::New();  tubeMapper->SetInputConnection(tubeFilter->GetOutputPort());  vtkSmartPointer<vtkActor> tubeActor =     vtkSmartPointer<vtkActor>::New();  tubeActor->GetProperty()->SetOpacity(0.5); //Make the tube have some transparency.  tubeActor->SetMapper(tubeMapper);   // Create a renderer, render window, and interactor  vtkSmartPointer<vtkRenderer> renderer =     vtkSmartPointer<vtkRenderer>::New();  vtkSmartPointer<vtkRenderWindow> renderWindow =     vtkSmartPointer<vtkRenderWindow>::New();  renderWindow->AddRenderer(renderer);  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =     vtkSmartPointer<vtkRenderWindowInteractor>::New();  renderWindowInteractor->SetRenderWindow(renderWindow);   // Add the actor to the scene  renderer->AddActor(tubeActor);  renderer->AddActor(lineActor);  renderer->SetBackground(0,1,0);   // Render and interact  renderWindow->Render();  renderWindowInteractor->Start();   return EXIT_SUCCESS;}

效果如下图:



   通过给折线上各点指定一个半径标量值,可以实现一个直径不断变化的管道。例子如下:

int main(int argc, char *argv[]){    vtkSmartPointer<vtkPoints> points =            vtkSmartPointer<vtkPoints>::New();    points->InsertPoint(0,1,0,0);    points->InsertPoint(1,2,0,0);    points->InsertPoint(2,3,1,0);    points->InsertPoint(3,4,1,0);    points->InsertPoint(4,5,0,0);    points->InsertPoint(5,6,0,0);    // Fit a spline to the points    vtkSmartPointer<vtkParametricSpline> spline =            vtkSmartPointer<vtkParametricSpline>::New();    spline->SetPoints(points);    vtkSmartPointer<vtkParametricFunctionSource> functionSource =            vtkSmartPointer<vtkParametricFunctionSource>::New();    functionSource->SetParametricFunction(spline);    functionSource->SetUResolution(10 * points->GetNumberOfPoints());    functionSource->Update();    // Interpolate the scalars    double rad;    vtkSmartPointer<vtkTupleInterpolator> interpolatedRadius =            vtkSmartPointer<vtkTupleInterpolator> ::New();    interpolatedRadius->SetInterpolationTypeToLinear();    interpolatedRadius->SetNumberOfComponents(1);    rad = .2; interpolatedRadius->AddTuple(0,&rad);    rad = .2; interpolatedRadius->AddTuple(1,&rad);    rad = .15; interpolatedRadius->AddTuple(2,&rad);    rad = .15; interpolatedRadius->AddTuple(3,&rad);    rad = .1; interpolatedRadius->AddTuple(4,&rad);    rad = .1; interpolatedRadius->AddTuple(5,&rad);    // Generate the radius scalars    vtkSmartPointer<vtkDoubleArray> tubeRadius =            vtkSmartPointer<vtkDoubleArray>::New();    unsigned int n = functionSource->GetOutput()->GetNumberOfPoints();    tubeRadius->SetNumberOfTuples(n);    tubeRadius->SetName("TubeRadius");    double tMin = interpolatedRadius->GetMinimumT(); std::cout << "tMin:" <<tMin;    double tMax = interpolatedRadius->GetMaximumT(); std::cout << "tMax:" <<tMax;    double r;    for (unsigned int i = 0; i < n; ++i)    {        double t = (tMax - tMin) / (n - 1) * i + tMin;        interpolatedRadius->InterpolateTuple(t, &r);        tubeRadius->SetTuple1(i, r);    }    // Add the scalars to the polydata    vtkSmartPointer<vtkPolyData> tubePolyData =            vtkSmartPointer<vtkPolyData>::New();    tubePolyData = functionSource->GetOutput();    tubePolyData->GetPointData()->AddArray(tubeRadius);    tubePolyData->GetPointData()->SetActiveScalars("TubeRadius");    // Create the tubes    vtkSmartPointer<vtkTubeFilter> tuber =            vtkSmartPointer<vtkTubeFilter>::New();#if VTK_MAJOR_VERSION <= 5    tuber->SetInput(tubePolyData);#else    tuber->SetInputData(tubePolyData);#endif    tuber->SetNumberOfSides(50);    tuber->SetVaryRadiusToVaryRadiusByAbsoluteScalar();    //--------------    // Setup actors and mappers    vtkSmartPointer<vtkPolyDataMapper> lineMapper =            vtkSmartPointer<vtkPolyDataMapper>::New();#if VTK_MAJOR_VERSION <= 5    lineMapper->SetInput(tubePolyData);#else    lineMapper->SetInputData(tubePolyData);#endif    lineMapper->SetScalarRange(tubePolyData->GetScalarRange());    vtkSmartPointer<vtkPolyDataMapper> tubeMapper =            vtkSmartPointer<vtkPolyDataMapper>::New();    tubeMapper->SetInputConnection(tuber->GetOutputPort());    tubeMapper->SetScalarRange(tubePolyData->GetScalarRange());    vtkSmartPointer<vtkActor> lineActor = vtkSmartPointer<vtkActor>::New();    lineActor->SetMapper(lineMapper);    vtkSmartPointer<vtkActor> tubeActor = vtkSmartPointer<vtkActor>::New();    tubeActor->SetMapper(tubeMapper);    tubeActor->GetProperty()->SetOpacity(0.3);    // Setup render window, renderer, and interactor    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(lineActor);    renderer->AddActor(tubeActor);    renderer->SetBackground(.2, .3, .4);    renderWindow->Render();    renderWindowInteractor->Start();    return EXIT_SUCCESS;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办 保险标志保险卡都没给怎么办 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办 快递收件人电话写错了怎么办 收件人电话写错了怎么办 大货要出货了数量错误怎么办 手被烫伤留疤怎么办 cbg被下单不能改价怎么办 浪琴手表日期中午跳怎么办 社保一体卡丢失了怎么办 京东付款七天不发货怎么办 电动车电机锁钥匙丢了怎么办 电瓶车锁钥匙丢了怎么办 苹果平板ld忘了怎么办 平板版本太低6.0怎么办 ios平板版本太低怎么办 微信公众号重名怎么办