七引數模型與三維座標點的轉化

2021-09-14 05:54:46 字數 1677 閱讀 4013

用於三維空間座標系變換的 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...