找到一条直线与已知直线相交的线,给定一个点

时间:2011-07-08 21:15:32

标签: graphics geometry

这是基本的图形几何和/或触发,我觉得它很愚蠢,但我不记得这是怎么回事。所以:

  1. 我有一条由两点(x1,y1)和(x2,y2)定义的线。
  2. 我有第三个点(xp,yp)位于其他地方。
  3. 我想计算位于#1线上某处的点(x',y'),这样当与#2点连接时,会创建一条到第一行的新垂线。 enter image description here

    感谢。

6 个答案:

答案 0 :(得分:7)

在这种计算几何中,一个有用的经验法则是你应该尽可能地使用向量,只作为最后的手段切换到笛卡尔坐标。所以让我们用向量代数来解决这个问题。假设您的行从 p 变为 p + r ,另一个点是 q

现在,该线上的任何一点,包括你想要找到的点(称之为 s ),都可以表示为 s = p < / strong> +λ r 用于标量参数λ。

现在 q s 的向量必须垂直于 r 。因此

  

q - ( p r ))· r = 0

其中·是dot product operator。展开产品:

  

q - p )· r =λ( r · r

并分开:

  

λ=( q - p )· r / r · r

当你实现它时,你需要检查 r · r = 0,以避免被零除。

答案 1 :(得分:6)

您可以通过首先考虑从(x, y)(x1, y1)的行中的通用点(x2, y2)找到该点:

x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)

并从(xp, yp)

计算此点的(平方)距离
E = (x - xp)**2 + (y - yp)**2

代替xy的定义

E = (x1 + t*(x2 - x1) - xp)**2 +
    (y1 + t*(y2 - y1) - yp)**2

然后找到相对于t

我们得出E的距离变化t的最小距离
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
        2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)

经过一些计算后得出

dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
           t*((x2 - x1)**2 + (y1 - y2)**2))

当这个导数为零时,我们得到t

的显式等式
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
    ((x2 - x1)**2 + (y2 - y1)**2)

所以可以使用t定义中(x, y)的值来计算最终点。

使用矢量符号这与Gareth提出的完全相同的公式......

t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>

其中符号<a, b>表示点积运算ax*bx + ay*by

另请注意,完全相同的公式适用于n维空间。

答案 2 :(得分:1)

答案是:

y=ax+b
where a=(x1-x2)/(y2-y1)
      b=yp-(x1-x2)*xp/(y2-y1)

如何获得结果:

1) slope for the original line:   (y2-y1)/(x2-x1)

2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1)

3) Plug this into (xp,yp) we can have the result line.

在此之后计算答案(这太长了......我很饿)。

答案 3 :(得分:1)

对于所有使用向量寻找具体示例的可怜人...在这里,我基于加雷斯的回答。

您有一个向量,从p到r(从0,0到50,-50),另一个点q在(50,0)。 q与从p到r的向量的直角交点为{x:25. y:-25},并使用以下代码导出。

FuzzySearch.extractTop
const p = [0, 0];
const r = [50, -50];
const q = [50, 0];
const l = math.add(p, r);
const m = math.dot(math.subtract(q, p), r) / math.dot(r, r);

console.log('intersecting point',  math.multiply(l, m));

答案 4 :(得分:0)

您可以求解连接(x1, y1)(x2, y2)的线的斜率。然后你知道垂直线的斜率是负斜率。

要查找y轴截距,请使用斜率查看该线在yx=0x1的行进距离。

b + (x1 - x0) * m = y1
b + (x1 -  0) * m = y1
b + (x1 * m)      = y1
b = y1 - x1 * m

然后,您可以获得两点之间的线的公式以及(xp, yp)中具有上述斜率的线。对于给定的x,它们具有相等的y,因此您可以求解x,然后将其插入y的任一公式中。

m = slope_from_1_to_2  = (y2 - y1) / (x2 - x1)
n = slopePerpendicular = (-1) / m

b = intercept_for_1_to_2 = y1 - x1 * m
c = intercept_for_p      = yp - xp * n

因此,线的方程是形式的 y = mx + b

第1点和第2点:

y(x) = mx + b

点p:

y(x) = nx + c

y设为等于找x'

mx' + b = nx' + c
(m-n)x' = c - b
     x' = (c - b) / (m - n)

因此使用任一公式计算y'

y' = mx' + b

答案 5 :(得分:0)

基于this article

let x1, x2, y1, y2, slope, xp, yp, m, x, y
x1 = 0
y1 = 0 
x2 = 50
y2 = -50
xp = 50
yp = 0

slope = (y1 - y2) / (x1 - x2)
m = -1 / slope
x = (m * xp - yp - slope * x1 + y1) / (m - slope)
y = m * x - m * xp + yp

console.log('x: ', x, ', y: ', y )