catalog
直线表示法
给定ab
两个点, 请沿着a -> b
方向, 从b
点再延长dist
距离到c
点, 求c
点坐标
令d1
为ab
的距离, 这可以求出来.
如果使用斜率表示, k
= ab
直线的斜率
根据d1 + d2
(ab的距离) 和 k
, 可以求出: a
与c
点的 dx
正数 dx = (d1+d2)^2 / (1 + k^2)
但是, 至于c
点的横坐标是: x_a + dx
还是 x_a - dx
, 你需要判断!
如果x_a < x_b
, 则 c_x = x_a + dx
. 这就有点麻烦.
… 原因在于: 比如k
是正值, a
可能在b
的左下角, 也可以在右上角; 不清楚.
同时一定要注意, 当直线是与Y
轴平行时, 要特判!!! 此时斜率不存在
一般几何问题, 会使用 向量表示法
v
为 直线上的 单位向量 (但他有两种选择, 要么是指向直线的一端, 要么是指向另一端, 但其模长均为1
)
… 其求法一般是: 取直线上任意两个点ab
, 令u = (a - b) 或 (b - a)
, u
为长度为(ab
距离)的向量, 其方向: 取决于是a - b
还是b - a
… (a - b)
是一个 (从b
指向a
) 的向量! (因为向量可以平移)
… 换句话说, u
是认为是: ab
线段 带上(方向)的 这样一个向量; 因为方向有2种, 故u
有两种可能的向量;
… 则令: v = u / |u|
, 一个向量 除以 其长度, 就得到了该向量的单位向量.
… 且, 因为涉及到/ |u|
的运算, 故, ab
不可以是同一个点;
对于ab
直线上的任意一点A
, 该直线可以表示为: A + d * v
, d
为任意实数
所以, 向量表示法的关键, 在于求v
单位向量
… 点和向量是可以直接加减的, 含义是: 该点沿着向量的移动
… 或者说, 点和向量就是一个东西!!! 他俩的形式都是: (x, y)
此时, 该直线表示为: A + d * v
(A
是直线上任意点, v
为直线上任意的向量这里的任意, 其实v就2种可能
)
对于直线上的 任意一点B
, 令D
为 AB的距离 (正值) A
点是该直线上的已知点
其实很形象, B
点坐标 就是: 从A
点, 朝向flag
方向, 走D
的距离, 就可以到达B
点; (这个flag
, 就是: A->B
的方向)
关键是: flag
可能与 单位向量v
方向一致, 可能方向相反;
… 如果我们令: 如果flag方向
与 方向一致, 则为k = 1
; 两者方向相反则k = -1
… 则会有: B坐标 = A + (D * k) * v
(A, v, D
都是已知的, 关键你要确定k
, 即方向问题)
回到本题. 按照A -> B
的方向, 从B
点 再延长dist
距离 到达C
点. 关键是求单位向量
令向量u = (B - A)
, AB
距离为L (即L=|u|)
其单位向量为: v = u / L
, 这样, C
点一定是在A或B
的 沿着v
的方向上的, 即上述公式中的k = 1
… 该直线表示为: A + d * v
(A v
已知, d
是变量 表示所有直线上点)
… 则C
点 = A + d * v
= A + (L + dist) * v
= A + L * v + dist * v
, 其中A + L * v = B
… 故 C点 = B + dist * v