Проблема интерполяции во время маршевого куба на скалярном поле

У меня есть обычная квадратная сетка, в которой все мои точки данных хранятся в центроиде. У меня есть скалярное поле (диапазон: 0-> 1), которое указывает количество вещества внутри клетки. Меня интересует выявление интерфейса этого вещества внутри клетки (для дальнейшей обработки, а не для визуализации).

Я наткнулся на алгоритм марширующего куба (http://paulbourke.net/geometry/polygonise/) . Здесь мне нужны значения в углах ячейки. Поэтому я усреднил значения центроидов соседней ячейки. Это усреднение в сочетании с дальнейшей линеаризацией для поиска точек пересечения во время «Полигонизации» в MC приводит к нереалистичным интерфейсам, таким как этот.

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

Здесь серая клетка наполнена веществом, а ее соседи имеют минимальное количество вещества. В идеале это должно быть очень близко к границе ячейки celtre. Я чувствую, что это происходит из-за линейной интерполяции между 0,25 и 0, которая уводит его далеко от предполагаемого положения.

Можно ли что-то сделать, чтобы разобраться в этом вопросе?


person Some_Guy    schedule 14.03.2019    source источник


Ответы (1)


Алгоритм Marching-Cubes имеет один регулируемый параметр, а именно isolevel. В вашем примере вы, кажется, выбрали значение около 0.05 для isolevel. При выборе значения чуть ниже 0.25 (например, что-то вроде 0.24) интерфейсы будут намного ближе к центральной ячейке. Но тогда у вас все еще будут неудовлетворительные результаты, когда две ячейки со значением 1 касаются друг друга s.t. углы будут иметь среднее значение 0.5.

Что еще можно попробовать: вместо усреднения значений ячеек для вычисления значений углов вы можете взять максимальное значение ячейки для значения угла и поднять isolevel до значения чуть ниже 1 (например, 0.9).

person coproc    schedule 14.03.2019
comment
Спасибо за ответ... Я беру свое значение изозначения в качестве значения центра ячейки. Например, ячейка справа от центральной ячейки имеет изозначение 0,01, потому что я хочу знать интерфейс, который вещество образует внутри ячейки, когда оно занимает объем 0,01 ... Я где-то делаю это неправильно? - person Some_Guy; 14.03.2019
comment
Изоуровень определяет, где именно линии сетки пересекаются сгенерированным полионом. Обычно у вас есть один изоуровень для всего алгоритма/полигона. (Кстати: если бы вы передали 0,01 в качестве изоуровня алгоритму марширующих кубов или также только к отдельным ячейкам, я бы ожидал, что результирующий многоугольник (пунктирная линия) будет еще больше, почти проходящий через углы.) - person coproc; 15.03.2019