需要检查点X是否与2个点之间的直线相距任何距离

问题描述

我正在使用Sourcepawn,也可以理解java,但是我只需要一个提示,想法就可以解决

Image

-2个红点是光束的端点。光束可以成任何角度(X,Y)。我需要关注绿色点,检查橙色线(我没有更多点,只有2个端点)和绿色点之间的最近距离。

感谢任何提示,谢谢!

解决方法

Sketch: 3 points 假设您想知道具有定义点dp1p2的向量p3,则可以执行以下操作(向量变量带有下划线):




或者,以一种更加代码友好的符号(我在这里使用JavaScript),我们将向量表示为具有x值和y值的数组:

const fromP1=(p,i)=>p-p1[i],// subtract vector p1 from current vector
         dot=(a,b)=>a.reduce((v,p,i)=>v+p*b[i],0); // scalar product
// these are just arbitrary sample point values:
const p1=[1,5,0],p2=[6,2.5,p3=[2,2,0];

const a=p2.map(fromP1),// vector from P1 to P2
  b=p3.map(fromP1),// vector from P1 to P3
 fa=dot(a,b)/dot(a,a),// scalar factor for vector a
  c=a.map(p=>p*fa),// scale vector a by fa
  d=b.map((p,i)=>p-c[i]);       // vector d = vector b - vector c
  
  console.log("vector c:",c);
  console.log("vector d:",d)

作为一点说明:此方法对3个(甚至更多!)尺寸同样有效。只需将其他分量(=坐标值)添加到向量数组的(全部)。向量函数将自动处理所有定义的尺寸。

enter image description here

如果您只想知道最小距离的标量值,那么事情就容易多了:

const fromP1=(p,0); // scalar product
                                // sample point values (3D):
const p1=[1,// vector from P1 to P2
      b=p3.map(fromP1);         // vector from P1 to P3

const ab=dot(a,b);

console.log("distance:",Math.sqrt(dot(b,b) - ab*ab/dot(a,a)) );