找到垂直于目标点的3D线上的交点

时间:2015-07-07 16:12:03

标签: matlab geometry linear-algebra

我有一条线和一条点,如果我要从这个交点与另一个点画一条线,我想在90度或垂直的线上找到一个点(x,y,z)

到目前为止,我可以使用此代码创建一行,并且我有另一个代码来计算三点之间的角度,但这并不适用于此:

a = [1 1 2]; %line
b = [20 28 90]; % line

c = [50 30 67]; %point 

ab = b - a;


n = max(abs(ab)) + 1;

s = repmat(linspace(0, 1, n)', 1, 3);
for d = 1:3
    s(:, d) = s(:, d) * ab(d) + a(d);
end


s = round(s);


Z = 100; 
N = 100;
X = zeros(N, N, Z);

X(sub2ind(size(X), s(:, 1), s(:, 2), s(:, 3))) = 1;


x = c(:,1);


clf

plot3(s(:, 1), s(:, 2), s(:, 3), 'r.-')


axis(N * [0 1 0 1 0 1])
grid on

1 个答案:

答案 0 :(得分:7)

这需要一些数学来分析确定。通过“90度”,我假设您想要在此3D线上找到与此线垂直的点,如果您将此线从此交点延伸到所需点。

我假设两个点ab表示3D空间中的坐标,其中一条线可以连接它们,而c是感兴趣的点。这是我正在谈论的更好的图表:

来源:MathWorld

在您的情况下,x1x2代表代码中的abx0代表c。距离d将是线上的距离,如果您将一条线从交点延伸到点c,则该点将允许该点垂直于此线。

您可以定义一个参数方程式来描述x1x2之间的界限,如下所示:

x1x2之间的这一行上的一个点可以通过获取(x,y,z)x1的每个x2值并将其写入上面的参数形式并改变参数t,它来自[0,1]。因此,t=0会为您提供第一个点x1a,而t=1会为您提供第二个点x2bt之间[0,1]之间的任何值都会为您提供一个点。目标是找到最小化tx0到此行的距离的值c。就像我之前说过的那样,我们都知道几何学中,如果你从这个交点到一个点x0或{{}},那么从点到线的最小距离会使交叉角垂直/ 90度。 {1}}。

因此,您所要做的就是找到c的这个值,然后将其替换为上面的参数方程式以找到您想要的点。换句话说,我们想要最小化点和线之间的距离,距离可以这样描述:

要找到最小距离,您会找到参数t,通过查找与t相关的导数并将其设置为等于0来最小化上述等式。从逻辑上讲,您将采用等式的平方根,这样你就可以最小化距离,而不是距离的平方。然而,实际上更容易将距离平方最小化,这就是为什么上面的等式如此表示的原因。这是有道理的,因为如果你最小化距离平方......距离也会被最小化,因为你只是在答案上放置一个平方根来得到你所要求的。从等式中消除平方根将使计算导数变得更容易。

如果你这样做,并求解t,我们得到这个等式:

因此,找出ta之间的差异,将其与带有cb之差的点积,然后将其除以幅度平方ab之间的差异。这解决了a,然后您将其替换为上述参数方程式以找到您的观点。

在MATLAB代码中,它看起来像这样:

t

a = [1 1 2]; %line - x1 b = [20 28 90]; % line - x2 c = [50 30 67]; %point - x0 ab = b - a; %// Find x2 - x1 %// -(x1 - x0).(x2 - x1) / (|x2 - x1|^2) t = -(a - c)*(ab.') / (ab*ab.'); %// Calculate t %// Find point of intersection Xinter = a + (b - a)*t; 的代码我利用了矩阵乘法。点积可以通过将行数组乘以列数组并以类似的方式找到,如果行数组和列数组具有相同的系数,则会得到向量的幅度平方。

对于您的示例,我们得到:

t

为了证明这是正确的,让我们绘制直线,点和交点:

enter image description here

产生上图的代码是:

Xinter =

   16.9889   23.7211   76.0539