如何在 vtk Poly 数据上进行布尔运算?
How to do Boolean operations on vtk Poly Data?
我正在尝试使用 vtkBooleanOperationPolyDataFilter 类计算两个 vtkPolyData 之间的差异。我阅读了VTK示例网站中提供的唯一示例,并尝试使用它。
但是,我的问题有点不同,因为我有 .stl 文件。因此,首先我必须将.stl文件转换为vtkPolyData。我正在使用函数convert_stl_to_polydata()
.然后,我使用compute_difference()
来计算差值并写入输出。
#include <string>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkUnstructuredGrid.h>
#include <vtkXMLUnstructuredGridWriter.h>
#include <vtkBooleanOperationPolyDataFilter.h>
vtkSmartPointer<vtkPolyData> convert_stl_to_polydata (std::string input) {
auto stl_reader = vtkSmartPointer<vtkSTLReader>::New();
stl_reader->SetFileName (input.c_str());
stl_reader->Update();
auto poly_data = vtkSmartPointer<vtkPolyData>::New();
poly_data->ShallowCopy(stl_reader->GetOutput());
return poly_data;
}
void compute_difference (vtkSmartPointer<vtkPolyData> input1,
vtkSmartPointer<vtkPolyData> input2, std::string output) {
auto boolean_operation = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
boolean_operation->SetInputData (0, input1);
boolean_operation->SetInputData (1, input2);
boolean_operation->SetOperationToDifference();
boolean_operation->Update();
// write the result as an Unstructured Grid
auto unstructured_grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
unstructured_grid->ShallowCopy(boolean_operation->GetOutput());
auto writer = vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(output.c_str());
writer->SetInputData(unstructured_grid);
writer->SetDataModeToAscii();
writer->Update();
writer->Write();
}
int main () {
std::string input1_filename {"Data/input_1.stl"};
std::string input2_filename {"Data/input_2.stl"};
std::string diff_filename {"Data/difference.vtu"};
auto input1 = vtkSmartPointer<vtkPolyData>::New();
auto input2 = vtkSmartPointer<vtkPolyData>::New();
input1 = convert_stl_to_polydata(input1_filename);
input2 = convert_stl_to_polydata(input2_filename);
compute_difference (input1, input2, diff_filename);
return 0;
}
第一个功能工作正常。但是,当我使用 paraview 打开第二个函数的输出文件时,它是空的。有关更多信息,我使用的是 VTK 8.2.0。
问题
- 我是否正确使用了 vtkBooleanOperationPolyDataFilter?
- 是否可以直接在 STL 网格上使用布尔运算?
我感谢任何改进代码的建议。
- 是的,您正确使用
vtkBooleanOperationPolyDataFilter
。 vtkSTLReader
创建一个vtkPolyData
,它是布尔运算过滤器的正确输入容器。因此:是的,可以读取 STL 并立即使用vtkBooleanOperationPolyDataFilter
处理它们。
将输出从vtkPolyData
转换为vtkUnstructuredGrid
时会丢失一些信息。我认为浅拷贝只复制点,而不复制单元格。您是否检查了以下内容?
std::cout << unstructured_grid->GetNumberOfCells() << std::endl;
std::cout << unstructured_grid->GetNumberOfPoints() << std::endl;
由于vtkBooleanOperationPolyDataFilter
的输出是vtkPolyData
,因此将其转换为非结构化网格没有多大意义。
vtkUnstructuredGrid
通常用于表示体积网格,而您没有体积网格。vtkPolyData
是表示曲面网格的标准容器。
关于样式,我宁愿为读者使用已经存在的智能指针进行操作,而不是为多边形数据创建一个新的指针。
vtkSmartPointer<vtkSTLReader> read_stl (std::string input) {
auto stl_reader = vtkSmartPointer<vtkSTLReader>::New();
stl_reader->SetFileName (input.c_str());
stl_reader->Update();
return stl_reader;
}
然后,将数据转发到布尔过滤器:
auto boolean_operation = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
boolean_operation->SetInputConnection (0, input1->GetOutputPort());
boolean_operation->SetInputConnection (1, input2->GetOutputPort());
boolean_operation->SetOperationToDifference();
boolean_operation->Update();
只是一个建议。如果您还不知道该资源,请在此处找到大量示例。
关于您的问题
-
我不确定为什么要将
boolean_operation->GetOutput()
传递给非结构化网格而不是vtkPolyData
-
在 VTK 中,您始终使用由
vtkPolyData
对象表示的多边形数据。
- 如何在 vtk Poly 数据上进行布尔运算?
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 如何通过 mpi c++ 发送布尔数据类型?
- 如何在 C++ 中执行布尔运算
- C++中混合数据类型的算术运算
- integral_constant的编译时布尔运算
- C++ 包含针对多种类型数据的布尔测试的模板会获得匹配错误
- 将临时值存储为某种数据类型时,算术运算的标准规则是什么
- 这是什么布尔运算?“表达式 * 布尔值”
- (C++,提升::变体)提升变体映射的数据类型并对其执行数学运算
- 表达式中的布尔运算
- Visual Studio无法在布尔运算的上下文中实例化强制转换运算符模板(T=bool)
- 为什么没有最小尺寸的布尔数据类型
- 如何在C++中对大数据整数进行加法、求和、乘法和除法运算
- 使用 CGAL,是否可以在开放多边形网格上执行布尔运算
- 将 int 分配给三元运算的布尔值
- C++如何在容器中加载 16 位 TIFF 文件以对其数据执行数学运算
- 如何在Armadillo中的矩阵中执行元素布尔运算
- 二维矩形的布尔运算
- C++—布尔运算