第05章 16 Implicit Function应用举例

server/2025/2/2 0:16:35/

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 FunctionvtkSmartPointer<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和ActorvtkSmartPointer<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 FunctionvtkSmartPointer<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和ActorvtkSmartPointer<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 FunctionvtkSmartPointer<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.ppmy.cn/server/164201.html

相关文章

GPMC介绍

一、GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口&#xff0c;是AM335x、AM437x、AM5708、AM5728等处理器专用于与外部存储器设备的接口&#xff0c;如&#xff1a; ● 异步SRAM内存和专用集成电路(ASIC)设备。 ● 异步&…

【Unity】cinemachine核心知识

cinemachine核心知识 cinemachineVirtualCamera中body参数作用cinemachineVirtualCamera中body有哪些选项cinemachineVirtualCamera中am参数作用以及选项 cinemachineVirtualCamera中body参数作用 在 Unity 的 Cinemachine Virtual Camera 中&#xff0c;Body 参数模块主要负责…

Android NDK

Android NDK环境 D:\Android SDK\ndk\25.2.9519653 使用clang而不用gcc D:\Android SDK\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\clang --version 查看是否安装成功clang ptrace 在 C 语言中&#xff0c;ptrace 已经被 Linux 内核实现&#xff0…

具身智能体空间感知基础!ROBOSPATIAL:评测并增强2D和3D视觉语言模型空间理解水平

作者&#xff1a;Chan Hee Song, Valts Blukis,Jonathan Tremblay, Stephen Tyree, Yu Su, Stan Birchfield 单位&#xff1a;俄亥俄州立大学&#xff0c;NVIDIA 论文标题&#xff1a;ROBOSPATIAL: Teaching Spatial Understanding to 2D and 3D Vision-Language Models for …

MySQL 插入数据

MySQL 插入数据 引言 在数据库管理系统中&#xff0c;MySQL 是一款广泛使用的开源关系型数据库管理系统。数据插入是数据库操作的基础之一&#xff0c;它涉及将数据添加到数据库的表中。本文将详细介绍 MySQL 中插入数据的方法&#xff0c;包括基本的插入语法、多行插入、以及…

YOLOv8改进,YOLOv8检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等,全网独发

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…

SSM开发(九) mybatis多表查询(举例说明)

目录 一、背景 二、一对一查询 三、一对多查询 一、背景 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 mysql表设计: 二、一对一查询 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 实体: @Data public class Order {pr…

使用numpy自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预

1. 引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种常见的分类算法&#xff0c;广泛应用于二分类问题。在本篇博客中&#xff0c;我们将使用numpy生成一个简单的自定义数据集&#xff0c;并使用TensorFlow框架构建和训练逻辑回归模型。训练完成后&#xff0c…