当前位置: 首页 > article >正文

第05章 16 Implicit Function应用举例

Implicit Function在VTK中有多种广泛的应用场合,以下是一些主要的应用场景及其详细说明:

1. 几何裁剪(Clipping)

Implicit Function可以用于对几何体进行裁剪,生成新的几何形状。裁剪操作通常基于一个Implicit Function的等值面(如零值面)来分割几何体。例如,可以使用一个球形Implicit Function来裁剪一个立方体,生成一个被球形裁剪的立方体形状。

应用场景:

  • 生成复杂的几何形状。
  • 对几何体进行局部裁剪,用于分析或可视化。

代码示例:

#include <vtkSmartPointer.h>
#include <vtkSphere.h>
#include <vtkPlane.h>
#include <vtkImplicitBoolean.h>
#include <vtkCubeSource.h>
#include <vtkClipPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建一个立方体源
    vtkSmartPointer<vtkCubeSource> cubeSource = 
        vtkSmartPointer<vtkCubeSource>::New();
    cubeSource->Update();

    // 创建一个球形Implicit Function
    vtkSmartPointer<vtkSphere> sphere = 
        vtkSmartPointer<vtkSphere>::New();
    sphere->SetRadius(0.5);
    sphere->SetCenter(0.0, 0.0, 0.0);

    // 使用Implicit Function进行裁剪
    vtkSmartPointer<vtkClipPolyData> clipper = 
        vtkSmartPointer<vtkClipPolyData>::New();
    clipper->SetInputConnection(cubeSource->GetOutputPort());
    clipper->SetClipFunction(sphere);
    clipper->Update();

    // 创建Mapper和Actor
    vtkSmartPointer<vtkPolyDataMapper> mapper = 
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(clipper->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = 
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建渲染器、渲染窗口和交互器
    vtkSmartPointer<vtkRenderer> renderer = 
        vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = 
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = 
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 添加Actor并启动渲染
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.3);
    renderWindow->Render();
    interactor->Start();

    return EXIT_SUCCESS;
}

代码说明:

  • 使用 vtkCubeSource 创建一个立方体几何体。
  • 使用 vtkSphere 创建一个球形Implicit Function。
  • 使用 vtkClipPolyData 对立方体进行裁剪,生成被球形裁剪后的立方体形状。
2. 表面提取(Surface Extraction)

Implicit Function可以用于提取几何形状的表面。典型的应用是通过Marching Cubes算法从Implicit Function中提取等值面,生成三维表面网格。

应用场景:

  • 从标量场中提取等值面。
  • 生成三维模型的表面。

代码示例:

#include <vtkSmartPointer.h>
#include <vtkSphere.h>
#include <vtkSampleFunction.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建一个球形Implicit Function
    vtkSmartPointer<vtkSphere> sphere = 
        vtkSmartPointer<vtkSphere>::New();
    sphere->SetRadius(1.0);
    sphere->SetCenter(0.0, 0.0, 0.0);

    // 对Implicit Function进行采样
    vtkSmartPointer<vtkSampleFunction> sample = 
        vtkSmartPointer<vtkSampleFunction>::New();
    sample->SetImplicitFunction(sphere);
    sample->SetModelBounds(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);
    sample->SetSampleDimensions(50, 50, 50);
    sample->Update();

    // 使用Marching Cubes提取等值面
    vtkSmartPointer<vtkMarchingCubes> surface = 
        vtkSmartPointer<vtkMarchingCubes>::New();
    surface->SetInputConnection(sample->GetOutputPort());
    surface->SetValue(0, 0.0); // 提取零值面
    surface->Update();

    // 创建Mapper和Actor
    vtkSmartPointer<vtkPolyDataMapper> mapper = 
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(surface->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = 
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建渲染器、渲染窗口和交互器
    vtkSmartPointer<vtkRenderer> renderer = 
        vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = 
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = 
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 添加Actor并启动渲染
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.3);
    renderWindow->Render();
    interactor->Start();

    return EXIT_SUCCESS;
}

