vtk的截面多边形裁切和质心的探索实验之一:求当前截面椎弓根质心

缘起

在这里插入图片描述
问题一:求当前截面椎弓根质心
问题二:求当前截面椎管的质心

探索

思路之一:vtkcylinder + vtkplane + vtk.vtkClipPolyData() + VTK-VtkCutter

vtkImplicitFunction

【译】> 详细说明


隐式函数的抽象接口

vtkImplicitFunction 为隐式函数指定一个抽象接口。隐式函数是在 3D 空间中定义的实值函数,w = F(x,y,z)。需要两个基元运算:评估函数的能力,以及给定点处的函数梯度(参见> - 💡: 关于函数梯度与导数 - 知乎)。隐式函数将空间划分为三个区域:在曲面上 (F(x,y,z)=w)、曲面外部 (F(x,y,z)>c) 和曲面内部 (F(x,y,z)<c)。(当 c 为零时,正值在外部,负值在内部,零在表面上。另请注意,函数渐变从内部指向外部。

隐式函数非常强大。可以使用级别集 w = const 表示几乎任何类型的几何图形,尤其是在使用隐式函数的布尔组合时(请参阅 vtkImplicitBoolean)。

vtkImplicitFunction 提供了一种通过 vtkAbstractTransform 转换隐式函数的机制。此功能可用于转换、定向、缩放或扭曲隐式函数。例如,球体隐式函数可以转换为定向椭圆。

警告

转换将点转换为隐式函数的空间(即模型空间)。通常,我们希望将隐式模型转换为世界坐标。在这种情况下,需要变换的反函数。

Clipped from VTK: vtkImplicitFunction Class Reference at 2022-07-22.

  • ✎✎✎ : 没看懂🤔
vtkCylinder

【译】
圆柱体的隐式函数

vtkCylinder 使用 F(r)=r2-Radius2 计算圆柱体的隐式函数和函数梯度。vtkCylindervtkImplicitFunction 的具体实现。默认情况下,圆柱体以原点为中心,旋转轴沿 y 轴旋转。可以通过设置“中心”和“轴”数据成员来重定义旋转中心和轴。(请注意,如果需要,也可以使用超类的 vtkImplicitFunction 转换矩阵来重新定位,方法是使用 FunctionValue()FunctionGradient() 重新定位。

警告

圆柱体的范围是无限的。要在建模操作中截断圆柱体,请将 vtkImplicit 布尔值与修剪平面结合使用。

另请参见

vtkCylinderSource

  • ✎✎✎ : 还是费解🤔,可以上代码了

在这里插入图片描述

  • 注意⚠️: 这个圆柱cylinder无限长,和model的交集计算速度很快,显示不理想。。。似乎只有原点已近的有表面的可以显示。。。
vtkClipPolyData

【译】
使用用户指定的隐式函数或输入标量数据裁剪多边形数据

vtkClipPolyData 是一个过滤器,它使用 vtkImplicitFunction 的任何子类或输入标量数据来裁剪多边形数据。裁剪意味着它实际上“剪切”了数据集的单元格,返回指定隐式函数内部的所有内容(或大于标量值),包括单元格的“片段”。(将其与vtkExtractGeometry进行比较,后者提取整个未切割的单元格。此筛选器的输出是多边形数据。

若要使用此筛选器,必须确定是要使用隐式函数进行裁剪,还是要使用输入标量数据。如果要使用隐式函数进行剪辑,则必须:

  • 1) 定义隐式函数
  • 2) 使用 SetClipFunction 方法设置它
  • 3) 应用 GenerateClipScalarsOn 方法 如果未指定 ClipFunction 或 GenerateClipScalars 已关闭(默认值),则将使用输入的标量数据来裁剪 polydata。

您还可以指定标量值,该值用于确定隐式函数内部和外部的内容。您还可以通过设置 InsideOut 实例变量来反转内部/外部的含义。(切割算法通过计算隐式函数值或使用数据集中每个点的输入标量数据来进行。将其与标量值进行比较,以确定内部/外部。

此筛选器可以配置为计算第二个输出。第二个输出是裁剪掉的多边形数据。如果要访问此输出数据,请将 GenerateClippedData 布尔值设置为 on。

警告

为了剪切多边形数据中所有类型的单元格,vtkClipPolyData 对某些单元格进行三角测量,然后剪切生成的单纯形(即点、线和三角形)。这意味着生成的输出可能包含与输入数据不同的像元类型。

另请参见

vtkImplicitFunction vtkCutter vtkClipVolume vtkExtractGeometry

  • ✎✎✎ : 上面的那段代码用到了这个过滤器,关键语句如下
clipper = vtk.vtkClipPolyData()
clipper.SetInputData(model.GetPolyData()) # 装入原料
clipper.InsideOutOn() # 设置/获取 InsideOut 标志。默认关闭
clipper.SetClipFunction(cylinder) # 指定用于执行剪切的隐式函数。
# clipper.GenerateClippedOutputOn() # 控制是否生成第二个输出。
clipper.Update()
vtkPlane

【译】
执行各种平面计算

vtkPlane 提供了各种平面计算的方法。其中包括将点投影到平面上、计算平面方程以及返回平面法线。vtkPlane 是抽象类 vtkImplicitFunction 的具体实现。

  • ✎✎✎ : 我这里用的是截面功能,主要语句:

plane = vtk.vtkPlane()
plane.SetOrigin(p0)
plane.SetNormal(normal)
- vtkCutter

【译】使用用户指定的隐式函数剪切 vtkDataSet。

vtkCutter 是一个过滤器,用于使用 vtkImplicitFunction 的任何子类来剪切数据。也就是说,创建与隐式函数 F(x,y,z) = value(s) 相对应的多边形曲面,您可以在其中指定一个或多个用于切割的值。

在 VTK 中,切割意味着将尺寸为 N 的单元减小到尺寸 N-1 的切割表面。例如,四面体被平面切割时(即vtkPlane隐式函数)将生成三角形。(相比之下,剪切采用 N 维单元格并创建 N 维基元。

vtkCutter 通常用于“切片”数据集,生成可以可视化的表面。也可以使用 vtkCutter 执行某种形式的体积渲染。vtkCutter 通过生成多个切割曲面(通常是平面)来实现此目的,这些曲面从后到前排序(和渲染)。曲面设置为半透明,以提供体积渲染效果。

请注意,可以使用 1) 与数据集关联的标量值或 2) 与此类关联的隐式函数来剪切数据。默认情况下,如果设置了隐式函数,则使用该函数来裁剪数据集,否则将使用数据集标量来执行裁剪。

请注意,只要有可能,这个类就会委托给 vtkPlaneCutter,因为它专门用于平面,而且速度更快,因为它是多线程的,在某些情况下,算法也更快。

另请参见
vtkImplicitFunction vtkClipPolyData vtkPlaneCutter

  • ✎✎✎ : 好了, 我们来切一刀。。。且过之后在Slicer中看不到。。。不过呢可以采取polyData
质心计算法

质心(质心_百度百科

  • ✎✎✎ : 在Python之中我们可以通过np.mean或者np.average求出凸多面体的质心(几何质心)如下:

在这里插入图片描述

  • ✎✎✎ : 以上是第一个问题的解决,该怎么解决第二个问题呢?

《未完待续》

参考源:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jumbo Jing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值