vtkDelaunay3D::SetAlpha() 不接受小于 0 的值

vtkDelaunay3D::SetAlpha() does not accept values below 0

我正在尝试使用 VTK 的 Delaunay3D() 通过 alphaShapes 算法在我的数据上获得最小边界表面。我正在处理的特定数据集通常是环形或圆柱形的,因此据我了解,我应该尝试为 alpha 找到一个 < 0 的值。然而,class 似乎无法处理负浮点数。这可以通过这个最小的例子来证实:

#include <iostream>
#include <vtkSmartPointer>
#include <vtkDelaunay3D>

void test() {
    vtkSmartPointer<vtkDelaunay3D> dataMesh = vtkSmartPointer<vtkDelaunay3D>::New();
    dataMesh->SetAlpha(-.1);
    std::cout << dataMesh->GetAlpha() << std::endl;
}

int main(void) {
    test();
}

我得到 0 的输出,这反映在我的实际数据的可视化中 -- 我得到了一个丑陋的大钻石而不是一个漂亮的甜甜圈。如果 SetAlpha() 被赋予正值,VTK 将按预期响应。

这是一个已知问题吗?有解决方法吗?

系统:Ubuntu 20.04,使用带有 CMake 的 gcc 版本 9.4.0。适用于 C++ 的 VTK 9.1。

看起来您的代码正在执行 3D Delaunay 三角剖分,而不是 alpha 形状。

来自 Delaunay3D 的 documentation

For a non-zero alpha value, only verts, edges, faces, or tetra contained within the circumsphere (of radius alpha) will be output.

在此 Delaunay 三角剖分的实现中,alpha 是不能为负的半径。

看起来 VTK 正在代码中悄悄地将其更改为 0:https://github.com/Kitware/VTK/blob/01f5cc18fd9f0c8e34a5de313d53d2178ff6e325/Filters/Core/vtkDelaunay3D.h#L129

文档还明确提到“alpha”与 alpha 形状中的 alpha 不同,它只是表示类似的东西。

(The notion of alpha value is derived from Edelsbrunner's work on "alpha shapes".) Note that a modification to alpha shapes enables output of combinations of tetrahedra, triangles, lines, and/or verts (see the boolean ivars AlphaTets, AlphaTris, AlphaLines, AlphaVerts).

我不是 CS/Geometry 的博士,所以也许我遗漏了什么,但似乎 class 并不是你想要的。

所以尝试将 alpha 设置为小而正的值,如果您的数据是环形的,它可能会满足您的要求。