ExtractData 椭球的并集与函数的裁剪

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①vtkQuadric创建四次曲面的隐式函数,②vtkSampleFunction和vtkExtractGeometry的区别

二:代码及注释

python 复制代码
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonDataModel import vtkSphere, vtkQuadric, vtkImplicitBoolean
from vtkmodules.vtkCommonTransforms import vtkTransform
from vtkmodules.vtkFiltersExtraction import vtkExtractGeometry
from vtkmodules.vtkFiltersGeneral import vtkShrinkFilter
from vtkmodules.vtkFiltersModeling import vtkOutlineFilter
from vtkmodules.vtkImagingHybrid import vtkSampleFunction
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkDataSetMapper,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)
 
 
def main():
    colors = vtkNamedColors()
 
    """
    vtkQuadric 创建一个四次曲面的隐式函数
    vtkQuadric 类代表了一个由二次方程定义的曲面。这个方程通常是以下形式:
    
    这个类让你通过设置这个方程的系数来定义任何二次曲面,例如:球体,椭球体,圆锥体,抛物面,双曲面
    """
    quadric = vtkQuadric()
    """
    SetCoefficients() 方法用于设置方程的10个系数。
    这个方法接受一个包含10个浮点数的列表,对应于方程中的 A 到 J。
    这些系数共同定义了一个复杂的、类似于拉伸椭球体的形状
    """
    quadric.SetCoefficients(0.5, 1, 0.2, 0, 0.1, 0, 0, 0.2, 0, 0)
 
    sample = vtkSampleFunction()
    sample.SetImplicitFunction(quadric)
    sample.SetSampleDimensions(50, 50, 50)
    sample.ComputeNormalsOff()
 
    trans1 = vtkTransform()
    trans1.Scale(1, 0.5, 0.333)
    sphere1 = vtkSphere()
    sphere1.SetRadius(0.25)
    sphere1.SetTransform(trans1)
 
    trans2 = vtkTransform()
    trans2.Scale(0.25, 0.5, 1)
    sphere2 = vtkSphere()
    sphere2.SetRadius(0.25)
    sphere2.SetTransform(trans2)
 
    booleanUnion = vtkImplicitBoolean()
    booleanUnion.AddFunction(sphere1)
    booleanUnion.AddFunction(sphere2)
    booleanUnion.SetOperationTypeToUnion()  # 等价于booleanUnion.SetOperationType
 
    """
    下面这段代码的含义是:
    输入: 一个包含了四次曲面所有信息的三维体素网格
    筛选规则: 一个由两个椭球体融合而成的复杂形状
    输出: 四次曲面网格中所有位于两个椭球体并集内部的体素
    """
    extract = vtkExtractGeometry()
    extract.SetInputConnection(sample.GetOutputPort())
    extract.SetImplicitFunction(booleanUnion)
    # 添加下面这一行代码,得到不与椭球体并集重叠的部分
    #extract.ExtractInsideOff()
 
    """
    vtkSampleFunction和vtkExtractGeometry都有"基于隐函数做集合处理"的功能,但原理和结果差别很大
    vtkSampleFunction
    作用:把一个 隐函数(vtkImplicitFunction,比如 vtkSphere, vtkBox, vtkImplicitBoolean 等)采样到一个规则的三维网格(vtkImageData)上。
    结果:生成的是 标量场 (volume / image),每个 voxel 存储函数值。
    常用场景:
    想通过隐函数生成一个 3D 标量场,再用 vtkContourFilter / vtkMarchingCubes / vtkFlyingEdges3D 去提取等值面。
    例如:用 vtkSphere 生成一个标量场,然后提取球体表面。
    👉 它的重点是 数值采样(离散化),生成体素数据。
    
    vtkExtractGeometry
    作用:直接从一个已有的数据集(vtkDataSet,如 vtkPolyData 或 vtkUnstructuredGrid)中,
    提取出 在隐函数内部/外部 的几何体。
    结果:生成的是 子集几何 (subset geometry),不改变原始拓扑,只是"筛选"。
    常用场景:
    已经有一个复杂模型(例如医学 CT 数据提取出来的网格,或者 CAD 模型),
    只想保留其中在某个隐函数(比如球体或平面)内部的部分。
    相当于"裁剪 (clipping)"或"掩模 (masking)"。
👉 它的重点是 过滤现有几何,而不是生成标量场。
    """
 
    shrink = vtkShrinkFilter()
    shrink.SetInputConnection(extract.GetOutputPort())
    shrink.SetShrinkFactor(0.5)
 
    dataMapper = vtkDataSetMapper()
    dataMapper.SetInputConnection(shrink.GetOutputPort())
    dataActor = vtkActor()
    dataActor.SetMapper(dataMapper)
 
    outline = vtkOutlineFilter()
    outline.SetInputConnection(sample.GetOutputPort())
    outlineMapper = vtkPolyDataMapper()
    outlineMapper.SetInputConnection(outline.GetOutputPort())
 
    outlineActor = vtkActor()
    outlineActor.SetMapper(outlineMapper)
    outlineActor.GetProperty().SetColor(0, 0, 0)
 
    ren1 = vtkRenderer()
    ren1.AddActor(outlineActor)
    ren1.AddActor(dataActor)
    ren1.SetBackground(colors.GetColor3d("SlateGray"))
 
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren1)
 
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    renWin.SetSize(640, 480)
    renWin.SetWindowName('ExtractData')
 
    renWin.Render()
    ren1.GetActiveCamera().Azimuth(30)
    ren1.GetActiveCamera().Elevation(30)
 
    renWin.Render()
    iren.Start()
 
 
if __name__ == '__main__':
    main()
相关推荐
书香门第18 分钟前
搭建免费的Ollama AI Agent
人工智能·python·ollama
小白学大数据20 分钟前
分布式爬虫核心技术详解与工程实践
开发语言·分布式·爬虫·python
Ulyanov21 分钟前
打造现代化雷达电子对抗仿真界面 第二篇:雷达电子对抗仿真系统核心功能实现
前端·python·信息可视化·数据可视化·系统仿真·雷达电子战
财经资讯数据_灵砚智能24 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年4月12日
人工智能·python·信息可视化·自然语言处理·ai编程
测试秃头怪43 分钟前
python&selenium自动化测试实战项目详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
踏着七彩祥云的小丑1 小时前
Python——字符串常用操作
开发语言·python
阿钱真强道1 小时前
05 ComfyUI + SVD 系列(三):最小图生视频工作流拆解——节点含义、输入输出、参数作用与核心实验
python·aigc·stable-diffusion·svd·comfyui·工作流·图生视频
xcjbqd01 小时前
Python中Pandas如何将DataFrame写入MySQL_使用to_sql函数
jvm·数据库·python
蓝色的杯子1 小时前
Python面试30分钟突击掌握-LeetCode3-Linked list
python·leetcode·面试
ZC跨境爬虫1 小时前
海南大学交友平台开发实战 day10(后端向前端输出_前端读取数据全流程联调+日志调试落地)
前端·python·sqlite·html·状态模式