Javascript 罗德里格斯&x27;矢量旋转公式

Javascript 罗德里格斯&x27;矢量旋转公式,javascript,matrix,linear-algebra,Javascript,Matrix,Linear Algebra,我试着做罗德里格斯公式,绕任意轴旋转一定角度。我有这个密码 功能规范(v){ 返回Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); } 函数规格化(v){ var长度=标准值(v); 返回[v[0]/length,v[1]/length,v[2]/length]; } 功能点产品(v1、v2){ 返回v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]; } 函数叉积(v1,v2){ 返回[v1[1]*v2[2]-v1[2]*v2[1],v1

我试着做罗德里格斯公式,绕任意轴旋转一定角度。我有这个密码

功能规范(v){
返回Math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
}
函数规格化(v){
var长度=标准值(v);
返回[v[0]/length,v[1]/length,v[2]/length];
}
功能点产品(v1、v2){
返回v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
}
函数叉积(v1,v2){
返回[v1[1]*v2[2]-v1[2]*v2[1],v1[2]*v2[0]-v1[0]*v2[2],v1[0]*v2[1]-v1[1]*v2[0]];
}
函数getAngle(v1、v2){
返回Math.acos(点积(v1,v2)/(范数(v1)*范数(v2));
}
函数矩阵乘(矩阵,v){
返回[dotProduct(矩阵[0],v]、dotProduct(矩阵[1],v]、dotProduct(矩阵[2],v)];
}
函数aRotate(p,v,a){
var ca=Math.cos(a),sa=Math.sin(a),t=1-ca,x=v[0],y=v[1],z=v[2];
变量r=[
[ca+x*x*t,x*y*t-z*sa,x*z*t+y*sa],
[x*y*t+z*sa,ca+y*y*t,y*z*t-x*sa],
[z*x*t-y*sa,z*y*t+x*sa,ca+z*z*t]
];
返回矩阵的倍数(r,p);
}
var v1=[5,-6,4];
var v2=[8,5,-30];
var a=getAngle(v1,v2);
var cp=交叉积(v1,v2);
var ncp=正常化(cp);
var np=aRotate(v1,ncp,a);

console.log(np);// 我认为这里没有问题

np
是一个方向正确(与
v2
方向相同)但大小错误的向量。您可以看到:

console.log(normalize(v2), normalize(np));
结果是:


[0.254385200299, 0.1589907501872, -0.953944501123]
[0.254385200299, 0.1589907501872, -0.953944501123]

v2
可以通过
norm(v2)*normalize(np)
找到


由于
v1
v2
的长度非常不同,因此旋转
v1
只能获得正确的方向,但结果向量的长度仍将具有
v1
的长度。您可以通过以下方式看到这一点:


log(norm(v1),norm(np));

返回:


8.774964387392123
8.774964387392123

我认为这里没有问题

np
是一个方向正确(与
v2
方向相同)但大小错误的向量。您可以看到:

console.log(normalize(v2), normalize(np));
结果是:


[0.254385200299, 0.1589907501872, -0.953944501123]
[0.254385200299, 0.1589907501872, -0.953944501123]

v2
可以通过
norm(v2)*normalize(np)
找到


由于
v1
v2
的长度非常不同,因此旋转
v1
只能获得正确的方向,但结果向量的长度仍将具有
v1
的长度。您可以通过以下方式看到这一点:


log(norm(v1),norm(np));

返回:


8.774964387392123
8.774964387392123

我为您设置了一个基本的测试框架,您可以使用它进行进一步的调试。请使用此选项将您的“预期”值与您收到的值进行比较。我为您设置了一个基本的测试框架,您可以使用它进行进一步的调试。请使用此选项将您的“预期”值与您收到的值进行比较。然后,
rotate
不是适合该作业的工具。你发布的函数旋转得很好!哦,好吧,我忘了它们是不同长度的,这就是问题所在。然后
旋转
不是适合这项工作的工具。你发布的函数旋转得很好!哦,好吧,我忘了它们是不同长度的,这就是问题所在。