You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB:空间平面与点的距离计算及三维可视化问询

问题

我在空间中有两组由三个点构成的实体,点坐标如下:

A = [-50.0098 -181.0869  -37.5881];
B = [  -49.8410 -180.8097  -41.1383];
C = [-49.5887 -180.3952  -46.4462];

A = [-50.199    -180.93 -37.249];
B = [-50.256    -180.823    -33.686];
C = [-50.341    -180.657    -28.359];

我希望通过其中一组的三个点绘制平面,计算另一组点到该平面的距离,同时完成可视化。

我编写了如下自定义函数:

%% ====== FUNCTION ======
function [normal, d, X, Y, Z] = plot_line_deviazione(p1, p2, p3, x_min, x_max, y_min, y_max)
% This function plots a line from three points. 
% I/P arguments: 
%   p1, p2, p3 eg, p1 = [x y z]
% 
%
% O/P is: 
% normal: it contains a,b,c coeff , normal = [a b c]
% d : coeff
normal = cross(p1 - p2, p1 - p3);
d = p1(1)*normal(1) + p1(2)*normal(2) + p1(3)*normal(3);
d = -d;
x = x_min:x_max; y = y_min:y_max;
[X,Y] = meshgrid(x,y);
Z = (-d - (normal(1)*X) - (normal(2)*Y))/normal(3);
mesh(X,Y,Z)

并通过以下方式调用:

figure
plot3(A(:,1),A(:,2),A(:,3),'r.','Markersize',25)
hold on
plot3(B(:,1),B(:,2),B(:,3),'r.','Markersize',25)
plot3(C(:,1),C(:,2),C(:,3),'r.','Markersize',25)
[normal0, d0, X0, Y0, Z0] = plot_line_deviazione(A, B, C, -100, 100, -100, 100);  % new plane

dot(X-d0,normal0)

我有两个疑问:

  1. 用dot函数计算的结果是否为所需的点到平面的距离?
  2. 该如何绘制点到平面的距离线段?

问题1:dot函数计算的结果是否为点到平面的距离?

不是,你当前的dot(X-d0,normal0)写法完全错误,逻辑也不符合点到平面的距离计算规则。

点到平面的标准计算公式为:对于平面方程a*x + b*y + c*z + d = 0(其中[a,b,c]是平面的法向量),点P(x0,y0,z0)到平面的距离是:
$$
distance = \frac{|ax0 + by0 + c*z0 + d|}{\sqrt{a^2 + b^2 + c^2}}
$$

对应到你的代码:

  • 函数返回的normal是平面的法向量[a,b,c],d是平面方程的常数项(即平面方程为normal(1)*x + normal(2)*y + normal(3)*z + d = 0)
  • 若要计算点P到该平面的距离,正确代码如下:
% 计算分子:点代入平面方程的绝对值
numerator = abs(dot(normal0, P) + d0);
% 计算分母:法向量的模长
denominator = norm(normal0);
% 距离值
distance = numerator / denominator;

你之前的代码里,X是meshgrid生成的平面网格矩阵,并非需要计算距离的目标点,且X-d0的维度不匹配,完全偏离了点到平面距离的计算逻辑。


问题2:如何绘制点到平面的距离线段?

要绘制垂直于平面的距离线段,需先计算目标点在平面上的投影点,再连接原点点与投影点即可。

投影点计算逻辑

点P在平面上的投影点P_proj公式为:
$$
P_{proj} = P - \frac{(normal \cdot P + d)}{||normal||^2} \cdot normal
$$

完整可视化代码

假设第一组点A1,B1,C1用于生成平面,第二组点A2,B2,C2是需要计算距离的目标点,完整代码如下:

% 定义两组点
A1 = [-50.0098 -181.0869  -37.5881];
B1 = [  -49.8410 -180.8097  -41.1383];
C1 = [-49.5887 -180.3952  -46.4462];

A2 = [-50.199    -180.93 -37.249];
B2 = [-50.256    -180.823    -33.686];
C2 = [-50.341    -180.657    -28.359];

% 创建绘图窗口
figure
hold on

% 绘制第一组点(红色)和平面
plot3(A1(1),A1(2),A1(3),'r.','Markersize',25)
plot3(B1(1),B1(2),B1(3),'r.','Markersize',25)
plot3(C1(1),C1(2),C1(3),'r.','Markersize',25)
% 缩小平面的x/y范围,让平面更贴合点的分布(避免过大的平面遮挡视线)
[normal0, d0, X0, Y0, Z0] = plot_line_deviazione(A1, B1, C1, -51, -49, -182, -180);

% 绘制第二组点(蓝色)
plot3(A2(1),A2(2),A2(3),'b.','Markersize',25)
plot3(B2(1),B2(2),B2(3),'b.','Markersize',25)
plot3(C2(1),C2(2),C2(3),'b.','Markersize',25)

% 定义计算投影点的子函数
function proj_point = get_projection(P, normal, d)
    t = -(dot(normal, P) + d) / dot(normal, normal);
    proj_point = P + t * normal;
end

% 遍历第二组点,计算投影并绘制距离线段
points_to_check = [A2; B2; C2];
for i = 1:size(points_to_check,1)
    P = points_to_check(i,:);
    P_proj = get_projection(P, normal0, d0);
    % 绘制黑色虚线:原点点到投影点
    plot3([P(1), P_proj(1)], [P(2), P_proj(2)], [P(3), P_proj(3)], 'k--', 'LineWidth',1.5);
    % 计算并输出距离
    dist = abs(dot(normal0, P) + d0)/norm(normal0);
    fprintf('点%d到平面的距离:%.4f\n', i, dist);
end

% 设置坐标轴标签和网格
xlabel('X'); ylabel('Y'); zlabel('Z');
grid on;
hold off

关键注意事项

  • 调用plot_line_deviazione时,不要使用-100,100这类过大的范围,应根据点的实际坐标范围调整(比如示例中的-51,-49和-182,-180),这样平面会更贴合点的分布,可视化效果更好。
  • 投影点的计算基于向量投影原理,确保线段严格垂直于平面,也就是真正的距离线段。

内容的提问来源于stack exchange,提问作者topzera2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:24:51