在另一个点的对面位置上找到一个点



给定两个 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
}

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

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

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

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

假设所有三行都在一行中。然后斜率deltaY/deltaX.如果 p3 在水平方向上与 p2x,则它在垂直方向上与 p2deltaY/deltaX * x距离。distance_p2_to_p3^2 = x^2 + (deltaY/deltaX * x)^2,解决x。然后从p2.x中添加/减去x,从 p2.y 中添加减去deltaY/deltaX * x

相关内容

  • 没有找到相关文章

最新更新