2015-05-22 6 views
1

У меня есть векторный набор данных (Nx3) с положением xyz. Я вычислил нормали для всех точек в моем наборе данных.Хотите фильтровать горизонтальные нормали в файле вектора xyz (matlab) Код работает, но не правильно

Что я хочу сделать, это отфильтровать все горизонтальные нормали (т. Е. Когда y-точки представляют собой вертикальную функцию в моих данных).

У меня есть это до сих пор, но это только фильтрация точек в x-пространстве. Я смущен, если я должен быть в пространстве xz или пространстве yz, чтобы отфильтровать горизонтальные нормали? Предложения?

%dimension Nx3 (N variable by scene used) 
normals = 'normals.csv'; 
P1 = csvread(normals); 

%dimension Nx3 (N variable by scene used) 
pts = 'pts.csv'; 
P0 = csvread(pts); 

threshold = .5 

%calculate angle between normal vectors and rotated data 
ang = atan2(P0(:,2) - P1(:,2), P0(:,1) - P1(:,1)) 

%filter data 
filter = abs(ang) < threshold; 
newNormals = P1(~filter, :); 
newPts = P0(~filter,:); 

dlmwrite('newpts.txt', finalPts, 'delimiter',' ') 
+0

finaly кто-то логическое индексирование :) Во всяком случае, что такое P0? Его не определено. Что касается вас, вы получаете только x Points, когда P1 (1,:) = [x, y, z], и вы просто смотрите на P1 (:, 2) и P1 (:, 1), z-Axis does not do что-нибудь. –

+0

AH извините, я понял, что, когда я побежал его только сейчас. Я вращал данные, но просто оставил их, так как он не работал. Я только что редактировал свой оригинальный пост. – user3433572

+0

Я также пробовал разные комбинации столбцов: ang = atan2 (P0 (:, 1) - P1 (:, 1), P0 (:, 3) - P1 (:, 3)), и то же самое происходит, это обрабатывает данные в плоскости x – user3433572

ответ

1

Предполагая, что точки у-оси вверх, то кажется, что вы только проверяете проекцию вашего вектора на плоскости ху. Если вы пытаетесь отфильтровать все вертикальные векторы, то вы должны выполнить ту же самую проверку на плоскости yz.

% xy-projection 
x_filter = abs(atan2(P0(:,2)-P1(:,2),P0(:,1)-P1(:,1))<threshold; 
% yz-projection 
z_filter = abs(atan2(P0(:,2)-P1(:,2),P0(:,3)-P1(:,3))<threshold; 
% xy-projection and yz-projections are both vertical 
filter = x_filter & z_filter; 

Но еще один чек будет то, что diff(x) и diff(z) равны нулю.

threshold = 1e-3; 
% what is relative difference between vector's length and diff(y)? 
filter = abs(1-norm(P0-P1)./(P0(:,2)-P1(:,2)))<threshold; 

затем используйте фильтр, как ранее.

newNormals = P1(~filter, :); 
newPts = P0(~filter,:);