Какой алгоритм использует граничная функция Matlab?

Как вы, возможно, уже заметили, в более новых версиях Matlab функция границы (которая вычисляет границу для набора 2d или 3d точек) была улучшена.

Теперь можно задать функции параметр под названием «коэффициент сжатия». Если коэффициент сжатия равен 0, то трассируемая граница является традиционной выпуклой оболочкой. Граница сильнее сжимается, когда параметр сжатия больше. Значение по умолчанию для коэффициента сжатия составляет 0,5, если вы не укажете какое-либо значение.

Итак, я понимаю его использование и то, что он делает (на самом деле я уже использовал эту функцию в проекте), но я не знаю, как она работает. Каковы геометрические принципы этого коэффициента усадки?

Спасибо!


person n.Marcelo    schedule 05.08.2015    source источник


Ответы (2)


Нашел ваш вопрос, пока сам искал ответ. Надеюсь, вы уже решили это. Я понял это, и на случай, если кто-то еще найдет этот вопрос, вот мое понимание функции border().

Граничная функция представляет собой реализацию альфа-форм. Используя альфа-формы, набору точек можно присвоить многоугольник с помощью набора кругов определенного радиуса: представьте себе произвольную фигуру, нарисованную вокруг точек, и продолжайте удалять как можно большую часть этой формы, используя круги определенного радиуса. Продолжайте как можно дольше, не замыкая ни одной точки. Небольшой радиус будет означать, что можно удалить больше «материала», больший радиус означает меньшее «удаление», т. Е. Маленький радиус создает плотную обрезанную форму, тогда как бесконечный радиус воссоздает выпуклую оболочку набора. Точки, определенные как краевые, затем соединяются прямыми гранями. Это может создать пустые области внутри набора точек. См., например. http://doc.cgal.org/latest/Alpha_shapes_2/index.html

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

рабочий процесс границы():

(1) Создать альфа-форму

(2) Найдите критический альфа-радиус, необходимый для создания одной области для альфа-формы

(3) Извлечь все альфа-значения, которые создают уникальные фигуры выше этого критического значения.

(4) Используйте коэффициент сжатия S, чтобы выбрать одно значение альфа-канала для использования.

Пример: при S=0,25 используйте альфа-радиус с индексом (1–.25)*число(alphavalues>=alpha_crit). Это создает альфа-форму с использованием 75-го наименьшего альфа-радиуса, что дает одну область (для S = 0,25).

Если S=1 (максимальное сжатие), дает наименьший альфа-радиус, который дает одну область для альфа-формы.

Если S=0 (без сжатия), дает максимальный альфа-радиус, который дает уникальную форму. (Увеличение альфа-радиуса не имеет никакого эффекта).

(5) установить порог для заполнения отверстий в альфа-форме таким же, как площадь альфа-фигуры, т. е. заполнить все отверстия

(6) Возвращает индексы исходного облака точек, соответствующие вершинам этой альфа-формы.

Соответствующий раздел файла border.m (строки 79-86)

Acrit = shp.criticalAlpha('one-region'); %alpha-radius required for single region
spec = shp.alphaSpectrum();%all alphavalues
idx = find(spec==Acrit);
subspec = spec(1:idx);%alphavalues up to criticalAlpha
subspec = flipud(subspec);%reverse order
idx = max(ceil((1-S)*numel(subspec)),1); %find index from shrink factor
alphaval = subspec(idx); 
shp.Alpha = alphaval; %set alpha value of alpha shape
shp.HoleThreshold = areavol; % remove holes in interior

Надеюсь, что это достаточно ясно и полезно для кого-то.

Я использую MATLAB R2014b.

person YiraDati    schedule 06.05.2016

Ответ YiraDati содержит подробные сведения.

Вы также можете ввести «открыть границу» в командных окнах, и тогда все процедуры будут записаны в функции границы. И все подфункции, показанные в граничной функции, доступны с помощью документации Matlab, например area(), criticalAlpha(), alphaSpectrum() и т. д.

person SirBlanc    schedule 26.04.2018