Ближайшее расстояние между двумя выпуклыми оболочками

У меня есть две невыпуклые сетки, и я хочу найти ближайшее расстояние между ними. Для моих нужд достаточно приблизительного значения (при условии, что оно не слишком сильно отклоняется от истинного значения).

Я разбиваю невыпуклые сетки на множество выпуклых частей, а также из соображений скорости нахожу выпуклые оболочки каждой выпуклой части.

Затем я проверяю расстояния для всех комбинаций между корпусами первого и второго меша. Самый короткий определяет самое близкое расстояние между двумя сетками.

У меня уже есть рабочее решение с пакетом Оптимальные расстояния CGAL (см. изображение ниже). Результат хороший, но время выполнения не идеальное, на самом деле это главное узкое место в моем пайплайне.

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

введите здесь описание изображения

Обновление:

Приведенная выше ссылка указывает на пример CGAL, которому я следую, а именно на пример «polytope_distance_d_fast_exact.cpp». Что касается используемого ядра, я использую:

// use an inexact kernel...
typedef CGAL::Homogeneous<double>                         K;
typedef K::Point_3                                        Point;
// ... and the EXACT traits class based on the inexcat kernel
typedef CGAL::Polytope_distance_d_traits_3<K, ET, double> Traits;
typedef CGAL::Polytope_distance_d<Traits>                 Polytope_distance;

person dim_tz    schedule 24.09.2014    source источник
comment
Какое ядро ​​вы используете?   -  person sloriot    schedule 24.09.2014
comment
Пожалуйста, проверьте обновленный пост, информация добавлена ​​туда.   -  person dim_tz    schedule 24.09.2014
comment
Попробуйте заменить ET на CGAL::Lazy_exact_nt‹CGAL::Gmpz›   -  person sloriot    schedule 24.09.2014
comment
К сожалению не помогает, есть ошибки компиляции. Я не уверен, что для этого нужно сделать: функция сопоставления для вызова CGAL::Lazy_exact_nt<CGAL::Gmpzf>::Lazy_exact_nt не срабатывает в QR_solver_impl.h   -  person dim_tz    schedule 24.09.2014


Ответы (1)


Это немного старая библиотека, и я ей не пользовался уже несколько лет, но я, кажется, помню, как пытался сделать что-то подобное с Библиотека GNU Triangulated Surface...

В частности, используя функцию gts_surface_distance, чтобы найти расстояние между двумя GtsSurfaces (которые, я думаю, все еще могут быть представлены вашими невыпуклыми сетками).

См. здесь для получения дополнительной информации.

Боюсь, я понятия не имею, может ли это быть быстрее для вас, но, возможно, стоит попробовать!

person timlukins    schedule 26.09.2014