题目

从标准输入读入两点在三维空间中的笛卡尔坐标 (x1, y1, z1) 与 (x2, y2, z2),计算两点间的欧几里得空间距离。

输入格式:一行输入 6 个浮点数,分别代表 x1 y1 z1 x2 y2 z2,以空格分隔。

输出格式:输出两点间的欧氏距离,保留 4 位小数。

数据范围与约定:坐标分量为任意实数,跨度 -10^6 到 10^6。

思路与算法

1. 三维距离公式
空间两点欧氏距离公式为:$d = \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2 + (z_1-z_2)^2}$。

2. sqrt 与平方计算
使用 sqrt() 开方,各分量差值平方用 dx^2。在 Octave 中也可以将两点分别打包为 1×3 行向量,直接调用 norm(p1 - p2) 计算 2-范数,本题展示基础分量与向量范数两种写法。

3. 数值下溢与稳定性
虽然直角坐标差值直接平方求和常规有效,若数值极其悬殊时 hypot 或 norm 底层会自动防御溢出。

完整程序

% Octave / MATLAB 第4题:三维两点欧氏距离
[coords, count] = scanf("%f", 6);

if count < 6
    fprintf("错误:需输入完整的两点 6 个三维坐标分量。\n");
    return;
end

p1 = coords(1:3)'; % 转换为 1x3 行向量
p2 = coords(4:6)';

% 基础分量计算法
dx = p1(1) - p2(1);
dy = p1(2) - p2(2);
dz = p1(3) - p2(3);
dist_manual = sqrt(dx^2 + dy^2 + dz^2);

% 向量范数计算法 (等价验算)
dist_norm = norm(p1 - p2);

fprintf("点 1: (%.2f, %.2f, %.2f)\n", p1(1), p1(2), p1(3));
fprintf("点 2: (%.2f, %.2f, %.2f)\n", p2(1), p2(2), p2(3));
fprintf("欧氏距离: %.4f\n", dist_manual);

运行示例

示例 1:

输入:

1 2 3 4 6 3

输出:

点 1: (1.00, 2.00, 3.00)
点 2: (4.00, 6.00, 3.00)
欧氏距离: 5.0000

示例 2:

输入:

0 0 0 1 1 1

输出:

点 1: (0.00, 0.00, 0.00)
点 2: (1.00, 1.00, 1.00)
欧氏距离: 1.7321