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

Need to check if point X is in any distance from a line made between 2 dots

我用的是Sourcepawn,也能看懂java,但我只需要一个小窍门,想法可以继续

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

感谢任何提示,谢谢!

鉴于您想知道具有定义点 p1p2p3 的向量 d,您可以执行以下操作(向量变量带有下划线):




或者,在代码更友好的表示法中(我在这里使用 JavaScript),我们将向量表示为带有 x- 和 y-values:

的数组

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,0], 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 个(或更多!)维度。只需将更多组件(=坐标值)添加到(全部)向量数组。矢量函数将自动处理所有定义的维度。

如果您只想知道最小距离的标量值,那么事情会变得简单一些:

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
                                // sample point values (3D):
const p1=[1,5,0], p2=[6,2.5,0], p3=[2,2,0];

const a=p2.map(fromP1),         // 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)) );