0

给定两个二维点(p1 和 p2),我需要找到一个点(p3)(从 p1 的角度来看)位于 p2 的另一侧,同时它需要与 p2 有给定的距离。

在给定距离更大的情况下,它可能看起来像这样:

  ^
  |
  | p1      
  |         p2 
  |     
  |                         p3
<-|---------------------------->
  v

或者像这样具有较小的给定距离:

  ^
  |
  |
  |    p3
  |  p2   
  |p1
<-|---------------------------->
  v

我怎样才能计算这个点(p3)?

我选择的语言是 JavaScript,但我并不是严格要求 JavaScript 答案。如果您可以以可翻译成代码的方式对其进行解释,或者您编写伪代码就可以了。

这是我最后一次尝试(显然这行不通):

calculate_point_on_other_side_of_p2(p1, p2, distance_p2_to_p3) {
    deltaX = p1.x-p2.x
    deltaY = p1.y-p2.y
    distance_p1_to_p2 = sqrt(deltaX*deltaX + deltaY*deltaY)
    if (deltaX < 0)
        p3.x = p2.x+distance_p2_to_p3 
    else
        p3.x = p1.x-distance_p2_to_p3

    if (deltaY < 0)
        p3.y = p2.y+distance_p2_to_p3
    else
        p3.y = p1.y-distance_p2_to_p3
    return p3
}
4

4 回答 4

3

如果您了解 2D 矢量的工作原理,这是一个简单的问题。

计算从 p1 到 p2 的单位向量:

(nx, ny) = ((p2x - p1x)*i + (p2y-p1y)*j)/sqrt((p2x-p1x)^2 + (p2y-p1y)^2)

其中 i 和 j 分别是 x 和 y 方向的单位向量。

现在您可以在距 p1 的任何距离 d 处计算 (p3x, p3y):

(p3x, p3y) = (p1x, p1y) + (d*nx, d*ny)
于 2018-09-13T12:18:20.210 回答
2

注意减号,因为增量是从 p2 到 p1 的向量的分量,但p2p3与p2p1是反共线的

calculate_point_on_other_side_of_p2(p1, p2, distance_p2_to_p3) {
    deltaX = p1.x-p2.x
    deltaY = p1.y-p2.y
    distance_p1_to_p2 = sqrt(deltaX*deltaX + deltaY*deltaY)
    scale = distance_p2_to_p3 / distance_p1_to_p2 
    p3.x = p2.x - deltaX * scale
    p3.y = p2.y - deltaY * scale
    return p3
}
于 2018-09-13T10:39:01.257 回答
1

假设所有三行都在一条线上。那么斜率为deltaY/deltaX。如果 p3x水平远离 p2,那么它deltaY/deltaX * x垂直远离 p2。distance_p2_to_p3^2 = x^2 + (deltaY/deltaX * x)^2, 求解x. x然后从p2.y 中添加/减去p2.x和 add.subtract 。deltaY/deltaX * x

于 2018-09-13T10:42:51.130 回答
1

正确算法的一个版本如下(这甚至不是伪代码,但应该解释要做什么):

  • 计算出 p1 和 p2 之间的距离(使用 pythag)
  • 除以给定的距离(distance_p2_to_p3)
  • 对于每个 x 和 y 坐标,加上 deltaX (resp deltaY) 乘以该比率
于 2018-09-13T10:37:06.420 回答