用於三維空間座標系變換的 7引數模型,非常神奇。在工程測量中用的最多,從數學角度來說也是最嚴密的轉換方法。
由於結果中最多可求得七個轉換引數,即三個平移引數、三個旋轉引數(ex、ey、ez)和乙個尺度縮放因子(m),因此,通常也被稱為七引數法。
直接上**:
/// /// 根據3個或者3個以上的點的兩套座標系的座標計算7引數(最小二乘法) 適用於小角度轉換 bursa模型
///
/// 已知點的源座標系的座標
/// 已知點的新座標系的座標
/// 輸出: 7引數
public void calc7para(pointxyzdbl aptsource, pointxyzdbl aptto, ref sevenp sep)
else if (i % 3 == 1)
else if (i % 3 == 2)
}double[,] arrb = new double[aptsource.length * 3, 1]; // a * x = b 中的矩陣b, 如果有4個點,就是 12*1矩陣
for (int i = 0; i <= arrb.getlength(0) - 1; i++)
else if (i % 3 == 1)
else if (i % 3 == 2)
}#endregion
matrix mtra = new matrix(arra); // a矩陣
matrix mtrat = mtra.transpose(); // a的轉置
matrix mtrb = new matrix(arrb); // b矩陣
matrix mtratmula = mtrat.multiply(mtra); // a的轉置×a
// 求(a的轉置×a)的逆矩陣
mtratmula.invertgaussjordan();
// a的轉置 × b
matrix mtratmulb = mtrat.multiply(mtrb); // a的轉置 * b
// 結果
matrix mtrresult = mtratmula.multiply(mtratmulb);
sep.xdelta = mtrresult[0, 0];
sep.ydelta = mtrresult[1, 0];
sep.zdelta = mtrresult[2, 0];
sep.scale = mtrresult[3, 0];
sep.ex = mtrresult[4, 0] / sep.scale;
sep.ey = mtrresult[5, 0] / sep.scale;
sep.ez = mtrresult[6, 0] / sep.scale;
// ps: 必須考慮cosa = 0 不能作為分母的情況
// add code
}利用7引數計算xyz的**如下:
/// /// 利用7引數求新座標系的座標(存在問題!)
///
/// 點的源座標系的座標
/// 已經知道的7引數
/// 輸出: 點的新座標系的座標
public void calcxyzby7para(pointxyzdbl aptsource, sevenp sep, ref pointxyzdbl aptto)
}
OpenGL 螢幕二維座標轉化為三維模型座標
我們把opengl裡模型的三維座標往二維座標的轉化稱為投影,則螢幕上的二維座標往三維座標轉化則可以稱為反投影,下面我們來介紹一下反投影的方法。主要是gluunproject函式的使用,下面是 cpp view plain copy void screen2glpoint 注 x,y 是螢幕座標,wi...
三維座標點繞任意軸旋轉的新座標計算
任意軸可以用乙個起點乙個方向向量來表示。那麼繞任意軸旋轉就可以先將此軸移到通過原點,然後再旋轉,再將旋轉完的新座標做反向平移。則問題化為 計算繞通過原點的向量旋轉任意角度後的新點。假設單位向量為 rx,ry,rz 那麼旋轉矩陣如下 寫成函式如下 void rotate point3d float t...
基於二維四引數模型的座標轉換
前段時間資料工程測繪部領導找到我,需要乙個座標轉換工具。自2018年7月1號起,國家全面啟動cgcs2000座標系,以前的54座標系,80座標系都要轉成2000座標。測繪部曾花5萬塊錢臨時購買了乙個轉換工具,但後期更高精度座標轉換還需要費用。網上也有一些座標轉換的小工具,但是,只能支援單點或簡單tx...