自学内容网 自学内容网

VTK+其他布尔运算库


本文的主要内容: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
    ![[vtkbool union.png|350]]
  • Diference
    ![[vtkbool difference.png|348]]
  • Intersection
    ![[vtkbool interaction.png|348]]

二、CGAL


原文地址:https://blog.csdn.net/u014170067/article/details/142711956

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!