繁体   English   中英

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

[英]Finding the point of intersection on a 3D line perpendicular to a target point

我有一条线和一条点,我想在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

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

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

资料来源: MathWorld

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

您可以定义描述x1x2之间的直线的参数方程,如下所示:

上之间的这种线A点x1x2可以通过取每一个的描述(x,y,z)x1x2和在上述参数形式写它并改变参数t ,它从变[0,1] 因此t=0会给你第一个点x1at=1会给你第二个点x2b [0,1]之间的任何t值都会给你一个点。 目标是找到最小化x0c到该线的距离的值t 就像我之前说过的那样,我们都知道几何学中如果从这个交点到点x0c延伸一条线,从一个点到一条线的最小距离会使交叉角垂直/ 90度。

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

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

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

因此,找出ac之间的差异,将其与ba之间的差值乘以点积,然后将其除以ba之差的幅度平方。 这解决了t ,然后你将其替换为上面的参数方程以找到你的观点。

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

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的代码利用了矩阵乘法。 可以通过将行数组乘以列数组并以类似的方式找到点积,如果行数组和列数组具有相同的系数,则这导致向量的幅度平方。

以您为例,我们得到:

Xinter =

   16.9889   23.7211   76.0539

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

在此输入图像描述

产生上图的代码是:

figure;

%// Plot line
plot3([a(1) b(1)], [a(2) b(2)], [a(3) b(3)]);
hold on;

%// Plot point of interest in red
plot3(c(1), c(2), c(3), 'r.');

%// Plot intersection point in green
plot3(Xinter(1), Xinter(2), Xinter(3), 'g.');

%// Plot line from intersection point to point of interest in black
plot3([c(1) Xinter(1)], [c(2) Xinter(2)],  [c(3) Xinter(3)], 'k');

%// Turn on a grid
grid;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM