我有两行:
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
有没有宝石或更好的方法呢?
注意:上述方法不起作用。请参阅我的答案,了解有效的解决方案。
答案 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是已知点的坐标。