Свяжите ближайшие точки на разных высотах в Matlab и сформируйте цепочки
У меня есть 3d матрица с рассеянными точками (матрица Nx4, xyz-данные). Моя цель - соединить ближайшие точки и зарегистрировать каждую цепочку в массиве Kx4 (x, y, z, data), где K - длина цепочки. Общее количество цепочек зависит от точек... Особенность в том, что эти линии идут только вверх (z+), я не хочу связывать точки на одном и том же z или идти вниз.
До сих пор я пробовал разные стратегии, одна из которых была с другой формой массива (Mx4xNz - в основном это означает, что значения были сложены по z вместо того, чтобы быть все на 2d матрице): [отредактировано после некоторого прогресса, используя delaunay/nearneighbor]
- выбрать точку на уровне Zn
- перейдите на уровень Zn+1, найдите ближайшую точку в диапазоне координат x, y, используя delaunayTriangulation и nearNeighbor
- зарегистрировать точку в векторе
(Я подозреваю, что есть и другие возможности, используя 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
конец
У кого-нибудь есть идея относительно того, почему это происходит?