找到两条线的交点

时间:2013-07-19 22:24:33

标签: ruby intersection algebra

我有两行:

y = -1/3x + 4
y = 3x + 85

交叉点位于[24.3, 12.1]

我准备了一套坐标:

points = [[1, 3], [4, 8], [25, 10], ... ]
#y = -1/3x + b
m_regr = -1/3
b_regr = 4
m_perp = 3 #(1 / m_regr * -1)    

distances = []
points.each do |pair|
  x1 = pair.first
  y2 = pair.last
  x2 = ((b_perp - b_regr / (m_regr - m_perp))
  y2 = ((m_regr * b_perp) / (m_perp * b_regr))/(m_regr - m_perp)
  distance = Math.hypot((y2 - y1), (x2 - x1))
  distances << distance
end

有没有宝石或更好的方法呢?

注意:上述方法不起作用。请参阅我的答案,了解有效的解决方案。

3 个答案:

答案 0 :(得分:1)

使用一点数学有什么问题?

如果你有:

y = m1 x + b1
y = m2 x + b2

这是一个简单的线性方程组。

如果你解决它们,你的交集是:

x = (b2 - b1)/(m1 - m2)
y = (m1 b2 - m2 b1)/(m1 - m2)

答案 1 :(得分:1)

对于未来的Google员工:

def solution k, l, m, n, p, q, r, s
  intrsc_x1 = m - k
  intrsc_y1 = n - l
  intrsc_x2 = r - p
  intrsc_y2 = s - q

  v1 = (-intrsc_y1 * (k - p) + intrsc_x1 * (l - q)) / (-intrsc_x2 * intrsc_y1 + intrsc_x1 * intrsc_y2);
  v2 = ( intrsc_x2 * (l - q) - intrsc_y2 * (k - p)) / (-intrsc_x2 * intrsc_y1 + intrsc_x1 * intrsc_y2);

  (v1 >= 0 && v1 <= 1 && v2 >= 0 && v2 <= 1) ? true : false
end

我在互联网上找到的最简单,最干净的方式。

答案 2 :(得分:0)

在遭受了许多苦难和许多不同尝试之后,我发现了一种简单的代数方法here,它不仅可以工作,而且可以大大简化。

distance = ((y - mx - b).abs / Math.sqrt(m**2 + 1))

其中x和y是已知点的坐标。