Я пытаюсь использовать VTK Delaunay3D(), чтобы получить минимальную граничную поверхность для моих данных с использованием алгоритма alphaShapes. Конкретный набор данных, над которым я работаю, обычно имеет тороидальную или цилиндрическую форму, поэтому, насколько я понимаю, я должен попытаться найти значение <0 для альфы. Однако класс, похоже, не может обрабатывать отрицательные числа с плавающей запятой. Это может быть подтверждено этим минимальным примером:
#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, с использованием gcc версии 9.4.0 с CMake. ВТК 9.1 для С++.
Похоже, ваш код выполняет трехмерную триангуляцию Делоне, а не альфа-формы.
Из документация для Delaunay3D:
For a non-zero alpha value, only verts, edges, faces, or tetra contained within the circumsphere (of radius alpha) will be output.
В этой реализации триангуляции Делоне альфа — это радиус, который не может быть отрицательным.
Похоже, VTK молча меняет его на 0 прямо здесь, в коде: https://github.com/Kitware/VTK/blob/01f5cc18fd9f0c8e34a5de313d53d2178ff6e325/Filters/Core/vtkDelaunay3D.h#L129
В документации также прямо упоминается, что «альфа» - это не то же самое, что альфа в альфа-формах, это просто означает что-то похожее.
(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/геометрии, поэтому, возможно, я что-то упускаю, но похоже, что этот класс на самом деле не то, что вам нужно.
Поэтому попробуйте установить альфу как что-то маленькое и положительное, и если ваши данные имеют тороидальную форму, это, вероятно, даст вам то, что вы хотите.
уф, похоже, ты прав. Я также не являюсь доктором наук в области CS или геометрии, и я думаю, что я замазал эту строчку. К сожалению, уменьшение альфы в этом конкретном наборе данных просто разрушает поверхность, пока она полностью не фрагментируется, поэтому мне, возможно, придется найти другой алгоритм альфа-форм.