如何找到点到平面的最小距离

时间:2019-12-13 12:21:17

标签: matlab

我有一个与点云相交的平面,想在相交点周围一定距离处提取点。在我的脚本中,我已经可以确定平面周围的点,但是不幸的是,还可以确定未与平面相交的点,如下图所示。 (红色圆圈显示确定的点)

enter image description here

这是我脚本中检测点的部分。

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不太好,因此并没有成功。 预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为您应该使用以下内容对第三象限内的点进行子集

idx_neg = (x <=0 & y<=0);
x = x(idx_neg);
y = y(idx_neg);
z = z(idx_neg);

使得xyz的尺寸相等。

我将下面的代码与伪数据一起使用,它们可以正常运行。

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;