【类说明】
提取多边形数据(polygonal data)的边界,非流行、锋利的边缘。
该类是针对输入数据为多边形几何数据的滤波器,提取特定类型的边缘数据。
这些边缘可以是:
- 一个多边形的边界 boundary 或者一个 line cell;
- 非流形数据 - 三个或者更多的多边形数据;
- 特征边(两个三角形的边缘, 三角形的二面角大于特征角)
- 流形边(两个多变形的边)
这些边可能是任何组成方式,边也可以是有颜色的。
为了设置颜色,必须给不同的 mapper 实例 设置 ScalarMode, 方法SetScalarModeToUseCellData().
【类继承图】
【类协作图】
【示例】
一检测一个几何数据是否是闭合的
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkFeatureEdges.h>
int main(int, char *[])
{
// Create a sphere
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkFeatureEdges> featureEdges = vtkSmartPointer<vtkFeatureEdges>::New();
featureEdges->FeatureEdgesOff(); // Turn off the extraction of feature edges.
featureEdges->BoundaryEdgesOn(); // Turn on the extraction of boundary edges.
featureEdges->NonManifoldEdgesOn(); // Turn on the extraction of non-manifold edges.
featureEdges->SetInputConnection(sphereSource->GetOutputPort());
featureEdges->Update();
int numberOfOpenEdges = featureEdges->GetOutput()->GetNumberOfCells();
if(numberOfOpenEdges > 0)
{
std::cout << "Surface is not closed" << std::endl;
}
else
{
std::cout << "Surface is closed" << std::endl;
}
return EXIT_SUCCESS;
}
实例二;
提取一个网格集合数据的边缘信息并显示
#include <vtkSmartPointer.h>
#include <vtkFeatureEdges.h>
#include <vtkPolyData.h>
#include <vtkDiskSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>
int main(int, char *[])
{
vtkSmartPointer<vtkDiskSource> diskSource = vtkSmartPointer<vtkDiskSource>::New();
diskSource->Update();
vtkSmartPointer<vtkPolyDataMapper> diskMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
diskMapper->SetInputConnection(diskSource->GetOutputPort());
vtkSmartPointer<vtkActor> diskActor = vtkSmartPointer<vtkActor>::New();
diskActor->SetMapper(diskMapper);
vtkSmartPointer<vtkFeatureEdges> featureEdges = vtkSmartPointer<vtkFeatureEdges>::New();
featureEdges->SetInputConnection(diskSource->GetOutputPort());
featureEdges->BoundaryEdgesOn();
featureEdges->FeatureEdgesOff();
featureEdges->ManifoldEdgesOff();
featureEdges->NonManifoldEdgesOff();
featureEdges->SetBoundaryEdges(100);
featureEdges->Update();
vtkSmartPointer<vtkPolyDataMapper> edgeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
edgeMapper->SetInputConnection(featureEdges->GetOutputPort());
vtkSmartPointer<vtkActor> edgeActor = vtkSmartPointer<vtkActor>::New();
edgeActor->SetMapper(edgeMapper);
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(edgeActor);
renderer->AddActor(diskActor);
renderer->SetBackground(.3, .6, .3); // Background color green
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}