C ++中一条线与一个线段的交点

时间:2015-12-22 12:11:35

标签: c++ geometry line computational-geometry intersection

以下是从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));
}

请注意,此解决方案似乎与解释hereWikipedia page中的解决方案不同,因为此解决方案使用绝对值函数。

我已经扩展了交叉点(x,y)的结果:

1 个答案:

答案 0 :(得分:1)

一个好的起点是了解如何自己找到线路交叉点:https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection

  • 行段: y = ax + c
  • 行: y = bx + d
  • 交叉点

现在我们只需要根据pq以及 b c >和 d AB而言。

我们知道两个斜坡:

  • a = (p.y - q.y) / (p.x - q.x)
  • b = (A.y - B.y) / (A.x - B.x)

我倾向于使用Point-Slope Form来找到y轴截距:

  • y - p.y = a(x - p.x ,这将简化为 y = ax - (p.x * q.y - p.y * q.x) / (p.x - q.x)
  • y - 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)因此,两个分母都可以被移除,产生: