一、数学模型
不同空间直角坐标系之间的变换,其参数有(ΔX0,ΔY0,ΔZ0,ωX,ωY,ωZ,m)七个,其中(ΔX0,ΔY0,ΔZ0)为坐标平移量,(ωX,ωY,ωZ)为坐标轴间的三个旋转角度(又称为欧拉角),m为尺度因子。七参数模型如图。
二、七参数反解
- 算法
上述方程有7个未知参数,3个共公点就可以解算这7个参数。由于公共点存在误差,当公共点多余于3个时,引入坐标改正量Vx,Vy,Vz,则有:
则误差方程为:
可化简为:V=AX+L
依据最小二乘原理V。PV=最小,求出参数向量x的解,即
一般情况下,设转换的新旧坐标是相互独立的且等权,即P为单位权阵。
2.编程实现
在vc++中加载Matrix.dll,Matrix.h,Matrix.lib文件,应用模型函数实现主要代码如下:
Trans(A,AT,3*Count1,7);//求转置
damul(AT,A,7,3*Count1,7,ATA);
damul(AT,L,7,3*Count1,1,ATL);
invATA=ATA;
dcinv(invATA,7);
damul(invATA,ATL,7,7,1,X);//V=AX+L最小二乘法
三、坐标转换
- 算法
如图1
2.编程实现
在这里我们有两种方法实现,一种是和上面一样采用数学建模模型调用damul()函数,这种方法运算速度快。第二种是将算法1展开,具体代码如下:
q_coord.x=m_Px+p_coord.x*(1+m_ChiDu)+m_Xz*p_coord.y-m_Xy*p_coord.z;
q_coord.y=m_Py+p_coord.y*(1+m_ChiDu)-m_Xz*p_coord.x+m_Xx*p_coord.z;
q_coord.z=m_Pz+p_coord.z*(1+m_ChiDu)+m_Xy*p_coord.x-m_Xx*p_coord.y;
四、源码https://download.csdn.net/download/sailingw/2942845?spm=1001.2014.3001.5501