Javascript 在另一点的相反位置上找到一点

Javascript 在另一点的相反位置上找到一点,javascript,math,coordinates,linear-algebra,point,Javascript,Math,Coordinates,Linear Algebra,Point,给定两个2D点(p1和p2),我需要找到一个点(p3)(从p1的角度来看)位于p2的另一侧,同时它需要与p2有一个给定的距离 如果给定的距离更大,它可能看起来像这样: ^ | | p1 | p2 | | p3 <-|----------------------------> v ^ | | | p3 | p2 |p1 <-|

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

如果给定的距离更大,它可能看起来像这样:

  ^
  |
  | p1      
  |         p2 
  |     
  |                         p3
<-|---------------------------->
  v
  ^
  |
  |
  |    p3
  |  p2   
  |p1
<-|---------------------------->
  v
^
|
|p1
|p2
|     
|p3
v
或者像这样,以较小的给定距离:

  ^
  |
  | p1      
  |         p2 
  |     
  |                         p3
<-|---------------------------->
  v
  ^
  |
  |
  |    p3
  |  p2   
  |p1
<-|---------------------------->
  v
^
|
|
|p3
|p2
|p1
v
如何计算该点(p3)

我选择的语言是JavaScript,但我并不是严格要求JavaScript的答案。如果你能用一种可以翻译成代码的方式来解释它,或者如果你写的是伪代码,那就好了

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

计算\u p2的另一侧(p1,p2,距离\u p2到\u p3)上的\u点\u{
deltaX=p1.x-p2.x
deltaY=p1.y-p2.y
距离_p1_至_p2=sqrt(deltaX*deltaX+deltaY*deltaY)
如果(deltaX<0)
p3.x=p2.x+距离p2到p3
其他的
p3.x=p1.x-距离p2到p3
如果(三角洲<0)
p3.y=p2.y+距离p2到p3
其他的
p3.y=p1.y-距离p2到p3
返回p3
}

正确算法的一个版本如下所示(这甚至不是伪代码,但应该解释如何操作):

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

注意减号,因为delta是从p2到p1的向量分量,而p2p3p2p1反共线

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
,则p3垂直距离p2
deltaY/deltaX*x
<代码>距离p2到p3^2=x^2+(deltaY/deltaX*x)^2,求解
x
。然后从
p2.x
中添加/减去
x
,然后从p2.y中添加/减去
deltaY/deltaX*x

如果您了解二维向量的工作原理,这是一个简单的问题

计算从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)

你的意思是取距离p1到p2的平方根吗?是的,当然。更正了。我想在你的else语句中,你需要做
p3.x=p2.x-distance\u p2\u到p3
p3.y=p2.y-distance\u p2\u到p3
即从p2减去,而不是p1,我不知道。但是在x和y上增加/减少距离p2到p3无论如何都不是解决方案。在计算机几何中,使用斜率通常是错误的方法(只要想象垂直线)@MBo好点。我想我们可以在计算斜率之前考虑边缘情况,但我喜欢你使用比率的答案