crazycloudcc@blog:~/learn/coordinate-distance — zsh — 80×24
--:--:--···
crazycloudcc@blog:~/learn/coordinate-distance$ pwd
/home/crazycloudcc/blog/learn/coordinate-distance
> cd ./learn/coordinate-distance

几何 / 坐标与距离

两点距离 Coordinate distance

方向有正负,距离不为负。

坐标差给出直角边,距离是直线段 AB 的长度固定正交等比例网格;橙色水平辅助线,蓝色竖直辅助线,绿色直线连接A与B。只有两条非零辅助边时才显示直角标。动画仅显露辅助线,不移动两点。-4-4-2-222440xyCAB每格 1 单位 · 两轴同尺度 · 固定视野
d² = (3)² + (-4)² = 25d = √25 = 5

A、B 不随播放移动,只有辅助线逐段显露。橙蓝折线路程为 7,绿色直线距离为 5,不要混为一谈。全部滑块支持方向键与 Home / End;窄屏可在图内横向滚动。辅助边的数值统一放在同步解释中,避免遮住坐标刻度与点标签。

一起平移,差不变

把两点同时移动同一个向量。任一点将越出 −5…5 时禁用该方向,不分别截断。

同一幅图,同一组计算

// 本实验:每个坐标为 -5 到 5 的整数
const A = [-2, 1];
const B = [1, -3];
const dx = B[0] - A[0]; // 3
const dy = B[1] - A[1]; // -4
const d = Math.hypot(dx, dy); // ≈ 5
// 精确值:5;单位与坐标相同

平方根取非负值。代码显示值可能近似;符号根式是本实验整数输入的精确结果。一般大数输入须检查差值及结果是否有限,Math.hypot 也不能修复已经溢出的坐标相减。

看完图,带走这些结论

在平面直角坐标系中,A=(x₁,y₁)、B=(x₂,y₂)的距离为d=√((x₂−x₁)²+(y₂−y₁)²)。坐标差可以为负,辅助线段长度分别为|x₂−x₁|和|y₂−y₁|;平方消去符号,距离取非负平方根。

适用条件与边界

两轴互相垂直,使用相同长度单位;图形两轴采用相同比例尺。公式适用于任意实数平面坐标,实验滑块仅提供−5到5的整数。它计算欧氏直线距离,不是道路绕行长度,也不能把经纬度的度数直接代入当作地面距离。两点可重合,此时距离为0。

始终保持的规律

同时平移两点同一向量,两个坐标差不变;交换两点,差同时变号而平方不变。每次画面更新使用同一组坐标计算图形、公式和代码。

逐步例子

  1. 设A=(−2,1)、B=(1,−3),选辅助点C=(x₂,y₁)=(1,1)。AC水平、CB竖直;它们是辅助线,不是额外的坐标轴。
  2. 从A到C,Δx=1−(−2)=3,向右3单位。从C到B,Δy=−3−1=−4,向下4单位。辅助线段长度是|Δx|=3、|Δy|=4。
  3. 当两条辅助线段都非零,它们形成直角三角形。勾股定理给出d²=|Δx|²+|Δy|²;由于|t|²=t²,得到d=√(Δx²+Δy²)。本例d=√(9+16)=5。
  4. 交换A、B,两个坐标差都变号,平方与距离不变。同时把两点平移(1,1),得到A=(−1,2)、B=(2,−2),差仍为3和−4,距离仍为5。
  5. 同一水平线上的A=(−5,1)、B=(−2,1),距离为|−2−(−5)|=3,不是5+2。跨轴也无需换公式,例如A=(−2,−2)、B=(2,2),距离为√32=4√2。
  6. 若横坐标相同或纵坐标相同,辅助图退化,直接取另一坐标差的绝对值。若两点重合,两个差都为0,距离为0;这时不再称为非退化直角三角形。

单位、精度与计算边界

固定二维坐标只需两次相减和一次长度计算,在固定精度运算模型下时间与额外空间为O(1)。代码用Math.hypot(dx,dy),但必须先确保输入、差值和结果在可表示范围内;它不能修复已经溢出的相减。实验整数范围保证平方和0到200精确,根式给出精确距离,小数显示为近似。画面缩放只改变像素,不改变坐标单位或距离。

常见误区

  • 把坐标当长度:坐标可能为负;有向变化量也可能为负,长度和距离则非负。两点重合的0不能说成正数。
  • 一跨过坐标轴就相加:保留坐标原有正负号后做差。不同侧时绝对值有时等于到原点距离之和,同侧时一般不是。
  • 把横向长度与竖向长度相加当作直线距离:本例折线为3+4=7,直线为5;两种路径不同。
  • 把平方根写成±d:方程z²=25有两个解,但长度只能取非负值5。
  • 只平移一点,或让两个点分别被边界截断:这不是共同平移,不能保证距离不变。实验将越界时禁用整个平移方向。

自测与答案

A=(−3,2)、B=(1,−1),距离是多少?把两点同时向右移1单位后呢?如果改为A=B=(−1,2)呢?

坐标差为4和−3,距离√(16+9)=5。共同右移后差不变,距离仍为5;两点重合时两个差都为0,距离为0。

距离的应用:点在圆内、圆上,还是圆外?

  1. 只判断是否在半径范围内,必须开平方吗? 不必。设中心 O=(h,k)、点 P=(x,y),两轴垂直且使用相同长度单位,半径 r≥0。令 q=(x−h)²+(y−k)²,则距离 d=√q。因为 d 和 r 都非负,d≤r 当且仅当 q≤r²。r>0 时,q<r² 是严格圆内,q=r² 是圆周,q>r² 是圆外;包含边界的圆盘用≤,只问圆周则用=,不能混用。r=0 时,包含边界的范围只剩中心一个点,严格内部为空,不再称为普通的圆。负半径不在这个定义内,不能先平方把它伪装成合法输入。
  2. 中心不在原点,或坐标为负,会改变判法吗? 仍然先减中心坐标。取 O=(−2,1)、r=5:P=(−2,5) 的 q=0²+4²=16,在圆内;P=(1,−3) 的 q=3²+(−4)²=25,在圆周;P=(2,5) 的 q=4²+4²=32,在圆外。阈值一直是 r²=25,不能拿 q 与 r=5 比较,也不用先把距离四舍五入。将中心和点共同平移,两个差不变,分类也不变。上方图形与同步代码仍演示两点距离;这里是文字应用,没有新增半径控件或圆形交互。
  3. 平方比较是否一定精确、一定不会溢出? 不是。AtCoder ABC174 B(2020年旧题)是统计距原点不超过 D 的输入点,D允许为0,同坐标的多个输入点分别计数。其整数坐标绝对值至多200000,q至多80000000000,超过32位有符号整数范围;C++应在乘法前转为足够宽的整数,不能等溢出后再转。这个界限内 JavaScript Number 的整数平方与求和精确,但不能推广到任意大坐标或任意中心。更大整数可用 BigInt 等合适表示,并在相减前就选好类型;浮点或近似测量还需考虑相减、平方、求和误差,按实际精度约定边界规则,没有通用的固定 epsilon 能保证所有尺度都正确。平方比较只是省去开方,不能修复此前的溢出或舍入。

延伸学习

本课把水平与竖直坐标差变成直角边长,再应用勾股定理。若想理解平方和为什么成立,可先看四块全等三角形的面积拼补。

前置:勾股定理的面积拼补

参考资料

纯文字 Markdown 阅读版

教学结构参考 AetherViz Master(MIT);原创原生 SVG,无外部图形脚本。坐标长度和勾股定理给出推导,试验不能替代一般证明。

branch: mainposts: 12encoding: utf-8