Вычислите максимальную длину ребра для разделения сетки

#geometry #mesh #vtk #area #triangulation

Вопрос:

У меня есть две триангулированные сетки m m1 со следующими свойствами:

 m_faces: 16640
m_points: 49920
m_surface_area: 178.82696989147524

m1_faces: 8
m1_points: 24
m1_surface_area: 1.440205667851934
 

Теперь я хотел бы разделить m1 его так, чтобы он имел ок. тот же номер лица m , что и, например, 16640. Я использую библиотеку vtk и, более конкретно, функцию vtkAdaptiveSubdivisionFilter (), которая в соответствии с описанием:

 …is a filter that subdivides triangles based on maximum edge length and/or triangle area.
 

Мой вопрос в том, как вычислить максимальную длину ребра, в соответствии с некоторыми пробами и ошибками я обнаружил, что это должно быть значение, между [0.0188-0.0265] которым у меня 16384 грани. Однако я не смог найти ни одной формулировки, которая давала бы число в этом диапазоне соотношений и была бы последовательной в разных случаях. Есть идеи, как рассчитать эту максимальную длину ребра каждый раз?

В другом примере у меня есть следующие две сетки:

 Sph1_faces: 390
Sph1_points: 1170
Sph1_surface_area: 1.9251713393584104

Sph2_faces: 1722
Sph2_points: 5166
Sph2_suface_area: 10.59400389764954
 

И для получения Sph1 числа граней, близкого к Sph2 числу граней, максимальная длина ребра должна быть между [0.089-0.09] ними, что дает мне 1730 граней для Sph1 .

Я попытался использовать формулировку площади равностороннего треугольника, сделав соответствующее предположение, а затем решив для стороны и разделив на количество граней или точек, но, похоже, это не сработало. Таким образом, любая другая идея будет оценена по достоинству.

Спасибо.

Комментарии:

1. Боюсь, что очень трудно предсказать результат такого адаптивного алгоритма. Особенно, если ваш ввод очень нерегулярен. И что еще более важно, потому что в документации не указано, какой алгоритм используется. Но ваш подход к использованию равностороннего предположения кажется разумным (поскольку это обычно является одной из целей алгоритмов разделения). Для ваших примеров я получаю длины ребер 0.01413 и 0.05081 , соответственно , которые не слишком далеки от ваших интервалов. Разве результаты, которые вы получаете с этими цифрами, не удовлетворительны?

2. Я думаю, что вы правы, действительно трудно заставить его работать последовательно. Нет, числа, которые должны работать в соответствии с моими потребностями, должны находиться между диапазонами, которые я предоставляю. В любом случае, я отказался от vtkAdaptiveSubdivisionFilter() этого после применения разных вещей. Теперь мой альтернативный обходной путь состоял в том, чтобы использовать vtkLinearSubdivisionFilter() до нескольких граней, которые больше той суммы, которую я хочу, а затем уменьшить до точного числа. На данный момент это, кажется, работает нормально.