五、vtkFeatureEdges边过滤器
一、概述
1、vtkFeatureEdges是VTK中的一个过滤器类,用于从输入的多边形数据(vtkPolyData)中提取特征边(Feature Edge)。特征边通常是指几何模型中的边界边、非流行边、锐边或轮廓边等。
2、vtkFeatureEdges是一个非常有用的工具,特别适合用于几何处理、模型分析和可视化任务中。通过提取特征边,可以更好地理解和处理复制地几何模型。
二、主要功能
1、提取特征边
(1)边界边(Boundary Edges):只被一个多半形使用地边,或者直线单元
(2)非流行边(Non-Manifold Edges):被三个以上地多变形共用地边
(3)特征边(Feature Edges):被两个三角形使用且二面角大于特征角地边
(4)流行边(Mainifold Edges):只被两个多边形使用地边
2、可定制性
(1)可以通过设置角度阈值来控制特征边地提取
(2)可以选择提取特定类型地边
三、常用方法
1、BoundaryEdgesOn、BoundaryEdgesOff
开启或禁用边界边的提取
2、FeatureEdgesOn、FeatureEdgesOff
开启或禁用特征边的提取
3、ManifoldEdgesOn、ManifoldEdgesOff
开启或禁用流行边的提取
4、NonManifoldEdgesOn、NonManifoldEdgesOff
开启或禁用非流行边的提取
5、ColoringOn、ColoringOff
启用或禁用边的颜色区分
6、SetFeatureAngle(double angle)
设置特征边的角度阈值
7、update()
执行过滤器并生成输出
四、示例
#include <vtkActor.h>
#include <vtkDiskSource.h>
#include <vtkFeatureEdges.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
int main(int argc, char *argv[])
{
vtkNew<vtkNamedColors> colors;
//环
vtkNew<vtkDiskSource> diskSource;
diskSource->Update();
// 创建特征边过滤器
vtkNew<vtkFeatureEdges> featureEdges;
featureEdges->SetInputConnection(diskSource->GetOutputPort());
featureEdges->BoundaryEdgesOn(); //启用边界边的提取
featureEdges->FeatureEdgesOff(); //启用特征边的提取
featureEdges->ManifoldEdgesOff(); //禁用流形边的提取
featureEdges->NonManifoldEdgesOff(); //禁用非流形边的提取
featureEdges->ColoringOn(); //启用边的颜色区分
featureEdges->Update(); //执行过滤器并生成输出
vtkNew<vtkPolyDataMapper> edgeMapper;
edgeMapper->SetInputConnection(featureEdges->GetOutputPort());
edgeMapper->SetScalarModeToUseCellData();
vtkNew<vtkPolyDataMapper> diskMapper;
diskMapper->SetInputConnection(diskSource->GetOutputPort());
vtkNew<vtkActor> edgeActor;
edgeActor->SetMapper(edgeMapper.Get());
vtkNew<vtkActor> diskActor;
diskActor->SetMapper(diskMapper.Get());
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer.Get());
renderWindow->SetWindowName("BoundaryEdges");
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow.Get());
vtkNew<vtkInteractorStyleTrackballCamera> camera;
renderWindowInteractor->SetInteractorStyle(camera);
renderer->AddActor(edgeActor.Get());
renderer->AddActor(diskActor.Get());
renderer->SetBackground(0,0,0);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}