以下是从CP3获取的C++
代码,用于计算通过a和b的行与由p定义的段行之间的交点和q,假设交集存在。有人可以解释它在做什么以及它为什么起作用(几何)?
// line segment p-q intersect with line A-B.
point lineIntersectSeg(point p, point q, point A, point B) {
double a = B.y - A.y;
double b = A.x - B.x;
double c = B.x * A.y - A.x * B.y;
double u = fabs(a * p.x + b * p.y + c);
double v = fabs(a * q.x + b * q.y + c);
return point((p.x * v + q.x * u) / (u+v), (p.y * v + q.y * u) / (u+v));
}
请注意,此解决方案似乎与解释here或Wikipedia page中的解决方案不同,因为此解决方案使用绝对值函数。
我已经扩展了交叉点(x,y)的结果:
答案 0 :(得分:1)
一个好的起点是了解如何自己找到线路交叉点:https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
现在我们只需要根据p
和q
以及 b 和 c >和 d 就A
和B
而言。
我们知道两个斜坡:
a = (p.y - q.y) / (p.x - q.x)
b = (A.y - B.y) / (A.x - B.x)
我倾向于使用Point-Slope Form来找到y轴截距:
p.y
= a(x - p.x
),这将简化为 y = ax - (p.x * q.y - p.y * q.x) / (p.x - q.x)
A.y
= a(x - B.x
),这将简化为 y = ax - (A.x * B.y - A.y * B.x) / (A.x - B.x)
因此,如果您允许我将我们的变量混合到数学符号中,那么简化就更简单了,我们的交集组件的最终等式是:
一旦分子和分母中的分数合并为一个分数,两者的分母就被认为是(A.x - B.x)(p.x - q.x)
因此,两个分母都可以被移除,产生: