`算法知识` `几何` 直线表示法

catalog

直线表示法

给定ab两个点, 请沿着a -> b方向, 从b点再延长dist距离到c点, 求c点坐标


d1ab的距离, 这可以求出来.

如果使用斜率表示, k = ab直线的斜率
根据d1 + d2(ab的距离) 和 k, 可以求出: ac点的 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值