【问题标题】:finding point on a line which is equidistant from 2 other points在与其他 2 个点等距的线上找到点
【发布时间】:2014-06-06 11:47:52
【问题描述】:

我知道我可能应该在 math.stackexchange 中问这个问题,但答案大多是“笔纸”类型。我需要一种有效的方法来实施,这就是我在这里问的原因。

Q:给定 2 个点 A 和 B 以及一条线 L。点和线是 3D 的。如何在给定的直线 L 上找到与给定点 A 和 B 等距的点?

我遵循的方法是:

  • 找到垂直于线 AB 并通过 A 和 B 中心的平面 P。

  • P 和 L 的交点就是答案。

我正在处理大型数据集(3d 图像),并且进行上述计算涉及大量数字。乘法和除法(总计)。

那么有没有更好的方法呢。

一个有效的代码会很有帮助。

提前致谢。

【问题讨论】:

  • 怀疑有没有更好的方法来做到这一点。这是问答网站,而不是应该为您的问题提供工作代码的网站,而您的贡献为零。
  • @shujj :老兄要么尝试帮助,要么忽略该帖子。没有人专门问你。就贡献而言,我是开源的积极贡献者,这个问题仅与这些开放项目之一有关。所以不要在不知道确切信息的情况下发表评论。
  • @gmaster 你应该接受这些答案之一。

标签: algorithm geometry line plane


【解决方案1】:

如果线L用参数向量方程来描述

P=C+t*D  

(其中C是某个基点,D是方向向量,t是参数)
然后点 P 与给定点 A 和 B 等距,当从 P 到 A-B 段中间的向量垂直于 AB 向量时。所以这些向量的标量积为零。

(B-A)*(C+t*D-(A+B)/2)=0

让我们

F=B-A
G=C-(A+B)/2

那么(坐标形式)

Fx*(Gx+t*Dx)+Fy*(Gy+t*Dy)+Fz*(Gz+t*Dz)=0
t*(Dx*Fx+Fy*Dy+Fz*Dz)=-(Fx*Gx+Fy*Gy+Fz*Gz)
t=-(Fx*Gx+Fy*Gy+Fz*Gz)/(Dx*Fx+Fy*Dy+Fz*Dz)

(Dx*Fx+Fy*Dy+Fz*Dz)=0 的情况对应于垂直线 AB 和 L。在这种情况下,当 nominator (Fx*Gx+Fy*Gy+Fz*Gz) 不为零时,没有解,如果 nominator 为零(线上的所有点等距)

【讨论】:

    【解决方案2】:

    TL;DR.解决方案在底部。

    好的,假设这些是我们的参数:

    x0x1 , 描述这条线。

    ab,这两点。

    在哪里

    x0 = [x0, y0, z0]

    x1 = [x1, y1, z1]

    a = [xa, ya, za]

    b = [xb, yb, zb]

    δ = [δx, δy, δz] = (x1 - x0)

    那么我们对线的描述可以看成是一个参数函数:

    l(λ) = x0 + λ*(x1 - >x0)

    所以我们试图找到满足以下等式的 λ 值:

    (l(λ) - a)2 = (l(λ) - b)2

    (这里我有点用符号作弊,所以 x2 = x.x强>)

    所以扩展我们得到的一切:

    (λx1 + (1 - λ)x0 - xa)2 +

    (λy1 + (1 - λ)y0 - ya)2 +

    (λz1 + (1 - λ)z0 - za)2 =

    (λx1 + (1 - λ)x0 - xb)2 +

    (λy1 + (1 - λ)y0 - yb)2 +

    (λz1 + (1 - λ)z0 - zb)2

    化简,我们得到:

    (λδx + x0 - xa)2 +

    (λδy + y0 - ya)2 +

    (λδz + z0 - za)2 =

    (λδx + x0 - xb)2 +

    (λδy + y0 - yb)2 +

    (λδz + z0 - zb)2

    展开括号并取消,我们得到:

    -2δxxaλ + (x0 - xa)2 +

    -2δyyaλ + (y0 - ya)2 +

    -2δzzaλ + (z0 - za)2 =

    -2δxxbλ + (x0 - xb)2 +

    -2δyybλ + (y0 - yb)2 +

    -2δzzbλ + (z0 - zb)2

    我们可以进一步简化成一些漂亮的向量操作:

    δ.(xb - xa ) = (x0 - xb)2 - (x0 - xa)2

    这很容易重新排列以获得具有唯一解的 λ 线性方程。

    【讨论】:

    • 需要注意的是:1)如果右轴不为零,左轴为零,则没有解 2)如果右轴为零,左轴为零,则有无穷多个解 3)有是 $\vec{x_0}$ 的一种解,如果 RHS 为零且 LHS 非零
    • 补充 B-Brock 的评论,情况如下: (1) 线退化(梯度向量为 0)且 x_a != x_b。 (2) xa = xb (3) 其实不是特例,而是用x_0和x_1来描述线的神器。
    【解决方案3】:

    您可以求解方程组来得到答案。 3D 中的线条类似于:

    x = x<sub>0</sub> + t * v<sub>x</sub>
    y = y<sub>0</sub> + t * v<sub>y</sub>
    z = z<sub>0</sub> + t * v<sub>z</sub>
    

    让我们指出我们正在搜索P 的点。现在我们有:

    (Px - Ax)2 + (Py - Ay)2 +(Pz - Az)2 = (Px - Bx)2 + (Py - By)2 + (Pz - Bz )2

    请注意,虽然所有这些方程似乎都是二次方程,但 Px 的平方我们被划伤了,因为它出现在方程的两边。现在使用这个方程组和上面的方程组来找到三个变量 Px、Py 和 Pz

    【讨论】:

    • 如果我错了,请纠正我。 (Px - Ax)2 = (Px - Bx)2 ==> (Px - Ax) = (Px - Bx) ==> Ax = Bx。我想这成立:(Px - Ax)2 + (Py - Ay)2 + (Pz - Az)2= (Px - Bx)2 +(Py - By)2 + (Pz - Bz)2。
    • @gmaster 我写的是错误的。我会修复它抱歉。感谢您的关注
    • 现在方程真的是二次的。 :D
    • @gmaster 还是 Px^2 会从两侧划伤。
    • 哦对不起..我的错.. :|
    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 2011-06-04
    • 2019-10-31
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多