代码说明:

  • 使用 vtkSphere 创建一个球形Implicit Function。
  • 使用 vtkSampleFunction 对Implicit Function进行采样,生成一个标量场。
  • 使用 vtkMarchingCubes 从标量场中提取等值面(零值面),生成球体的表面网格。
3. 空间查询(Spatial Query)

Implicit Function可以用于空间查询,判断某个点是否在几何形状内部或外部。这种功能在碰撞检测、布尔运算等场景中非常有用。

应用场景:

  • 碰撞检测。
  • 几何体内部/外部判断。

代码示例:

#include <vtkSmartPointer.h>
#include <vtkSphere.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkProbeFilter.h>
#include <vtkPointData.h>
#include <vtkFloatArray.h>
#include <vtkDataSetMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建一个球形Implicit Function
    vtkSmartPointer<vtkSphere> sphere = 
        vtkSmartPointer<vtkSphere>::New();
    sphere->SetRadius(1.0);
    sphere->SetCenter(0.0, 0.0, 0.0);

    // 创建一组测试点
    vtkSmartPointer<vtkPoints> points = 
        vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint(0.0, 0.0, 0.0); // 球心
    points->InsertNextPoint(1.5, 0.0, 0.0); // 球外
    points->InsertNextPoint(0.5, 0.0, 0.0); // 球内

    vtkSmartPointer<vtkPolyData> pointData = 
        vtkSmartPointer<vtkPolyData>::New();
    pointData->SetPoints(points);

    // 使用ProbeFilter进行空间查询
    vtkSmartPointer<vtkProbeFilter> probe = 
        vtkSmartPointer<vtkProbeFilter>::New();
    probe->SetInputData(pointData);
    probe->SetSourceData(pointData);
    probe->SetProbeTypeToPoints();
    probe->Update();

    // 获取查询结果
    vtkFloatArray* scalars = vtkFloatArray::SafeDownCast(
        probe->GetOutput()->GetPointData()->GetScalars());

    for (vtkIdType i = 0; i < points->GetNumberOfPoints(); i++)
    {
        double value = scalars->GetValue(i);
        std::cout << "Point " << i << ": " << value << std::endl;
    }

    return EXIT_SUCCESS;
}

代码说明:

  • 使用 vtkSphere 创建一个球形Implicit Function。
  • 创建一组测试点,使用 vtkProbeFilter 对这些点进行空间查询,判断它们是否在球形内部或外部。

总结

Implicit Function在VTK中具有广泛的应用,包括几何裁剪、表面提取和空间查询等。通过Implicit Function,可以方便地定义几何形状并执行各种几何操作。代码示例展示了如何使用VTK中的Implicit Function进行裁剪、表面提取和空间查询,帮助用户理解其使用方法和应用场景。


http://www.kler.cn/a/527315.html

相关文章:

  • C# Winform制作一个登录系统
  • 你了解哪些Java限流算法?
  • C#,入门教程(13)——字符(char)及字符串(string)的基础知识
  • Java创建项目准备工作
  • c++:vector
  • 剑指 Offer II 008. 和大于等于 target 的最短子数组
  • 【蓝桥杯】43697.机器人塔
  • origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
  • 知识库管理如何推动企业数字化转型与创新发展的深层次探索
  • 智联出行公司布局中国市场,引领绿色出行新潮流
  • riscv xv6学习笔记
  • 使用vhd虚拟磁盘安装两个win10系统
  • cmd命令行无法进入D:盘怎么办
  • 论文阅读笔记 —— 英文论文常见缩写及含义
  • 优盘恢复原始容量工具
  • 为AI聊天工具添加一个知识系统 之73 详细设计之14 正则表达式 之1
  • deepseek本地部署使用教程
  • three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
  • 可被electron等调用的Qt截图-录屏工具【源码开放】
  • 根据每月流量和市场份额排名前20 的AI工具列表
  • langgraph实现 handsoff between agents 模式 (1)
  • 自定义数据集 使用paddlepaddle框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • 99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)
  • Jenkins 的安装(详细教程)_jenkins安装
  • 彩色控制台,自动换行...学习个新概念:流操控器![more cpp--11]
  • Python酷库之旅-第三方库Pandas(103)