在3d空间中的3点之间的角度

Mir*_*cea 13 3d

我有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)

的点积v1v2是(它是由他们的量值的乘积缩放)它们之间的角度的余弦的函数.首先要规范化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)


Bru*_*ade 6

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;\n
Run Code Online (Sandbox Code Playgroud)\n