VTK笔记-使用vtkCleanPolyData/vtkCleanPolyData/WarpSurface/扩张多边形数据

vtkCleanPolyData

合并重复点,和/或删除未使用的点和/或删除退化单元。
vtkCleanPolyData是一个过滤器,它将多边形数据作为输入并生成多边形数据作为输出。vtkCleanPolyData将合并重复点(在指定公差范围内,如果启用),消除任何单元中未使用的点,如果启用,则将退化单元转换为适当的形式(例如,如果合并三角形的两点,则将三角形转换为直线)。
退化单元的转化由ConvertLinesToPoints、ConvertPolysToLines、ConvertStripsToPolys标志控制,这些标志累积作用,使退化三角条带可能变成多边形。

vtkCleanPolyData

vtkPolyDataNormals是一个过滤器,用于计算多边形网格的点和/或单元法线。用户通过设置ComputeCellNormals和ComputePointNormals标志指定是否希望计算点和/或单元法线。
计算的法线(vtkFloatArray)被设置为PointData的活动法线(使用SetNormals())和/或输出PolyData的CellData(分别)。这些数组的名称是“Normals”,因此可以使用vtkArrayDownCast(output->GetPointData()->GetNormals())或vtkArrayDownCast(output->GetPointData()->GetArray(“Normals”))检索这些数组。
过滤器可以对多边形进行重新排序,以确保多边形相邻区域的方向一致。可以使用单独的法线分割锐边和复制点,以提供清晰(渲染)的曲面定义。也可以全局翻转法线方向。
确定每个多边形的共享点,然后对每个点进行平均。当出现锐边时,将分割边并生成新点,以防止边缘模糊(由于Gouraud着色)。
注意:
1.法线仅为多边形和三角形条带计算。不会为直线或顶点计算法线。
2.三角形条带被分成三角形多边形。您可能需要重新绘制三角形。

vtkWarpVector

vtkWarpVector是一个过滤器,它通过沿向量移动点乘以比例因子来修改点坐标。常用于显示流动剖面或机械变形。

示例

double scale = 0.1;
vtkSmartPointer<vtkPolyData> inputPolyData;
vtkNew<vtkXMLPolyDataReader> reader;
reader->SetFileName("D:\\Data\\cowHead.vtp");
reader->Update();
inputPolyData = reader->GetOutput();

vtkNew<vtkCleanPolyData> clean;
clean->SetInputData(inputPolyData);

// Generate normals
vtkNew<vtkPolyDataNormals> normals;
normals->SetInputConnection(clean->GetOutputPort());
normals->SplittingOff();

// Warp using the normals
vtkNew<vtkWarpVector> warp;
warp->SetInputConnection(normals->GetOutputPort());
warp->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::NORMALS);
warp->SetScaleFactor(scale);

// Visualize the original and warped models
vtkNew<vtkNamedColors> colors;

vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(warp->GetOutputPort());
mapper->ScalarVisibilityOff();

vtkNew<vtkActor> warpedActor;
warpedActor->SetMapper(mapper);
warpedActor->GetProperty()->SetColor(colors->GetColor4d("Flesh").GetData());

vtkNew<vtkPolyDataMapper> originalMapper;
originalMapper->SetInputConnection(normals->GetOutputPort());
originalMapper->ScalarVisibilityOff();

vtkNew<vtkActor> originalActor;
originalActor->SetMapper(originalMapper);
originalActor->GetProperty()->SetInterpolationToFlat();
originalActor->GetProperty()->SetColor(colors->GetColor4d("Flesh").GetData());

vtkNew<vtkRenderWindow> renderWindow;
renderWindow->SetSize(400, 300);
renderWindow->SetWindowName("WarpSurface");

// Create a camera for all renderers
vtkNew<vtkCamera> camera;

// Define viewport ranges
// (xmin, ymin, xmax, ymax)
double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };
double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };

// Setup both renderers
vtkNew<vtkRenderer> leftRenderer;
leftRenderer->SetViewport(leftViewport);
leftRenderer->SetBackground(colors->GetColor3d("Burlywood").GetData());
leftRenderer->SetActiveCamera(camera);

vtkNew<vtkRenderer> rightRenderer;
rightRenderer->SetViewport(rightViewport);
rightRenderer->SetBackground(colors->GetColor3d("CornFlower").GetData());
rightRenderer->SetActiveCamera(camera);

leftRenderer->AddActor(originalActor);
rightRenderer->AddActor(warpedActor);

rightRenderer->ResetCamera();

renderWindow->AddRenderer(rightRenderer);
renderWindow->AddRenderer(leftRenderer);

vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(renderWindow);

renderWindow->Render();
interactor->Start();

设置scale = 0.0;
在这里插入图片描述

设置scale = 0.1;
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值