Свяжите ближайшие точки на разных высотах в Matlab и сформируйте цепочки

У меня есть 3d матрица с рассеянными точками (матрица Nx4, xyz-данные). Моя цель - соединить ближайшие точки и зарегистрировать каждую цепочку в массиве Kx4 (x, y, z, data), где K - длина цепочки. Общее количество цепочек зависит от точек... Особенность в том, что эти линии идут только вверх (z+), я не хочу связывать точки на одном и том же z или идти вниз.

До сих пор я пробовал разные стратегии, одна из которых была с другой формой массива (Mx4xNz - в основном это означает, что значения были сложены по z вместо того, чтобы быть все на 2d матрице): [отредактировано после некоторого прогресса, используя delaunay/nearneighbor]

  1. выбрать точку на уровне Zn
  2. перейдите на уровень Zn+1, найдите ближайшую точку в диапазоне координат x, y, используя delaunayTriangulation и nearNeighbor
  3. зарегистрировать точку в векторе

(Я подозреваю, что есть и другие возможности, используя nearNeighbor с матрицей Nx4, но я не могу думать, как "направить" поиск вверх и связать последовательные точки в ряд...)

Я сталкиваюсь со следующей проблемой: кажется, что нахождение ближайшей точки вверх работает хорошо, но только в 1 направлении!!

Связывание не работает:

Связывание не работает

Связывание работает:

Связывание работ

Во время цикла у меня есть предупреждение: Предупреждение: дублирующиеся точки данных были обнаружены и удалены. Индексы триангуляции определяются по отношению к уникальному набору точек в свойстве delaunayTriangulation X.

Lign = нули (max_iter,4, с);

для i = 1: с;

pp_id=i; 

for  n=1:max_iter-1; 

    Wn=W(:,:,n); % W is the data 3d-matrix Mx4xNz
    Wnn=W(:,:,n+1);

    Point_n = Wn(pp_id,:); 

    xn= Point_n(1);
    yn= Point_n(2);
    zn= Point_n(3);
    vn= Point_n(4);

    if xn==0|yn==0|zn==0|vn==0;
        break
    end

    % Look for nearest neighbour at next level
    DT=delaunayTriangulation(Wnn(:,[1:2]));
    [pp_id, d]=nearestNeighbor(DT,[Point_n(1),Point_n(2)]); 

    % limit range
    if d>10 
        break
    end

    % extraction of values at new pp_id 
    Point_n=Wnn(pp_id,:);

    % register point in line
    Lign(n,:,i)=Point_n;

end

конец

У кого-нибудь есть идея относительно того, почему это происходит?

0 ответов

Другие вопросы по тегам