给定两个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
}
让我们假设所有三条线都在一条线上。然后斜坡是deltaY/deltaX
。如果p3是水平远离p2的x
,则qzxswpoi垂直于p2。 deltaY/deltaX * x
,解决distance_p2_to_p3^2 = x^2 + (deltaY/deltaX * x)^2
。然后从x
添加/减去x
并从p2.y添加/减去p2.x
。