C#實現DLT直接線性變換(Direct Linear Transform)算法
參考資料:
1.武大版《工業測量技術與數據處理》P100-P106
2.轉載博文——MATLAB實現DLT(Direct Linear Transform)算法
一、編程要求及依據
- 編寫程序主要實現DLT算法,讀取數據文件,進行計算,輸出計算結果。
- 程序算法依據參見: 徐進軍教授.《工業測量技術與數據處理》.武漢大學出版社.第100-106頁
二、編程環境與語言
編程使用微軟的Visual Studio 2015中的WinForm環境下編寫,編寫語言爲C#。
三、DLT計算流程框圖
四、程序使用流程
- 打開DLT直接線性變換.exe程序,依次導入左像控制點數據文件,右像控制點數據文件和待求點像方數據文件;
- 計算左像係數L和像主點x0和y0,計算右像係數L和像主點x0和y0;
- 計算待定點物方座標;
- 導出待定點物方座標;
- 導出DLT計算報告。
五、計算結果分析
計算所得待定點物方座標 |
|||
點號 |
X |
Y |
Z |
1707 |
9.02889589578903 |
18.59576617145 |
10.7734065818369 |
3204 |
8.56662784077059 |
16.9495742408647 |
9.28675243972944 |
4204 |
7.74577543635323 |
16.1927805136872 |
9.29030273423021 |
3304 |
6.96298396130135 |
16.9611644191554 |
9.30017945488335 |
已知待定點物方座標 |
|||
點號 |
X |
Y |
Z |
1707 |
9.0332 |
18.6024 |
10.7738 |
3204 |
8.5615 |
16.9463 |
9.2898 |
4204 |
7.7391 |
16.1831 |
9.2921 |
3304 |
6.9585 |
16.9551 |
9.3016 |
因爲選取了少量數據,且只選擇了兩張像片計算係數L,所以精度在毫米範圍內。
六、數據文件格式說明
1.leftimage.txt和rightimage.txt文件爲選擇的像方和物方的同名控制點。其中1004號點對應測試數據裏的1D04。
格式爲:點號 x y X Y Z
2.unknownpoint.txt爲待求點已知像方座標。
格式爲:點號 左片座標x y 右片座標x y
3.待求點物方座標.txt文件爲計算得到的待求點物方座標。
格式爲:點號 物方X Y Z
4.DLT計算報告.txt文件爲計算過程中的中間量。
七、 程序界面
八、程序源代碼
using System;
using System.IO;
using System.Windows.Forms;
namespace DLT直接線性變換
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
////變量
string readleftimagefilename;
string readrightimagefilename;
string readunknownfilename;
string[] line1 = new string[6];
//把左像TXT中數據讀入數組
//leftimage
double[,] leftimage = new double[6, 6];
string[] line2 = new string[6];
//把右像TXT中數據讀入數組
//rightimage
double[,] rightimage = new double[6, 6];
string[] line3 = new string[4];
//把未知點TXT中數據讀入數組
//unknownpoint
double[,] unknownpoint = new double[4, 5];
//左像
double[,] leftL = new double[12, 1];
double[,] leftx0 = new double[1, 1];
double[,] lefty0 = new double[1, 1];
//右像
double[,] rightL = new double[12, 1];
double[,] rightx0 = new double[1, 1];
double[,] righty0 = new double[1, 1];
//待求點
private void 打開左像控制點文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openleftfile = new OpenFileDialog();
openleftfile.Filter = "文本文件(*.txt)|*.txt";
if (openleftfile.ShowDialog() == DialogResult.OK)
{
StreamReader readfile = new StreamReader(openleftfile.FileName);
readleftimagefilename = openleftfile.FileName;
int m, p;
richTextBox1.Text = "點號 x(m) y(m) X(m) Y(m) Z(m)\n";
for (m = 0; m < 6; m++)
{
line1[m] = readfile.ReadLine();
string[] data10 = line1[m].Split(' ');
for (p = 0; p < data10.Length; p++)
{
leftimage[m, p] = Convert.ToDouble(data10[p]);//將數據讀入具體變量
richTextBox1.Text += leftimage[m, p] + " ";
}
richTextBox1.Text += "\n";
}
}
}
private void 打開右像控制點文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openrightfile = new OpenFileDialog();
openrightfile.Filter = "文本文件(*.txt)|*.txt";
if (openrightfile.ShowDialog() == DialogResult.OK)
{
StreamReader readfile = new StreamReader(openrightfile.FileName);
readrightimagefilename = openrightfile.FileName;
int m, p;
richTextBox2.Text = "點號 x(m) y(m) X(m) Y(m) Z(m)\n";
for (m = 0; m < 6; m++)
{
line2[m] = readfile.ReadLine();
string[] data20 = line2[m].Split(' ');
for (p = 0; p < data20.Length; p++)
{
rightimage [m, p] =Convert.ToDouble( data20[p]);
richTextBox2.Text += rightimage[m, p] + ",";
}
richTextBox2.Text += "\n";
}
}
}
private void 打開待定點像方座標ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openunknownfile = new OpenFileDialog();
openunknownfile.Filter = "文本文件(*.txt)|*.txt";
if (openunknownfile.ShowDialog() == DialogResult.OK)
{
StreamReader readfile = new StreamReader(openunknownfile.FileName);
readunknownfilename = openunknownfile.FileName;
int i, j;
richTextBox3.Text = "點號 左像x(m) y(m) 右像x(m) y(m)\n";
for (i = 0; i < 4; i++)
{
line3[i] = readfile.ReadLine();
string[] data30 = line3[i].Split(' ');
for (j = 0; j < data30.Length; j++)
{
unknownpoint[i, j] =Convert.ToDouble( data30[j]);
richTextBox3.Text += unknownpoint[i, j] + " ";
}
richTextBox3.Text += "\n";
}
}
}
private void groupBox2_Enter(object sender, EventArgs e)
{
}
private void 計算左像係數L與畸變係數ToolStripMenuItem_Click(object sender, EventArgs e)
{
//功能:計算L係數的近似值和精確值
//計算L係數近似值
double[,] X = new double[12, 11];
double[,] X0 = new double[11, 11];
double[,] B = new double[12, 1];
double[,] L = new double[12, 1];
double[,] x0 = new double[1, 1];
double[,] y0 = new double[1, 1];
int i, j;
for (i = 0; i < 6; i++)
{
X[2 * i, 0] = leftimage[i, 3];
X[2 * i, 1] = leftimage[i, 4];
X[2 * i, 2] = leftimage[i, 5];
X[2 * i, 3] = 1;
X[2 * i + 1, 0] = 0;
X[2 * i + 1, 1] = 0;
X[2 * i + 1, 2] = 0;
X[2 * i + 1, 3] = 0;
X[2 * i, 4] = 0;
X[2 * i, 5] = 0;
X[2 * i, 6] = 0;
X[2 * i, 7] = 0;
X[2 * i + 1, 0] = leftimage[i, 3];
X[2 * i + 1, 1] = leftimage[i, 4];
X[2 * i + 1, 2] = leftimage[i, 5];
X[2 * i + 1, 7] = 1;
X[2 * i, 8] = leftimage[i, 1] * leftimage[i, 3];
X[2 * i, 9] = leftimage[i, 1] * leftimage[i, 4];
X[2 * i, 10] = leftimage[i, 1] * leftimage[i, 5];
X[2 * i + 1, 8] = leftimage[i, 2] * leftimage[i, 3];
X[2 * i + 1, 9] = leftimage[i, 2] * leftimage[i, 4];
X[2 * i + 1, 10] = leftimage[i, 2] * leftimage[i, 5];
B[2 * i, 0] = leftimage[i, 1];
B[2 * i + 1, 0] = leftimage[i, 2];
}
for (i = 0; i < 12; i++)
{
B[i, 0] = -B[i, 0];
}
for (i = 0; i < 11; i++)
{
for (j = 0; j < 11; j++)
{
X0[i, j] = X[i, j];
}
}
X0 = Matrix.Athwart(X0);
L = Matrix.MultiplyMatrix(X0, B);
//計算像主點近似值
x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
//計算L係數精確值
double[,] M = new double[12, 12];
double[,] W = new double[12, 1];
double[] A = new double[6];
double[] r2 = new double[6];//r的平方
int n = 0;
//迭代計算
do
{
for (i = 0; i < 6; i++)
{
A[i] = L[8, 0] * leftimage[i, 3] + L[9, 0] * leftimage[i, 4] + L[10, 0] * leftimage[i, 5] + 1;
M[2 * i, 0] = leftimage[i, 3] / A[i];
M[2 * i, 1] = leftimage[i, 4] / A[i];
M[2 * i, 2] = leftimage[i, 5] / A[i];
M[2 * i, 3] = 1 / A[i];
M[2 * i, 4] = 0;
M[2 * i, 5] = 0;
M[2 * i, 6] = 0;
M[2 * i, 7] = 0;
M[2 * i, 8] = leftimage[i, 1] * leftimage[i, 3] / A[i];
M[2 * i, 9] = leftimage[i, 1] * leftimage[i, 4] / A[i];
M[2 * i, 10] = leftimage[i, 1] * leftimage[i, 5] / A[i];
M[2 * i + 1, 0] = 0;
M[2 * i + 1, 1] = 0;
M[2 * i + 1, 2] = 0;
M[2 * i + 1, 3] = 0;
M[2 * i + 1, 4] = leftimage[i, 3] / A[i];
M[2 * i + 1, 5] = leftimage[i, 4] / A[i];
M[2 * i + 1, 6] = leftimage[i, 5] / A[i];
M[2 * i + 1, 7] = 1 / A[i];
M[2 * i + 1, 8] = leftimage[i, 2] * leftimage[i, 3] / A[i];
M[2 * i + 1, 9] = leftimage[i, 2] * leftimage[i, 4] / A[i];
M[2 * i + 1, 10] = leftimage[i, 2] * leftimage[i, 5] / A[i];
r2[i] = (leftimage[i, 1] - x0[0, 0]) * (leftimage[i, 1] - x0[0, 0])
+ (leftimage[i, 2] - y0[0, 0]) * (leftimage[i, 2] - y0[0, 0]);
M[2 * i, 11] = (leftimage[i, 1] - x0[0, 0]) * r2[i];
M[2 * i + 1, 11] = (leftimage[i, 2] - y0[0, 0]) * r2[i];
W[2 * i, 0] = leftimage[i, 1] / A[i];
W[2 * i + 1, 0] = leftimage[i, 2] / A[i];
}
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
M[i, j] = -M[i, j];
}
}
L = Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(M), M)),
Matrix.MultiplyMatrix(Matrix.Transpose(M), W));
x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
n = n + 1;
}
while (n < 20);
richTextBox4.Text += "計算左像L精確值循環次數:" + n + "\n";
leftL = L;
leftx0 = x0;
lefty0 = y0;
//輸出到文本框中
richTextBox4.Text += "左像L係數值:\n";
for (i = 0; i < 12; i++)
{
richTextBox4.Text += Convert.ToString(L[i, 0]) + "\n";
}
richTextBox4.Text += "左像內方位元素:\n";
richTextBox4.Text += Convert.ToString(x0[0, 0]) + "\n";
richTextBox4.Text += Convert.ToString(y0[0, 0]) + "\n";
richTextBox4.Text += "\n";
}
private void 計算右像係數L與畸變係數ToolStripMenuItem_Click(object sender, EventArgs e)
{
//功能:計算L係數的近似值和精確值
//計算L係數近似值
double[,] X = new double[12, 11];
double[,] X0 = new double[11, 11];
double[,] B = new double[12, 1];
double[,] L = new double[12, 1];
double[,] x0 = new double[1, 1];
double[,] y0 = new double[1, 1];
int i, j;
for (i = 0; i < 6; i++)
{
X[2 * i, 0] = rightimage[i, 3];
X[2 * i, 1] = rightimage[i, 4];
X[2 * i, 2] = rightimage[i, 5];
X[2 * i, 3] = 1;
X[2 * i + 1, 0] = 0;
X[2 * i + 1, 1] = 0;
X[2 * i + 1, 2] = 0;
X[2 * i + 1, 3] = 0;
X[2 * i, 4] = 0;
X[2 * i, 5] = 0;
X[2 * i, 6] = 0;
X[2 * i, 7] = 0;
X[2 * i + 1, 0] = rightimage[i, 3];
X[2 * i + 1, 1] = rightimage[i, 4];
X[2 * i + 1, 2] = rightimage[i, 5];
X[2 * i + 1, 7] = 1;
X[2 * i, 8] = rightimage[i, 1] * rightimage[i, 3];
X[2 * i, 9] = rightimage[i, 1] * rightimage[i, 4];
X[2 * i, 10] = rightimage[i, 1] * rightimage[i, 5];
X[2 * i + 1, 8] = rightimage[i, 2] * rightimage[i, 3];
X[2 * i + 1, 9] = rightimage[i, 2] * rightimage[i, 4];
X[2 * i + 1, 10] = rightimage[i, 2] * rightimage[i, 5];
B[2 * i, 0] = rightimage[i, 1];
B[2 * i + 1, 0] = rightimage[i, 2];
}
for (i = 0; i < 12; i++)
{
B[i, 0] = -B[i, 0];
}
for (i = 0; i < 11; i++)
{
for (j = 0; j < 11; j++)
{
X0[i, j] = X[i, j];
}
}
X0 = Matrix.Athwart(X0);
L = Matrix.MultiplyMatrix(X0, B);
//計算像主點近似值
x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
//計算L係數精確值
double[,] M = new double[12, 12];
double[,] W = new double[12, 1];
double[] A = new double[6];
double[] r2 = new double[6];//r的平方
int n = 0;
//迭代計算
do
{
for (i = 0; i < 6; i++)
{
A[i] = L[8, 0] * rightimage[i, 3] + L[9, 0] * rightimage[i, 4] + L[10, 0] * rightimage[i, 5] + 1;
M[2 * i, 0] = rightimage[i, 3] / A[i];
M[2 * i, 1] = rightimage[i, 4] / A[i];
M[2 * i, 2] = rightimage[i, 5] / A[i];
M[2 * i, 3] = 1 / A[i];
M[2 * i, 4] = 0;
M[2 * i, 5] = 0;
M[2 * i, 6] = 0;
M[2 * i, 7] = 0;
M[2 * i, 8] = rightimage[i, 1] * rightimage[i, 3] / A[i];
M[2 * i, 9] = rightimage[i, 1] * rightimage[i, 4] / A[i];
M[2 * i, 10] = rightimage[i, 1] * rightimage[i, 5] / A[i];
M[2 * i + 1, 0] = 0;
M[2 * i + 1, 1] = 0;
M[2 * i + 1, 2] = 0;
M[2 * i + 1, 3] = 0;
M[2 * i + 1, 4] = rightimage[i, 3] / A[i];
M[2 * i + 1, 5] = rightimage[i, 4] / A[i];
M[2 * i + 1, 6] = rightimage[i, 5] / A[i];
M[2 * i + 1, 7] = 1 / A[i];
M[2 * i + 1, 8] = rightimage[i, 2] * rightimage[i, 3] / A[i];
M[2 * i + 1, 9] = rightimage[i, 2] * rightimage[i, 4] / A[i];
M[2 * i + 1, 10] = rightimage[i, 2] * rightimage[i, 5] / A[i];
r2[i] = (rightimage[i, 1] - x0[0, 0]) * (rightimage[i, 1] - x0[0, 0])
+ (rightimage[i, 2] - y0[0, 0]) * (rightimage[i, 2] - y0[0, 0]);
M[2 * i, 11] = (rightimage[i, 1] - x0[0, 0]) * r2[i];
M[2 * i + 1, 11] = (rightimage[i, 2] - y0[0, 0]) * r2[i];
W[2 * i, 0] = rightimage[i, 1] / A[i];
W[2 * i + 1, 0] = rightimage[i, 2] / A[i];
}
for (i = 0; i < 12; i++)
{
for (j = 0; j < 12; j++)
{
M[i, j] = -M[i, j];
}
}
L = Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(M), M)),
Matrix.MultiplyMatrix(Matrix.Transpose(M), W));
x0[0, 0] = -(L[0, 0] * L[8, 0] + L[1, 0] * L[9, 0] + L[2, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
y0[0, 0] = -(L[4, 0] * L[8, 0] + L[5, 0] * L[9, 0] + L[6, 0] * L[10, 0])
/ (L[8, 0] * L[8, 0] + L[9, 0] * L[9, 0] + L[10, 0] * L[10, 0]);
n = n + 1;
}
while (n < 20);
richTextBox4.Text += "計算右像L精確值循環次數:" + n + "\n";
rightL = L;
rightx0 = x0;
righty0 = y0;
//輸出到文本框中
richTextBox4.Text += "右像L係數值:\n";
for (i = 0; i < 12; i++)
{
richTextBox4.Text += Convert.ToString(L[i, 0]) + "\n";
}
richTextBox4.Text += "右像內方位元素:\n";
richTextBox4.Text += Convert.ToString(x0[0, 0]) + "\n";
richTextBox4.Text += Convert.ToString(y0[0, 0]) + "\n";
richTextBox4.Text += "\n";
}
private void 計算待定點物方座標ToolStripMenuItem_Click(object sender, EventArgs e)
{
//對待求點相片座標進行畸變改正
double[] leftR2 = new double[4];
double[] leftxx = new double[4];
double[] leftyy = new double[4];
double[] rightR2 = new double[4];
double[] rightxx = new double[4];
double[] rightyy = new double[4];
int i, j, k;
for(i=0;i<4;i++)
{
leftR2[i] = (unknownpoint[i, 1] - leftx0[0, 0]) * (unknownpoint[i, 1] - leftx0[0, 0])
+ (unknownpoint[i, 2] - leftx0[0, 0]) * (unknownpoint[i, 2] - leftx0[0, 0]);
leftxx[i] = unknownpoint[i, 1] + (unknownpoint[i, 1] - leftx0[0, 0]) * leftR2[i] * leftL[11, 0];
leftyy[i] = unknownpoint[i, 2] + (unknownpoint[i, 2] - lefty0[0, 0]) * leftR2[i] * leftL[11, 0];
rightR2[i] = (unknownpoint[i, 3] - rightx0[0, 0]) * (unknownpoint[i, 3] - rightx0[0, 0])
+ (unknownpoint[i, 4] - rightx0[0, 0]) * (unknownpoint[i, 4] - rightx0[0, 0]);
rightxx[i] = unknownpoint[i, 3] + (unknownpoint[i, 3] - rightx0[0, 0]) * rightR2[i] * rightL[11, 0];
rightyy[i] = unknownpoint[i, 4] + (unknownpoint[i, 4] - righty0[0, 0]) * rightR2[i] * rightL[11, 0];
}
//計算待定點物方座標近似值
double[,] XYZ = new double[4, 3];
double[,] singleXYZ = new double[3, 1];
double[,] B = new double[3, 3];
double[,] C = new double[3, 1];
for (i=0;i<4; i++)
{
B[0, 0] = leftL[0, 0] + leftxx[i] * leftL[8, 0];
B[0, 1] = leftL[1, 0] + leftxx[i] * leftL[9, 0];
B[0, 2] = leftL[2, 0] + leftxx[i] * leftL[10, 0];
B[1, 0] = leftL[4, 0] + leftyy[i] * leftL[8, 0];
B[1, 1] = leftL[5, 0] + leftyy[i] * leftL[9, 0];
B[1, 2] = leftL[6, 0] + leftyy[i] * leftL[10, 0];
B[2, 0] = rightL[0, 0] + rightxx[i] * rightL[8, 0];
B[2, 1] = rightL[1, 0] + rightxx[i] * rightL[9, 0];
B[2, 2] = rightL[2, 0] + rightxx[i] * rightL[10, 0];
C[0, 0] = leftL[3, 0] + leftxx[i];
C[1, 0] = leftL[7, 0] + leftxx[i];
C[2, 0] = rightL[3, 0] + rightxx[i];
C[0, 0] = -C[0, 0];
C[1, 0] = -C[0, 0];
C[2, 0] = -C[0, 0];
B = Matrix.Athwart(B);
singleXYZ = Matrix.MultiplyMatrix(B, C);
for (j = 0; j < 3; j++)
{
XYZ[i, j] = singleXYZ [j,0];
}
}
//計算待定點物方座標精確值
double[,] N = new double[4, 3];
double[,] Q = new double[4, 1];
double[,] deltaXYZ = new double[1, 3];
double[,] newXYZ = new double[1, 3];
for (i=0;i<4;i++)
{
j = 0;
do
{
double leftA, rightA;
leftA = leftL[8, 0] * XYZ[i, 0] + leftL[9, 0] * XYZ[i, 1] + leftL[10, 0] * XYZ[i, 2] + 1;
N[0, 0] = -(leftL[0, 0] + leftxx[i] * leftL[8, 0]) / leftA;
N[0, 1] = -(leftL[1, 0] + leftxx[i] * leftL[9, 0]) / leftA;
N[0, 2] = -(leftL[2, 0] + leftxx[i] * leftL[10, 0]) / leftA;
N[1, 0] = -(leftL[4, 0] + leftyy[i] * leftL[8, 0]) / leftA;
N[1, 1] = -(leftL[5, 0] + leftyy[i] * leftL[9, 0]) / leftA;
N[1, 2] = -(leftL[6, 0] + leftyy[i] * leftL[10, 0]) / leftA;
rightA = rightL[8, 0] * XYZ[i, 0] + rightL[9, 0] * XYZ[i, 1] + rightL[10, 0] * XYZ[i, 2] + 1;
N[2, 0] = -(rightL[0, 0] + rightxx[i] * rightL[8, 0]) / rightA;
N[2, 1] = -(rightL[1, 0] + rightxx[i] * rightL[9, 0]) / rightA;
N[2, 2] = -(rightL[2, 0] + rightxx[i] * rightL[10, 0]) / rightA;
N[3, 0] = -(rightL[4, 0] + rightyy[i] * rightL[8, 0]) / rightA;
N[3, 1] = -(rightL[5, 0] + rightyy[i] * rightL[9, 0]) / rightA;
N[3, 2] = -(rightL[6, 0] + rightyy[i] * rightL[10, 0]) / rightA;
Q[0, 0] = (leftL[3, 0] + leftxx[i]) / leftA;
Q[1, 0] = (leftL[7, 0] + leftyy[i]) / leftA;
Q[2, 0] = (rightL[3, 0] + rightxx[i]) / rightA;
Q[3, 0] = (rightL[7, 0] + rightyy[i]) / rightA;
newXYZ = Matrix.Transpose(Matrix.MultiplyMatrix(Matrix.Athwart(Matrix.MultiplyMatrix(Matrix.Transpose(N), N)),
Matrix.MultiplyMatrix(Matrix.Transpose(N), Q)));
for (k = 0; k < 3; k++)
{
deltaXYZ[0, k] = newXYZ[0, k] - XYZ[i, k];
XYZ[i, k] = newXYZ[0, k];
}
j = j + 1;
}
while (deltaXYZ[0, 0] > 0.000000000001 || deltaXYZ[0, 0] < -0.000000000001);
richTextBox4.Text += "計算待求點物方座標精確值迭代次數:" + j + "\n";
}
//Coordinate爲待定點物方座標
// 格式爲:點號 X Y Z
double[,] Coordinate = new double[4, 4];
richTextBox5.Text += "待定點物方座標:\n";
for (i = 0; i < 4; i++)
{
Coordinate[i, 0] = unknownpoint[i, 0];
richTextBox5.Text += Convert.ToString(Coordinate[i, 0]) + "\t";
for (j = 1; j < 4; j++)
{
Coordinate[i, j] = XYZ[i, j-1];
richTextBox5.Text += Convert.ToString(Coordinate[i, j]) + "\t";
}
richTextBox5.Text += "\n";
}
}
private void 導出待定點物方座標ToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog savefile = new SaveFileDialog();
savefile.Filter = "文本文件(*.txt)|*.txt";
savefile.FileName = "待定點物方座標.txt";
if (savefile.ShowDialog() == DialogResult.OK)
{
richTextBox5.SaveFile(savefile.FileName, RichTextBoxStreamType.PlainText);
}
MessageBox.Show("文件保存成功!");
}
private void 導出計算報告ToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog savefile = new SaveFileDialog();
savefile.Filter = "文本文件(*.txt)|*.txt";
savefile.FileName = "DLT計算報告.txt";
if (savefile.ShowDialog() == DialogResult.OK)
{
richTextBox4.SaveFile(savefile.FileName, RichTextBoxStreamType.PlainText);
}
MessageBox.Show("文件保存成功!");
}
}
}