问题描述
我正在使用Sourcepawn,也可以理解java,但是我只需要一个提示,想法就可以解决
-2个红点是光束的端点。光束可以成任何角度(X,Y)。我需要关注绿色点,检查橙色线(我没有更多点,只有2个端点)和绿色点之间的最近距离。
感谢任何提示,谢谢!
解决方法
假设您想知道具有定义点d
,p1
和p2
的向量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个(甚至更多!)尺寸同样有效。只需将其他分量(=坐标值)添加到向量数组的(全部)。向量函数将自动处理所有定义的尺寸。
如果您只想知道最小距离的标量值,那么事情就容易多了:
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)) );