我有3个包含X,Y,Z坐标的点:
var A = {x: 100, y: 100, z: 80},
B = {x: 100, y: 175, z: 80},
C = {x: 100, y: 100, z: 120};
Run Code Online (Sandbox Code Playgroud)
坐标是来自3d CSS变换的像素.如何获得向量BA和BC之间的角度?数学公式会做,JavaScript代码会更好.谢谢.

Rog*_*and 27
在伪代码中,向量BA(称之为v1)是:
v1 = {A.x - B.x, A.y - B.y, A.z - B.z}
Run Code Online (Sandbox Code Playgroud)
类似地,向量BC(称为v2)是:
v2 = {C.x - B.x, C.y - B.y, C.z - B.z}
Run Code Online (Sandbox Code Playgroud)
的点积v1和v2是(它是由他们的量值的乘积缩放)它们之间的角度的余弦的函数.首先要规范化v1并且v2:
v1mag = sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z)
v1norm = {v1.x / v1mag, v1.y / v1mag, v1.z / v1mag}
v2mag = sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z)
v2norm = {v2.x / v2mag, v2.y / v2mag, v2.z / v2mag}
Run Code Online (Sandbox Code Playgroud)
然后计算点积:
res = v1norm.x * v2norm.x + v1norm.y * v2norm.y + v1norm.z * v2norm.z
Run Code Online (Sandbox Code Playgroud)
最后,恢复角度:
angle = acos(res)
Run Code Online (Sandbox Code Playgroud)
double GetAngleABC( double* a, double* b, double* c )\n{\n double ab[3] = { b[0] - a[0], b[1] - a[1], b[2] - a[2] };\n double bc[3] = { c[0] - b[0], c[1] - b[1], c[2] - b[2] };\n\n double abVec = sqrt(ab[0] * ab[0] + ab[1] * ab[1] + ab[2] * ab[2]);\n double bcVec = sqrt(bc[0] * bc[0] + bc[1] * bc[1] + bc[2] * bc[2]);\n\n double abNorm[3] = {ab[0] / abVec, ab[1] / abVec, ab[2] / abVec};\n double bcNorm[3] = {bc[0] / bcVec, bc[1] / bcVec, bc[2] / bcVec};\n\n double res = abNorm[0] * bcNorm[0] + abNorm[1] * bcNorm[1] + abNorm[2] * bcNorm[2];\n\n return acos(res)*180.0/ 3.141592653589793;\n}\n\n\ndouble a[] = {1, 0, 0};\n\ndouble b[] = {0, 0, 0};\n\ndouble c[] = {0, 1, 0};\n\nstd::cout<< "The angle of ABC is " << GetAngleABC(a,b,c)<< "\xc2\xba " << std::endl;\nRun Code Online (Sandbox Code Playgroud)\n