C#實現DLT直接線性變換(Direct Linear Transform)算法

C#實現DLT直接線性變換(Direct Linear Transform)算法


參考資料:

1.武大版《工業測量技術與數據處理》P100-P106

2.轉載博文——MATLAB實現DLT(Direct Linear Transform)算法


一、編程要求及依據

  1. 編寫程序主要實現DLT算法,讀取數據文件,進行計算,輸出計算結果。
  2. 程序算法依據參見: 徐進軍教授.《工業測量技術與數據處理》.武漢大學出版社.第100-106頁

二、編程環境與語言

編程使用微軟的Visual Studio 2015中的WinForm環境下編寫,編寫語言爲C#。

三、DLT計算流程框圖

四、程序使用流程

  1. 打開DLT直接線性變換.exe程序,依次導入左像控制點數據文件,右像控制點數據文件和待求點像方數據文件;
  2. 計算左像係數L和像主點x0和y0,計算右像係數L和像主點x0和y0;
  3. 計算待定點物方座標;
  4. 導出待定點物方座標;
  5. 導出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("文件保存成功!");
        }

    
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章