VTK笔记——提取边界(vtkFeatureEdges)

vtkFeatureEdges,VTK的一个类,用于边界提取。
提取的边界包括:
1)边界(boundary),只被一个多边形使用的边,或者直线单元;
2)非流行(non-manifold),被三个以上的多边形共用的边;
3)特征边(feature edges),被两个三角形使用且二面角大于特征角的边;
4)流行边(manifold edges),只被两个多边形使用的边。

常用于

1)提取模型的边界

在这里插入图片描述

	vtkSmartPointer<vtkFeatureEdges> boundaryEdges =
		vtkSmartPointer<vtkFeatureEdges>::New();
	boundaryEdges->SetInputConnection(diskSource->GetOutputPort());
	boundaryEdges->BoundaryEdgesOn();
	boundaryEdges->FeatureEdgesOff();
	boundaryEdges->ManifoldEdgesOff();
	boundaryEdges->NonManifoldEdgesOff();
	boundaryEdges->Update();

注意:提取出来的边界点是无序的,可以用vtkCleanPolyData使其变得有序:

	vtkSmartPointer<vtkStripper> stripper =
		vtkSmartPointer<vtkStripper>::New();
	stripper->SetInputConnection(featureEdges->GetOutputPort());
	stripper->JoinContiguousSegmentsOn();

	vtkSmartPointer<vtkCleanPolyData> cleanPolyData =
		vtkSmartPointer<vtkCleanPolyData>::New();
	cleanPolyData->SetInputConnection(stripper->GetOutputPort());
	cleanPolyData->Update();
2)检测模型是否闭合
	vtkSmartPointer<vtkFeatureEdges> closedSurface =
		vtkSmartPointer<vtkFeatureEdges>::New();
	closedSurface->SetInputConnection(diskSource->GetOutputPort());
	closedSurface->FeatureEdgesOff();
	closedSurface->BoundaryEdgesOn();
	closedSurface->NonManifoldEdgesOn();
	closedSurface->Update();
	int numberOfOpenEdges = closedSurface->GetOutput()->GetNumberOfCells();
	if (numberOfOpenEdges > 0)
	{
		std::cout << "Surface is not closed" << std::endl;
	}
	else
	{
		std::cout << "Surface is closed" << std::endl;
	}

完整代码

#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>

int main(int, char *[])
{
	vtkSmartPointer<vtkDiskSource> diskSource =
		vtkSmartPointer<vtkDiskSource>::New();
	diskSource->Update();

	vtkSmartPointer<vtkFeatureEdges> boundaryEdges =
		vtkSmartPointer<vtkFeatureEdges>::New();
	boundaryEdges->SetInputConnection(diskSource->GetOutputPort());
	boundaryEdges->BoundaryEdgesOn();
	boundaryEdges->FeatureEdgesOff();
	boundaryEdges->ManifoldEdgesOff();
	boundaryEdges->NonManifoldEdgesOff();
	boundaryEdges->Update();

	vtkSmartPointer<vtkFeatureEdges> closedSurface =
		vtkSmartPointer<vtkFeatureEdges>::New();
	closedSurface->SetInputConnection(diskSource->GetOutputPort());
	closedSurface->FeatureEdgesOff();
	closedSurface->BoundaryEdgesOn();
	closedSurface->NonManifoldEdgesOn();
	closedSurface->Update();
	int numberOfOpenEdges = closedSurface->GetOutput()->GetNumberOfCells();
	if (numberOfOpenEdges > 0)
	{
		std::cout << "Surface is not closed" << std::endl;
	}
	else
	{
		std::cout << "Surface is closed" << std::endl;
	}

	// Visualize
	vtkSmartPointer<vtkPolyDataMapper> edgeMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	edgeMapper->SetInputConnection(boundaryEdges->GetOutputPort());
	vtkSmartPointer<vtkActor> edgeActor =
		vtkSmartPointer<vtkActor>::New();
	edgeActor->SetMapper(edgeMapper);

	vtkSmartPointer<vtkPolyDataMapper> diskMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	diskMapper->SetInputConnection(diskSource->GetOutputPort());
	vtkSmartPointer<vtkActor> diskActor =
		vtkSmartPointer<vtkActor>::New();
	diskActor->SetMapper(diskMapper);

	// Create a renderer, render window, and interactor
	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->SetSize(400, 400);
	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;
}

Ref

vtkFeatureEdges Class Reference
BoundaryEdges
ClosedSurface

在这里插入图片描述

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: vtk是一种图形库,用于可视化数据。在vtk中,“点”、“线”和“面”是常见的几何元素。下面是关于这些元素的一些示例: 1. 点(Point):点是空间中具有坐标位置的最基本的几何元素。在vtk中,我们可以创建一个或多个点,并指定它们的坐标。例如,我们可以创建一个点的集合,表示星空中的一些恒星的位置。每个点都有自己的坐标,可以在三维空间中进行可视化。 2. 线(Line):线是由两个或更多个连接起来的点组成的几何形状。在vtk中,我们可以使用点的坐标来创建一条直线。例如,我们可以创建一个由两个点组成的线,表示一条直线段的路径。这条直线可以用来表示一条河流的流程,或者是一辆车在道路上行驶的路径。 3. 面(Surface):面是由三个或更多个连接起来的点和线组成的几何形状。在vtk中,我们可以使用点的坐标和线的连接关系来创建一个面。例如,我们可以创建一个三角形的面,通过指定三个点的坐标来定义。这个三角形可以用来表示一个地面的形状,或者是一个房屋的屋顶的形状。 总之,vtk提供了一种便捷的方式来创建和可视化各种几何元素,包括点、线和面。通过使用vtk,我们可以将这些几何元素在三维空间中进行可视化,并用于表示和展示各种数据的形状和结构。 ### 回答2: VTK(Visualization Toolkit)是一个强大的图形可视化库,它提供了丰富的功能和工具,可以用于创建各种类型的图形对象和可视化效果。在VTK中,可以使用点、线和面作为基本的图形元素。 在VTK中,点是最简单的图形元素之一。它可以用于表示空间中的一个坐标点,具有位置属性。例如,我们可以使用VTK创建一个点的可视化效果,通过设置其位置和颜色来定义点的属性,从而实现对点的可视化表达。 线是由多个点连接而成的线段。在VTK中,可以使用一系列的点来创建一条线,并通过设置线的属性,如线宽、颜色、透明度等来实现线的可视化效果。例如,我们可以通过VTK创建一个由多个点组成的路径,用来表示动态的物体运动轨迹。 面是由多条连续的线组成的封闭区域。在VTK中,可以使用一系列的坐标点来定义一个封闭的多边形,并通过设置面的属性,如颜色、透明度、纹理等来实现面的可视化效果。例如,我们可以使用VTK创建一个立方体的可视化效果,通过定义六个面和对应的坐标点来表示立方体的各个面。 总结起来,VTK中的点、线和面都是用于表示图形对象的基本元素,可以通过设置它们的属性来实现各种形式的可视化效果。无论是单独使用还是组合使用,这些元素都为图形的创建和可视化提供了灵活和多样的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值