在给定点的情况下,找到与已知直线相交的直线

Ben*_*tto 7 graphics geometry

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

  1. 我有一条由两点(x1,y1)和(x2,y2)定义的线.
  2. 我有第三个点(xp,yp)位于其他地方.

我想计算位于#1线上某处的点(x',y'),这样当与#2点连接时,会创建一条到第一行的新垂线. 在此输入图像描述

谢谢.

Gar*_*ees 7

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

现在,线路上的任何一点,包括你正在努力寻找点(称之为s ^),可以作为表达小号  =  p  +λ [R的标量参数λ.

现在从qs的向量必须垂直于r.因此

(q - (p- [R ))· [R = 0

其中·是点积运算符.展开产品:

(q - pr =λ(r · r)

除以:

λ=(q - pr/r · r

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


650*_*502 6

您可以考虑先一般点找到那个点(x, y),从沿线(x1, y1)(x2, y2):

x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
Run Code Online (Sandbox Code Playgroud)

并计算从这一点开始的(平方)距离 (xp, yp)

E = (x - xp)**2 + (y - yp)**2
Run Code Online (Sandbox Code Playgroud)

代替xy给出的定义

E = (x1 + t*(x2 - x1) - xp)**2 +
    (y1 + t*(y2 - y1) - yp)**2
Run Code Online (Sandbox Code Playgroud)

然后找到这个距离而变化的最小t我们得出E相对于t

dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
        2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
Run Code Online (Sandbox Code Playgroud)

经过一些计算得出

dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
           t*((x2 - x1)**2 + (y1 - y2)**2))
Run Code Online (Sandbox Code Playgroud)

当这个导数为零时,我们得到一个明确的等式 t

t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
    ((x2 - x1)**2 + (y2 - y1)**2)
Run Code Online (Sandbox Code Playgroud)

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

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

t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>
Run Code Online (Sandbox Code Playgroud)

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

还要注意,相同的公式在n维空间中起作用.


Sea*_*son 1

对于所有那些寻找使用向量的具体例子的可怜的灵魂......在这里我以加雷斯的答案为基础。

您有一个从 p 到 r(从 0,0 到 50,-50)的向量,以及位于 (50, 0) 的另一个点 q。q 和从 p 到 r 的向量的直角交集是 { x: 25.y: -25 },并通过以下代码导出。

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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.1.2/math.js"></script>
Run Code Online (Sandbox Code Playgroud)