zoukankan      html  css  js  c++  java
  • 20130623-大地四边形的计算

    1、界面

    1.1界面结构

    2解决方案

    3类设计

    3.1条件平差的类

    /// <summary>

    /// Abstract:

    ///条件平差

    /// </summary>

    class myCondiAdjust

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : 郑承良

    Date : 2013/6/20 19:03:51

    CLR Version : 4.0.30319.296

    ----------------------------------------------------

    Desciption :

    *

    parameters :

    *

    Methods :

    *

    --------------------------------------------------*/

    public static void CondiAdjust( MAT B, MAT P, VEC W,out VEC V)

    {

    Int32 b1, b2, p1, p2;

    b1 = B.dim1;

    b2 = B.dim2;

    p1 = P.dim1;

    p2 = P.dim2;

    MAT Bt = new MAT(b2,b1);

    MAT QBt = new MAT(b2,b1);

    MAT Nbb = new MAT(b1,b1);

    VEC K=new VEC(b1);

    MAT Q = new MAT(p1, p2);

    for (Int32 i = 0; i < p1; i++)

    {

    Q.ele[i, i] = 1 / P.ele[i, i];

    }

    Bt = ~B;

    QBt = Q | Bt;

    Nbb = B | QBt;

    //列选主元

    //myMajorInColGuass.MajorInColGuass(Nbb, W, K);

    myMajorInColGuass myM = new myMajorInColGuass();

    myM.MajorInColGuass(Nbb, W,out K);

    V = QBt | K;

    }

    }

    3.2对话框

    class myFileDialogs

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : 郑承良

    Date : 2013/6/19 22:07:08

    CLR Version : 4.0.30319.296

    ----------------------------------------------------

    Desciption :

    * 打开与保存对话框

    parameters :

    *

    Methods :

    *

    --------------------------------------------------*/

    public static String myOpenFile()

    {

    string myReturn;

    OpenFileDialog myOpenFile = new OpenFileDialog();

    myOpenFile.Filter = "数据源.txt|*txt";

    myOpenFile.CheckPathExists = true;

    myOpenFile.ShowDialog();

    //DialogResult myResult = new DialogResult();

    //if (myOpenFile.FileName != String.Empty)

    if (File.Exists(myOpenFile.FileName))

    {

    myReturn = myOpenFile.FileName;

    //myFile = null;

    myOpenFile.Dispose();

    return myReturn;

    }

    else

    {

    return null;

    }

    }

    public static String mySaveFile()

    {

    string myReturn = "";

    SaveFileDialog myFile = new SaveFileDialog();

    //myFile.Title = myStyle;

    myFile.Filter = "文本文档|*txt";

    myFile.ShowDialog();

    //DialogResult myResult = new DialogResult();

    if (myFile.FileName != String.Empty)

    {

    myReturn = myFile.FileName;

    //myFile = null;

    myFile.Dispose();

    return myReturn;

    }

    else

    {

    return myReturn;

    }

    }

    }

    3.3前方交回

    /// <summary>

    /// Abstract :

    ///前方交会

    /// </summary>

    using System;

    class myForIntersecer

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : 郑承良

    Date : 2013/6/20 18:57:31

    CLR Version : 4.0.30319.296

    ----------------------------------------------------

    parameters :

    *

    Methods :

    *

    --------------------------------------------------*/

    public static double DegreeToRadian(double ang)

    {

    int fuhao = (int)(ang / Math.Abs(ang));

    ang = Math.Abs(ang);

    int du = (int)ang;

    int fen = ((int)(ang * 100)) - du * 100;

    double miao = ang * 10000 - fen * 100 - du * 10000;

    Double myReturn = ((du + fen / 60.0 + miao / 3600.0) * fuhao) / 180.0 * Math.PI;

    //myReturn = myReturn.ToString("F2");

    return myReturn;

    }

    public static String RadianToDegree(Double ang)

    {

    string myReturn;

    ang = ang * 180 / Math.PI;

    int du=(int)ang;

    int fen = (int)((ang-du)*60+0.5);

    int miao =(int)((ang - du - fen / 60) * 3600);

    myReturn = du.ToString() + "." + fen.ToString() + miao.ToString();

    myReturn = Convert.ToDouble(myReturn).ToString("F4");

    return myReturn;

    }

    internal static void ForIntersec(Double Xa, Double Ya, Double Xb, Double Yb, Double a, Double b, out Double Xp, out Double Yp)

    {

    Double ctga, ctgb;

    ctga = 1 / Math.Tan(DegreeToRadian(a));

    ctgb = 1 / Math.Tan(DegreeToRadian(b));

    Xp = (Xa * ctgb + Xb * ctga + (Yb - Ya)) / (ctga + ctgb);

    Yp = (Ya * ctgb + Yb * ctga + (Xa - Xb)) / (ctga + ctgb);

    }

    }

    3.4列选主元

    /// <summary>

    /// Abstract :

    ///列选主元消去法

    /// </summary>

    class myMajorInColGuass

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : syz

    Date : 2011-06-20 11:26:45 *星期一*

    Version : V1.0

    Coded by : 郑承良(使用)

    Date : 2013/6/20 20:34:16

    CLR Version : 4.0.30319.296

    ----------------------------------------------------

    Desciption :

    *

    parameters :

    *

    Methods :

    *

    --------------------------------------------------*/

    public void MajorInColGuass(MAT A, VEC b, out VEC x)

    {

    /*------------------------------------------ comment

    Author : syz

    Date : 2011-06-20 10:59:59

    ---------------------------------------------------

    Desciption :

    * 消去法解线性方程组

    Post Script :

    * 要用到上三角方程的回代方法

    paramtegers :

    * A---方程组系数矩阵

    * b---右向量

    * x---计算结果

    *

    -------------------------------------------------*/

    int n, i, j, k;

    n = b.dim;

    //方程维数

    double tmp;

    //增广矩阵

    MAT Ab = new MAT(n, n + 1);

    //赋值给增广矩阵

    for (i = 0; i < n; i++)

    {

    for (j = 0; j < n; j++)

    Ab.ele[i, j] = A.ele[i, j];

    Ab.ele[i, n] = b.ele[i];

    }

    double elmax;

    int id_max;

    double tmp1, tmp2;

    //这段是高斯消去法的核心

    for (k = 0; k <= n - 2; k++)

    {

    //主元素初值

    elmax = Math.Abs(Ab.ele[k, k]);

    //主元素标号

    id_max = k;

    //下面一段为找出主元素所在的行

    //即获得主元素标号的值

    for (i = k + 1; i <= n - 1; i++)

    {

    if (Math.Abs(Ab.ele[i, k]) > elmax)

    {

    elmax = Math.Abs(Ab.ele[i, k]);

    //注意这里把该元素的绝对值复制给最大元素

    //不能把该元素本身复制给最大元素

    id_max = i;

    }

    }

    //至此已经完成查找最大元素所在行标号

    //下面交换两行元素,其他量不变

    //n+1个元素,该循环为交换两行元素

    for (i = 0; i < n + 1; i++)

    {

    tmp1 = Ab.ele[k, i];

    tmp2 = Ab.ele[id_max, i];

    Ab.ele[k, i] = tmp2;

    Ab.ele[id_max, i] = tmp1;

    }

    //交换后实施消去

    for (i = k + 1; i <= n - 1; i++)

    {

    tmp = Ab.ele[i, k] / Ab.ele[k, k];

    for (j = 0; j < n + 1; j++)

    Ab.ele[i, j] = Ab.ele[i, j] - tmp * Ab.ele[k, j];

    }

    }

    //C#中使用传值方法,不会改变原始变量的值

    //而在Fortran中是使用传地址,如果这样的话,会改变输入变量的外部值

    for (i = 0; i < n; i++)

    {

    for (j = 0; j < n; j++)

    A.ele[i, j] = Ab.ele[i, j];

    b.ele[i] = Ab.ele[i, n];

    }

    uptri(A, b, out x);

    }

    public void uptri(MAT A, VEC b, out VEC x)

    {

    /*------------------------------------------ comment

    Author : syz

    Date : 2011-06-17 10:04:27

    ---------------------------------------------------

    Desciption :

    * 上三角矩阵方程解法

    Post Script :

    * 要用到MAT VEC

    paramtegers :

    * A-----系数矩阵

    * b-----右向量

    * x-----方程的解

    -------------------------------------------------*/

    int N;

    N = A.dim1;

    //获取方程维数

    x = new VEC(N);

    x.ele[N - 1] = b.ele[N - 1] / A.ele[N - 1, N - 1];

    for (int i = N - 2; i >= 0; i--)

    {

    x.ele[i] = b.ele[i];

    for (int j = i + 1; j <= N - 1; j++)

    x.ele[i] = x.ele[i] - A.ele[i, j] * x.ele[j];

    x.ele[i] = x.ele[i] / A.ele[i, i];

    }

    }

    }

    3.5矩阵与向量类

    class MAT

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : syz

    Date : 2011-06-16 16:53:40 *星期四*

    ----------------------------------------------------

    Desciption :

    * 矩阵类

    * 该类中的部分算符重载需要用到VEC

    parameters :

    *

    Methods :

    * MAT------构造函数

    * + --------两矩阵相加(对应元素分别相加)

    * - --------矩阵相减(对应元素分别相减)

    * * --------矩阵元素分别相乘(相当于MATLAB中的 .*算符)

    * / --------矩阵元素分别相除(相当与MATLAB中的 ./算符)

    *

    * + --------矩阵加实数(所有元素分别加该实数)

    * - --------矩阵减实数(所有元素分别减该实数)

    * * --------矩阵乘实数(所有元素分别乘该实数)

    * / --------矩阵除实数(所有元素分别除该实数)

    *

    * 以下再次重载四则算符,

    * 如此可以在矩阵左右均可进行与实数的双目运算

    * + --------实数加矩阵(所有元素分别加该实数)

    * - --------实数减矩阵(所有元素分别减该实数)

    * * --------实数乘矩阵(所有元素分别乘该实数)

    * / --------<>---不重载--(即不能用实数除以矩阵)

    *

    * | --------数学意义下的矩阵相乘

    * | --------矩阵与向量相乘(线性变换)

    * ~ --------矩阵转置(向量中~该算符用于求2范数平方)

    --------------------------------------------------*/

    public int dim1, dim2; //数组维数

    public double[,] ele;

    public MAT(int m, int n)

    {

    //构造函数

    dim1 = m;

    dim2 = n;

    //矩阵维数

    ele = new double[m, n];

    //用二维数组构造数学意义下的矩阵

    //矩阵元素保存于对象ele

    }

    //-------两个矩阵加法算符重载

    //------矩阵元素分别相加

    public static MAT operator +(MAT a1, MAT a2)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a3 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a3.ele[i, j] = a1.ele[i, j] + a2.ele[i, j];

    return a3;

    }

    //-------两个矩阵减法算符重载

    //------矩阵元素分别相减

    public static MAT operator -(MAT a1, MAT a2)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a3 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a3.ele[i, j] = a1.ele[i, j] - a2.ele[i, j];

    return a3;

    }

    //-------两个矩阵乘法算符重载

    //------矩阵元素分别相乘,相当于MATLAB中的 .*

    // 要求两个矩阵维数相同,矩阵类不进行个数判断

    public static MAT operator *(MAT a1, MAT a2)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a3 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a3.ele[i, j] = a1.ele[i, j] * a2.ele[i, j];

    return a3;

    }

    //-------两个矩阵除法算符重载

    //------矩阵元素分别相除,相当于MATLAB中的 ./

    // 要求两个矩阵维数相同,矩阵类不进行个数判断

    public static MAT operator /(MAT a1, MAT a2)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a3 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a3.ele[i, j] = a1.ele[i, j] / a2.ele[i, j];

    return a3;

    }

    //矩阵加实数算符重载

    //各分量分别加实数

    public static MAT operator +(MAT a1, double x)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] + x;

    return a2;

    }

    //矩阵减实数算符重载

    //各分量分别减实数

    public static MAT operator -(MAT a1, double x)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] - x;

    return a2;

    }

    //矩阵乘以实数算符重载

    //各分量分别乘以实数

    public static MAT operator *(MAT a1, double x)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] * x;

    return a2;

    }

    //矩阵除以实数算符重载

    //各分量分别除以实数

    public static MAT operator /(MAT a1, double x)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] / x;

    return a2;

    }

    //实数加矩阵算符重载

    //各分量分别加实数

    public static MAT operator +(double x, MAT a1)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] + x;

    return a2;

    }

    //实数减矩阵算符重载

    //各分量分别减实数

    public static MAT operator -(double x, MAT a1)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] - x;

    return a2;

    }

    //实数乘矩阵算符重载

    //各分量分别乘以实数

    public static MAT operator *(double x, MAT a1)

    {

    int m, n;

    m = a1.dim1;

    n = a1.dim2;

    MAT a2 = new MAT(m, n);

    for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

    a2.ele[i, j] = a1.ele[i, j] * x;

    return a2;

    }

    //数学上的矩阵相乘

    public static MAT operator |(MAT a1, MAT a2)

    {

    int m, n, p, q;

    m = a1.dim1;

    n = a1.dim2;

    p = a2.dim1;

    q = a2.dim2;

    if (n != p) System.Console.WriteLine("Inner matrix dimensions must agree");

    //如果矩阵维数不匹配给出告警信息

    //新矩阵,用于存放结果

    MAT a3 = new MAT(m, q);

    int i, j;

    for (i = 0; i < m; i++)

    for (j = 0; j < q; j++)

    {

    a3.ele[i, j] = 0.0;

    for (int k = 0; k < n; k++)

    a3.ele[i, j] = a3.ele[i, j] + a1.ele[i, k] * a2.ele[k, j];

    }

    return a3;

    }

    //矩阵乘以向量(线性变换)

    // b=Ax

    public static VEC operator |(MAT A, VEC x)

    {

    int m, n, p;

    m = A.dim1;

    n = A.dim2;

    p = x.dim;

    if (n != p) System.Console.WriteLine("Inner matrix dimensions must agree");

    //如果矩阵维数不匹配,给出告警信息

    VEC b = new VEC(m);

    for (int i = 0; i < m; i++)

    {

    b.ele[i] = 0.0;

    for (int k = 0; k < n; k++)

    b.ele[i] = b.ele[i] + A.ele[i, k] * x.ele[k];

    }

    return b;

    }

    //矩阵转置

    public static MAT operator ~(MAT A)

    {

    int m, n;

    m = A.dim1;

    n = A.dim2;

    MAT TA = new MAT(n, m);

    for (int i = 0; i < n; i++)

    for (int j = 0; j < m; j++)

    TA.ele[i, j] = A.ele[j, i];

    return TA;

    }

    public double this[int index1, int index2]

    // 矩阵索引器

    {

    get

    {

    return ele[index1, index2];

    }

    set

    {

    ele[index1, index2] = value;

    }

    }

    }

    class VEC

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : syz

    Date : 2011-06-15 12:50:11 *星期三*

    ----------------------------------------------------

    Desciption :

    向量类

    parameters :

    * dim------向量维数

    * ele------向量元素

    *

    Methods :

    * = -----------向量相等

    * 注意该方法不需要自行编写重载函数,

    * c#已经实现了对类的等号算符重载,并禁止

    * 用户编写等号算符(=)重载函数

    * + -----------两向量对应元素相加

    * - -----------两向量对应元素相减

    * * -----------两向量对应元素相乘(相当于MATLAB中的 .*算符)

    * / -----------两向量对应元素相除(相当于MATLAB中的 ./算符)

    *

    * + -----------重载向量加一实数(所有元素)

    * - -----------重载向量减一实数(所有元素)

    * * -----------重载向量乘一实数(所有元素)

    * / -----------重载向量除一实数(所有元素)

    *

    * + -----------重载实数加向量(所有元素)

    * - -----------重载实数减向量(所有元素)

    * * -----------重载实数乘以向量(所有元素)

    * / -----------<>--不重载--<即不能用实数除以向量>

    *

    * | VEC1|ve2----向量内积

    * ~ ~VEC1-------向量2范数的平方

    * - -VEC1-------向量取负

    * ^ VEC1^VEC2---向量外积

    *

    --------------------------------------------------*/

    {

    public int dim; //数组维数

    public double[] ele;

    public VEC(int m)

    {

    //构造函数

    dim = m;

    ele = new double[dim];

    //用一维数组构造向量

    }

    //-------两个向量加法算符重载

    //------分量分别相加

    public static VEC operator +(VEC v1, VEC v2)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v3 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v3.ele[j] = v1.ele[j] + v2.ele[j];

    }

    return v3;

    }

    //-----------------向量减法算符重载

    //-----------------分量分别想减

    public static VEC operator -(VEC v1, VEC v2)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v3 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v3.ele[j] = v1.ele[j] - v2.ele[j];

    }

    return v3;

    }

    //----------------向量乘法算符重载

    //-------分量分别相乘,相当于MATLAB中的 .*算符

    public static VEC operator *(VEC v1, VEC v2)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v3 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v3.ele[j] = v1.ele[j] * v2.ele[j];

    }

    return v3;

    }

    //---------------向量除法算符重载

    //--------------分量分别相除,相当于MATLAB中的 ./算符

    public static VEC operator /(VEC v1, VEC v2)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v3 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v3.ele[j] = v1.ele[j] / v2.ele[j];

    }

    return v3;

    }

    //向量减加实数

    //各分量分别加实数

    public static VEC operator +(VEC v1, double a)

    {

    //向量数加算符重载

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] + a;

    }

    return v2;

    }

    //向量减实数

    //各分量分别减实数

    public static VEC operator -(VEC v1, double a)

    {

    //向量数加算符重载

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] - a;

    }

    return v2;

    }

    //向量数乘

    //各分量分别乘以实数

    public static VEC operator *(VEC v1, double a)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] * a;

    }

    return v2;

    }

    //向量数除

    //各分量分别除以实数

    public static VEC operator /(VEC v1, double a)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] / a;

    }

    return v2;

    }

    //实数加向量

    public static VEC operator +(double a, VEC v1)

    {

    //向量数加算符重载

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] + a;

    }

    return v2;

    }

    //实数减向量

    public static VEC operator -(double a, VEC v1)

    {

    //向量数加算符重载

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] - a;

    }

    return v2;

    }

    //向量数乘

    public static VEC operator *(double a, VEC v1)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    VEC v2 = new VEC(N0);

    int j;

    for (j = 0; j < N0; j++)

    {

    v2.ele[j] = v1.ele[j] * a;

    }

    return v2;

    }

    //---------------向量内积

    public static double operator |(VEC v1, VEC v2)

    {

    int N0, M0;

    //获取变量维数

    N0 = v1.dim;

    M0 = v2.dim;

    if (N0 != M0)

    System.Console.WriteLine("Inner vector dimensions must agree");

    //如果向量维数不匹配,给出告警信息

    double sum;

    sum = 0.0;

    int j;

    for (j = 0; j < N0; j++)

    {

    sum = sum + v1.ele[j] * v2.ele[j];

    }

    return sum;

    }

    //-----------向量外积(相当于列向量,乘以横向量)

    public static MAT operator ^(VEC v1, VEC v2)

    {

    int N0, M0;

    //获取变量维数

    N0 = v1.dim;

    M0 = v2.dim;

    if (N0 != M0)

    System.Console.WriteLine("Inner vector dimensions must agree");

    //如果向量维数不匹配,给出告警信息

    MAT vvmat = new MAT(N0, N0);

    for (int i = 0; i < N0; i++)

    for (int j = 0; j < N0; j++)

    vvmat[i, j] = v1[i] * v2[j];

    //返回外积矩阵

    return vvmat;

    }

    //---------------向量模的平方

    public static double operator ~(VEC v1)

    {

    int N0;

    //获取变量维数

    N0 = v1.dim;

    double sum;

    sum = 0.0;

    int j;

    for (j = 0; j < N0; j++)

    {

    sum = sum + v1.ele[j] * v1.ele[j];

    }

    return sum;

    }

    // 负向量

    public static VEC operator -(VEC v1)

    {

    int N0 = v1.dim;

    VEC v2 = new VEC(N0);

    for (int i = 0; i < N0; i++)

    v2.ele[i] = -v1.ele[i];

    return v2;

    }

    public double this[int index]

    /*------------------------------------------ comment

    Author : syz

    Date : 2011-07-03 19:53:28

    ---------------------------------------------------

    Desciption : 创建索引器

    *

    Post Script :

    *

    paramtegers :

    *

    -------------------------------------------------*/

    {

    get

    {

    //get accessor

    return ele[index];

    }

    set

    {

    //set accessor

    ele[index] = value;

    }

    }

    }

    3.6判断字符串是否是数字的类

    /// <summary>

    /// Abstract :

    ///判断是否是数字

    /// </summary>

    class myStringChecker

    {

    /*--------------------------------------class comment

    Version : V1.0

    Coded by : 郑承良

    Date : 2013/6/20 22:15:32

    CLR Version : 4.0.30319.296

    ----------------------------------------------------

    Desciption :

    * 此方法来源于网络

    parameters :

    *

    Methods :

    *

    --------------------------------------------------*/

    /// <summary>

    ///判断是否是数字

    /// </summary>

    /// <param name="strNumber"></param>

    /// <returns></returns>

    public static bool IsNumber(string strNumber)

    {

    Regex objNotNumberPattern = new Regex("[^0-9.-]");

    Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*");

    Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*");

    String strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";

    String strValidIntegerPattern = "^([-]|[0-9])[0-9]*$";

    Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")");

    return !objNotNumberPattern.IsMatch(strNumber) &&

    !objTwoDotPattern.IsMatch(strNumber) &&

    !objTwoMinusPattern.IsMatch(strNumber) &&

    objNumberPattern.IsMatch(strNumber);

    }

    }

    3.7PointControl

    3.7.1控件界面:

    3.7.2控件代码:

    public partial class PointControl : UserControl

    {

    private String x, y;

    public PointControl()

    {

    InitializeComponent();

    x = "";

    y = "";

    }

    public String X

    {

    get

    {

    return x;

    }

    set

    {

    if (myClass.myStringChecker.IsNumber(value) || value.Equals(String.Empty))

    {

    x = value;

    this.textBox1.Text = value;

    }

    }

    }

    public string Y

    {

    get

    {

    return y;

    }

    set

    {

    if (myClass.myStringChecker.IsNumber(value)||value.Equals(String.Empty))

    {

    y = value;

    this.textBox2.Text = value;

    }

    }

    }

    private void textBox1_TextChanged(object sender, EventArgs e)

    {

    InPut(textBox1,ref x);

    }

    private void textBox2_TextChanged(object sender, EventArgs e)

    {

    InPut(textBox2,ref y);

    }

    //当第一次输入非数字字符时,会小bug,即"请输入数字"会提示两遍

    private void InPut(TextBox myBox,ref string eStr)

    {

    if (myClass.myStringChecker.IsNumber(myBox.Text))

    {

    eStr = myBox.Text;

    }

    else

    {

    // MessageBox.Show("请输入数字");

    myBox.Text =eStr;

    }

    }

    //private void textBox1_TextChanged(object sender, EventArgs e)

    //{

    // textBox1.DataBindings.Add("Text", this, "x");

    // textBox2.DataBindings.Add("Text", this, "y");

    //}

    }

  • 相关阅读:
    js入门
    小程序事件处理
    Vue组件传递数据
    Vue+webpack
    vue总结
    Vue指令
    最优化练习题
    最优化学习笔记
    概率与统计分析练习题
    概率与统计分析学习笔记
  • 原文地址:https://www.cnblogs.com/CharlesZHENG/p/3527601.html
Copyright © 2011-2022 走看看