Python 从闭环平面轮廓数组创建三角形网格的实现

Python Implementation for creating a triangular mesh from an array of closed loop planar contours

我有点卡住了。

我有一个 3D 点云((n,3) 个顶点的数组),我试图从中生成 3D 三角形网格。到目前为止我还没有运气。

我的数据格式:

插图:

Z=2. : ..x-------x...   <- Contour 2
Z=1.5: ...\......|...   <- Join the two contours into a mesh.
Z=1. : .....x----x...   <- Contour 1
Repeat for n slices, end up with an enclosed 3D triangular mesh.

我尝试过的东西:

鉴于我的数据是一个闭环平面轮廓列表,似乎必须有一些简单的解决方案来将相邻的切片轮廓“连接”到一个大的 3d 网格中。有点像你在搅拌机里。 有非 python 解决方案(如 MeshLab)可以很好地解决这些问题,但我需要 python 解决方案。有人有什么想法吗?我已经对 VTK 和 ITK 进行了一些研究,但到目前为止还没有找到我正在寻找的东西。

我也开始考虑也许我可以在切片之间插入中间轮廓,并用顶点填充顶部和底部的轮廓,以使数据对“枢轴球”方法更友好。

在此先感谢您的帮助,不胜感激。 如果有一个尚未编码的好方法,我保证将其编码并提供给处于我情况的人:)

实际上有两种方法可以在 python 中使用 meshlab 功能:

  1. 第一个是MeshLabXML(https://github.com/3DLIRIOUS/MeshLabXML)第三方,是一个Python脚本接口到meshlab脚本接口
  2. 第二个是 PyMeshLab (https://github.com/cnr-isti-vclab/PyMeshLab) MeshLab 作者正在进行的一项工作,(目前处于 alpha 阶段)直接 Python 绑定到所有 meshlab 过滤器

Journal of Medical Physics 中有一篇标题为 "Technical Note: an algorithm and software for conversion of radiotherapy contour‐sequence data to ready‐to‐print 3D structures" 的论文很好地描述了这个问题。不需要 python 包,但是使用 numpy 更容易实现。无需任何 3D 包。

提供了有用的摘录: ...

  1. 确定构成指定结构的切片(二维轮廓)的数量。
  2. 确定每个切片中的点数。
  3. 提取每个切片中每个点的笛卡尔坐标并将其存储在专用数据结构中...
  4. 每个切片(曲线)中的点数重新排列,起始点(索引为 0 的点)是后续切片之间最近的点。重新枚举从点 0 开始,切片 0(z 坐标最低的切片)。
  5. 确定每条曲线的方向(即,由与曲线的interior/exterior相关的点的递增指数确定的方向)。如果发现切片之间存在差异,则反转不匹配曲线中点的编号(以及方向)。
  6. 所考虑结构的侧面被离散化。相邻层的点排列成三个,构成 STL 文件的三角形面。对于每个三角形,最近的点与每一层的后续索引相连。
  7. 所考虑结构的下基面和上基面被离散化。该程序迭代曲线上的每三个后续点,并检查它们是否属于边缘的凸起部分。如果是,则将它们连接成一个面,并从进一步的迭代中删除中间点。

所以基本上这是一个将每个切片中的数据集与每个切片的最接近值对齐的问题。然后对齐每个轮廓的方向。然后根据距离连接两层之间的点。

该论文还提供了执行此操作的代码(针对 DICOM 文件),但是我 re-wrote 自己编写了它并且它很有魅力。

我希望这对其他人有帮助!确保在您使用此功能所做的任何工作中注明作者的姓名。

pymadcad can do things like this, not sure through if it fits your exact expectation in term of "pivot ball" or such things, checkout the doc for blending

的近期特色

从轮廓列表开始,它可以生成混合曲面来连接它们:

为了您的目的,我想最好的是以下之一:

  • blendpair(line1, line2)
  • junction(*lines)