• VTK - Boolean布尔操作


    简介:本博文记录vtk关于布尔操作的应用,以及其中的坑,供小伙伴参考。

    VTK中包含可以执行布尔操作的接口有vtkImplicitBoolean,vtkBooleanOperationPolyDataFilter,vtkLoopBooleanPolyDataFilter。

    布尔操作包括:布尔加,布尔减和布尔交。

    1.vtkImplictiBoolean

    位置:Filters\DataModel

    用途:隐函数,用于布尔运算

    用法:

    1. // create a sphere
    2. auto sphere =
    3. vtkSmartPointer::New();
    4. sphere->SetCenter(1.0, 0.0, 0.0);
    5. sphere->SetRadius(1);
    6. //create a box
    7. auto box =
    8. vtkSmartPointer::New();
    9. box->SetBounds(-1, 1, -1, 1, -1, 1);
    10. // combine the two implicit functions
    11. auto boolean =
    12. vtkSmartPointer::New();
    13. boolean->SetOperationTypeToDifference();
    14. // boolean->SetOperationTypeToUnion()
    15. // boolean->SetOperationTypeToIntersection()
    16. boolean->AddFunction(box);
    17. boolean->AddFunction(sphere);
    18. //The sample function generates a distance function from the implicit
    19. //function.This is then contoured to get a polygonal surface.
    20. auto sample =
    21. vtkSmartPointer::New();
    22. sample->SetImplicitFunction(boolean);
    23. sample->SetModelBounds(-1, 2, -1, 1, -1, 1);
    24. sample->SetSampleDimensions(40, 40, 40);
    25. sample->ComputeNormalsOff();
    26. // contour
    27. auto surface =
    28. vtkSmartPointer::New();
    29. surface->SetInputConnection(sample->GetOutputPort());
    30. surface->SetValue(0, 0.0);
    31. //surface->vtkPolyDataMapper->vtkActor

    2.vtkBooleanOperationPolyDataFilter

    位置:Filters\General

    用途:该接口用于计算边界的Union,intersection,difference。

    限制:输入的数据可接受non-manifold,但生成的结果可能不是我们想要的。

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

    检测是不是manifold,可通过vtkFeatureEdges接口进行检测

    1. // 检测模型是否为Closed
    2. vtkSmartPointer closedSurface =
    3. vtkSmartPointer::New();
    4. closedSurface->SetInputConnection(diskSource->GetOutputPort());
    5. closedSurface->FeatureEdgesOff();
    6. closedSurface->BoundaryEdgesOn();
    7. closedSurface->NonManifoldEdgesOn();
    8. closedSurface->Update();
    9. int numberOfOpenEdges = closedSurface->GetOutput()->GetNumberOfCells();
    10. if (numberOfOpenEdges > 0)
    11. {
    12. std::cout << "Surface is not closed" << std::endl;
    13. }
    14. else
    15. {
    16. std::cout << "Surface is closed" << std::endl;
    17. }

    用法:

    1. vtkBooleanOperationPolyDataFilter* operation = vtkBooleanOperationPolyDataFilter::New();
    2. operation->SetOperationToUnion();
    3. vtkPolyData* polyData1 = ...;
    4. vtkPolyData* polyData2 = ...;
    5. operation->SetInputData(0, polyData1);
    6. operation->SetInputData(1, polyData2);
    7. operation->Update();

    3. vtk中布尔减存在的问题

    下图左侧为VTK生成的结果(vtkBooleanOperationPolyDataFilter和vtkLoopBooleanPolyDataFilter均会产生此种情况),右侧为3-matic生成的结果。vtk生成的结果存在BadEdges及BadContour。

    究其原因为vtkIntersectionPolyDataFilter的结果有误,如下图所示。

    更多细节请查看:https://blog.csdn.net/qq_40041064/article/details/129793184

  • 相关阅读:
    python+django高校志愿者活动报名系统vue+elementui
    酷开科技为你的电视增添魅力,点亮每一个娱乐瞬间!
    powerdesigner显示列的中文注释
    手写call方法
    ResNet-50的网络结构:
    【虹科新品】HK-MR340系列传感器产品介绍合集
    Leetcode hot 100之二叉树
    vue时间选择器更改默认结束时间为23:59:59
    L1-020 帅到没朋友(Python3)
    oracle创建表空间及查看表空间和使用情况
  • 原文地址:https://blog.csdn.net/qq_40041064/article/details/127843761