在另一点的相对位置找到一个点

时间:2018-09-13 10:26:45

标签: javascript math coordinates point linear

给定两个2D点(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 个答案:

答案 0 :(得分:2)

如果您了解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)

答案 1 :(得分:1)

一种正确算法的版本如下(这甚至不是伪代码,但应该说明如何做):

  • 计算p1和p2之间的距离(使用pythag)
  • 将给定距离(distance_p2_to_p3)除以
  • 对于每个x和y坐标,加上deltaX(resp deltaY)乘以该比率

答案 2 :(得分:1)

请注意减号,因为增量是从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
}

答案 3 :(得分:1)

让我们假设所有三行都在一行中。然后斜率是deltaY/deltaX。如果p3水平距离p2 x,则垂直距离p {2} deltaY/deltaX * xdistance_p2_to_p3^2 = x^2 + (deltaY/deltaX * x)^2,求解x。然后从x添加/减去p2.x,然后从p2.y添加deltaY/deltaX * x