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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴普蒂斯塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值