我有一个与点云相交的平面,想在相交点周围一定距离处提取点。在我的脚本中,我已经可以确定平面周围的点,但是不幸的是,还可以确定未与平面相交的点,如下图所示。 (红色圆圈显示确定的点)
这是我脚本中检测点的部分。
p0 = [0 0 0];
p1 = [-74 -76.968 0];
p2 = [0 0 690.18];
n = cross(p0-p1,p0-p2);
n = n/norm(n);
FDIST = @(X,Y,Z) sum(n.*(p0-[X Y Z]));
D = arrayfun(FDIST,x,y,z,'uni',false);
D1 = cell2mat(D);
mindist = 0.65;
ind = abs(D1) < mindist;
x,y和z分别是114964x1个向量。由于交点都在第三象限中,因此我尝试仅考虑x和y向量中的负值。但是我收到一个错误,即输入参数不再具有相同的长度。
idx = x1<0;
cx = x1(idx);
idy = y1<0;
cy = y1(idy);
Error using arrayfun
All of the input arguments must be of the same size and shape.
Previous inputs had size 57966 in dimension 1. Input #3 has size
58204
我认为另一种方法可能是调整FDIST
,但是我对MATLAB的function handle
不太好,因此并没有成功。
预先感谢您的帮助。
答案 0 :(得分:1)
我认为您应该使用以下内容对第三象限内的点进行子集
idx_neg = (x <=0 & y<=0);
x = x(idx_neg);
y = y(idx_neg);
z = z(idx_neg);
使得x
,y
和z
的尺寸相等。
我将下面的代码与伪数据一起使用,它们可以正常运行。
clc;
clear;
% dummy points data for x, y, and z
x = randn(100,1);
y = randn(100,1);
z = randn(100,1);
p0 = [0 0 0];
p1 = [-74 -76.968 0];
p2 = [0 0 690.18];
n = cross(p0-p1,p0-p2);
n = n/norm(n);
% restrict to the third quadrant
idx_neg = (x <=0 & y<=0);
x = x(idx_neg);
y = y(idx_neg);
z = z(idx_neg);
FDIST = @(X,Y,Z) sum(n.*(p0-[X Y Z]));
D = arrayfun(FDIST,x,y,z,'uni',false);
D1 = cell2mat(D);
mindist = 0.65;
ind = abs(D1) < mindist;