C++ 如何执行笛卡尔变换

C++ 如何执行笛卡尔变换,c++,geometry,coordinate-transformation,C++,Geometry,Coordinate Transformation,我相信笛卡尔变换是我所需要的,但我不确定。这是我的问题 我有两个坐标系,一个是全局的x,y,z,另一个是局部的I,j,k,存在于x,y,z的内部 我知道本地系统在全球范围内的原点位置。我们把它标为B 我知道沿轴I和j还有两个点C和E。这意味着我的轴i可以由线BC定义,轴j可以由线be定义。轴k将垂直于二维平面i,j 如何将一个系统的坐标转换为另一个系统的坐标 例如,假设我知道D{x,y,z},我知道D存在于局部坐标系中,我如何得到D{I,j,k}?还有,我怎样才能回到另一个方向呢 如何: D{x

我相信笛卡尔变换是我所需要的,但我不确定。这是我的问题

我有两个坐标系,一个是全局的x,y,z,另一个是局部的I,j,k,存在于x,y,z的内部

我知道本地系统在全球范围内的原点位置。我们把它标为B

我知道沿轴I和j还有两个点C和E。这意味着我的轴i可以由线BC定义,轴j可以由线be定义。轴k将垂直于二维平面i,j

如何将一个系统的坐标转换为另一个系统的坐标

例如,假设我知道D{x,y,z},我知道D存在于局部坐标系中,我如何得到D{I,j,k}?还有,我怎样才能回到另一个方向呢

如何:
D{x,y,z}D{i,j,k}

仿射变换是由3×1平移向量B和3×3旋转矩阵E定义的。现在你想取一个局部点
p=(i_p,j_p,k_p)
并将其变换为全局点
p'=(x_p,y_p,z_p)
。这是由

    P' = B + E * P
  • 翻译很简单,
    B=(B_x,B_y,B_z)
  • 旋转矩阵定义为单位向量
    i
    j
    k
    的全局坐标,作为矩阵的三列

        | i_x  j_x  k_x |
    E = | i_y  j_y  k_y |
        | i_z  j_z  k_z |
    
  • 要查找这些组件,请使用点的坐标
    B=(B_x,B_y,B_z)
    C=(C_x,C_y,C_z)
    E=(E_x,E_y,E_z)

  • 取C和B之间的差值,并将其作为
    i
    的单位向量。找出它们之间的距离,如图所示

    d_BC = sqrt( (B_x-C_x)^2 + (B_y-C_x)^2 + (B_z-C_z)^2 );
    
    d_BE = sqrt( (B_x-E_x)^2 + (B_y-E_x)^2 + (B_z-E_z)^2 );
    
    其组成部分包括:

    i_x = (C_x-B_x)/d_BC;
    i_y = (C_y-B_y)/d_BC;
    i_z = (C_z-B_z)/d_BC;
    
    j_x = (E_x-B_x)/d_BE;
    j_y = (E_y-B_y)/d_BE;
    j_z = (E_z-B_z)/d_BE;
    
  • 取E和B之间的差值,并将其作为
    j
    的单位向量。找出它们之间的距离,如图所示

    d_BC = sqrt( (B_x-C_x)^2 + (B_y-C_x)^2 + (B_z-C_z)^2 );
    
    d_BE = sqrt( (B_x-E_x)^2 + (B_y-E_x)^2 + (B_z-E_z)^2 );
    
    其组成部分包括:

    i_x = (C_x-B_x)/d_BC;
    i_y = (C_y-B_y)/d_BC;
    i_z = (C_z-B_z)/d_BC;
    
    j_x = (E_x-B_x)/d_BE;
    j_y = (E_y-B_y)/d_BE;
    j_z = (E_z-B_z)/d_BE;
    
  • 使用向量叉积
    k=i×j

    k_x = i_y*j_z - i_z*j_y;
    k_y = i_z*j_x - i_x*j_z;
    k_z = i_x*j_y - i*y*j_x;
    
  • 完全的转变正在进行

    x_P = B_x + i_x*i_P + j_x*j_P + k_x*k_P;
    y_P = B_y + i_y*i_P + j_y*j_P + k_y*k_P;
    z_P = B_z + i_z*i_P + j_z*j_P + k_z*k_P;
    
    编辑1

    反向转换是

        P = E'*(P'-B)
    
    其中
    E'
    是3×3矩阵
    E
    的转置。在组件形式中,这是

    i_P = i_x*(x_P-B_x) + i_y*(y_P-B_y) + i_z*(z_P-B_z);
    j_P = j_x*(x_P-B_x) + j_y*(y_P-B_y) + j_z*(z_P-B_z);
    k_P = k_x*(x_P-B_x) + k_y*(y_P-B_y) + k_z*(z_P-B_z);
    

    如果您需要数学方面的帮助,请访问相应的数学网站。您好@ja72,我衷心感谢您的帮助和非常详尽的回答。我更关心xyz->ijk,而不是相反,我如何才能改变这个等式呢?我会研究你的信息,看看我是否能自己得到答案。我想PM你个人感谢你,也让你知道更多关于你帮助的项目,看看是否有一种方式,我可以信任你的贡献。唉,stackoverflow不允许这样的事情,所以请随时与我联系chrisbay90@gmail.comSee为反向转换编辑。如果你喜欢,请将我作为SO用户并链接到我的个人资料。