【问题标题】:Intersection of a line with a line segment in C++C++中直线与线段的交点
【发布时间】:2015-12-22 12:11:34
【问题描述】:

以下是C++代码取自CP3,计算通过a和b的线与p和q定义的线segment的交点,假设交叉点存在。有人可以解释它在做什么以及它为什么起作用(几何上)吗?

// 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) 的表达式:

【问题讨论】:

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


【解决方案1】:

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

  • 线段:y = ax + c
  • 行:y = bx + d
  • 的交集

现在我们只需要根据 pqb 来获取 ac >dAB 方面。

我们知道我们的两个斜坡:

  • 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),因此可以删除两个分母,得到:

【讨论】:

  • 您没有在提供的等式中解释fabs。我怀疑避免被零除错误是一件很聪明的事情。如果(例如)Ax=Bx,您的简单公式就会失败。
  • 这是正确的,只要没有一条线是垂直的。这不解释fabs的使用。
  • @hallaplay835 这是一个很好的调用,请注意原始方程也不能处理它们。它将为不相交的线返回一个有效数字:ideone.com/t1hzRD
  • 原代码只要存在交叉点就可以工作。不过,其中一条线可以是垂直的。
  • 做向量叉积。如果ab x apab x aq 有不同的符号,则pq 中的一个点位于直线的一侧,而另一个点位于另一侧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2017-08-18
  • 2015-07-12
相关资源
最近更新 更多