文章目录
- 一、vtkBool
- 1.1 安装
- 1.2 使用
- 1.3 效果
- 二、CGAL
本文的主要内容:VTK内置的布尔运算类具有稳定性差、计算时间长等缺点,为了避免使用VTK内置的布尔运算,本文简单介绍了两个比较实用的库用于替代,主要涉及vtkBool和CGAL库的使用方法。
哪些人适合阅读本文:有一定VTK基础的人。
一、vtkBool
vtkbool是VTK 布尔运算功能的扩展,主要用于多边形网格上的布尔运算,比VTK自带的布尔运算更稳定。源代码地址:https://github.com/zippy84/vtkbool
1.1 安装
如果想要从源代码安装的,可以直接查看源码页面的安装步骤。如果想直接使用的话只需要下面四个文件:
![[vtkbool files.png|240]]
1.2 使用
在使用vtkBool的时候只需要在CmakeList.txt加入vtkbool的头文件、lib文件、dll文件就可以了:
# 使用vtkbool
include_directories("vtkbool-bin")
find_library(VTKBOOL_LIBRARY_RELEASE vtkBool.lib "vtkbool-bin")
file(COPY "vtkbool-bin/vtkBool.dll" DESTINATION "Release")
一个简单的使用demo:
#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkCylinderSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataMapper.h>
#include "vtkPolyDataBooleanFilter.h"
int main (int argc, char *argv[]) {
auto cube = vtkSmartPointer<vtkCubeSource>::New();
cube->SetYLength(.5);
auto cy = vtkSmartPointer<vtkCylinderSource>::New();
cy->SetResolution(32);
cy->SetHeight(1.0);
cy->SetCenter(0, 0, 0);
auto bf = vtkSmartPointer<vtkPolyDataBooleanFilter>::New();
bf->SetInputConnection(0, cube->GetOutputPort());
bf->SetInputConnection(1, cy->GetOutputPort());
bf->SetOperModeToUnion();
//bf->SetOperModeToDifference();
//bf->SetOperModeToIntersection();
bf->Update();
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputData(bf->GetOutput());
mapper->SetScalarVisibility(false);
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(renderer);
renWin->SetWindowName("bool");
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);
renderer->AddActor(actor);
renderer->ResetCamera();
renWin->SetSize(600, 600);
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}
1.3 效果
运行demo程序,通过修改bool运算规则可以得到Union,Difference,Intersection的效果。
bf->SetOperModeToUnion();
//bf->SetOperModeToDifference();
//bf->SetOperModeToIntersection();
- Union
- Diference
- Intersection