예제 #1
0
        private void btnStatistic_Click(object sender, EventArgs e)
        {
            double        dblProp     = 0;
            List <double> dbllt       = new List <double>();
            List <CPoint> CResultPtLt = _DataRecords.ParameterResult.CResultPtLt;

            for (int i = 0; i <= 100; i++)
            {
                CPolyline cpl = CGeoFunc.GetTargetcpl(CResultPtLt, dblProp);
                dbllt.Add(cpl.pPolyline.Length);
                dblProp = dblProp + 0.01;
            }

            CHelpFuncExcel.ExportDataltToExcel(dbllt, "Length", _DataRecords.ParameterInitialize.strSavePath);
            //if (dblProp < 0 || dblProp > 1)
            //{
            //    MessageBox.Show("请输入正确参数!");
            //    return null;
            //}
            //List<CPoint> CResultPtLt = pDataRecords.ParameterResult.CResultPtLt;
            //CPolyline cpl = this.CGeoFunc.GetTargetcpl(CResultPtLt, dblProp);

            //// 清除绘画痕迹
            //IMapControl4 m_mapControl = pDataRecords.ParameterInitialize.m_mapControl;
            //IGraphicsContainer pGra = m_mapControl.Map as IGraphicsContainer;
            //pGra.DeleteAllElements();
            //m_mapControl.ActiveView.Refresh();
            //this.ViewPolyline(m_mapControl, cpl);  //显示生成的线段
            //return cpl;
        }
예제 #2
0
 private void btnExportToExcel_Click(object sender, EventArgs e)
 {
     for (int i = 0; i < _DataRecords.ParameterResultToExcelLt.Count; i++)
     {
         CHelpFuncExcel.ExportEvaluationToExcel(_DataRecords.ParameterResultToExcelLt[i], _DataRecords.ParameterInitialize, i.ToString());
     }
     //CHelpFuncExcel.KillExcel();
 }
예제 #3
0
        private void btnReadData_Click(object sender, EventArgs e)
        {
            OpenFileDialog OFG = new OpenFileDialog();

            OFG.Filter = "xlsx files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
            OFG.ShowDialog();
            if (OFG.FileName == null || OFG.FileName == "")
            {
                return;
            }
            _DataRecords.ParameterResult = CHelpFuncExcel.InputDataResultPtLt(OFG.FileName);
        }
예제 #4
0
        private void btnReadData_Click(object sender, EventArgs e)
        {
            OpenFileDialog OFG = new OpenFileDialog();

            OFG.Filter = "xlsx files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
            OFG.ShowDialog();
            if (OFG.FileName == null || OFG.FileName == "")
            {
                return;
            }
            _CPolylineLt = CHelpFuncExcel.InputDataLtXYZT(OFG.FileName);
        }
예제 #5
0
        private SortedDictionary <int, object[]> GetDataSD(string strFileName)
        {
            var aObj   = CHelpFuncExcel.ReadDataFromExcel(strFileName);
            var DataSD = new SortedDictionary <int, object[]>();  //the elements will be sorted according to ID

            for (int i = 1; i < aObj.GetUpperBound(0); i++)
            {
                DataSD.Add(Convert.ToInt32(aObj[i][0]), aObj[i]);
            }

            return(DataSD);
        }
예제 #6
0
        private void btnstatisticEX_Click(object sender, EventArgs e)
        {
            double        dblProp     = -1;
            List <double> dbllt       = new List <double>();
            List <CPoint> CResultPtLt = _DataRecords.ParameterResult.CResultPtLt;

            for (int i = 0; i <= 300; i++)
            {
                CPolyline cpl = CGeoFunc.GetTargetcpl(CResultPtLt, dblProp);
                dbllt.Add(cpl.pPolyline.Length);
                dblProp = dblProp + 0.01;
            }

            CHelpFuncExcel.ExportDataltToExcel(dbllt, "Length", _DataRecords.ParameterInitialize.strSavePath);
        }
        private void btnSaveLengthandAngles_Click(object sender, EventArgs e)
        {
            try
            {
                CParameterInitialize  ParameterInitialize = _DataRecords.ParameterInitialize;
                List <CPolyline>      cpllt         = _DataRecords.ParameterResult.CResultPlLt;
                List <List <double> > dbllengthltlt = new List <List <double> >();
                List <List <double> > dblangleltlt  = new List <List <double> >();
                for (int i = 0; i < cpllt.Count; i++)
                {
                    dbllengthltlt.Add(CGeoFunc.RecordLengths(cpllt[i]));
                    dblangleltlt.Add(CGeoFunc.RecordAngles(cpllt[i]));
                }

                CHelpFuncExcel.ExportDataltltToExcel(dbllengthltlt, "lengthltlt", ParameterInitialize.strSavePath);
                CHelpFuncExcel.ExportDataltltToExcel(dblangleltlt, "angleltlt", ParameterInitialize.strSavePath);
            }
            catch
            {
                MessageBox.Show("No data or other errors! (Have you already implemented timerAdd_Tick?)");
            }
        }
        private void btnRunMulti_Click(object sender, EventArgs e)
        {
            double dblThreshold = Convert.ToDouble(this.txtThreshold.Text);

            CParameterInitialize ParameterInitialize = _DataRecords.ParameterInitialize;

            //dialogue for saving
            SaveFileDialog SFD = new SaveFileDialog();

            SFD.ShowDialog();
            string strPath = SFD.FileName;

            ParameterInitialize.strSavePath = strPath;
            ParameterInitialize.pWorkspace  = CHelpFunc.OpenWorkspace(strPath);

            int intLayerCount = ParameterInitialize.m_mapFeature.LayerCount;
            List <List <double> > OutPutLtLt = new List <List <double> >(intLayerCount);

            //some stupid codes  :-)
            IFeatureLayer pFeatureLayerLast = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(intLayerCount - 1);
            List <CPoint> CptLtLast         = CHelpFunc.GetCPtLtFromPointFeatureLayer(pFeatureLayerLast);
            int           intPtNumLast      = CptLtLast.Count;

            long lngTime        = 0;
            long lngStartMemory = 0;
            long lngMemory      = 0;
            int  intOutPut      = 0;

            IFeatureLayer pFeatureLayer = null;

            for (int i = 0; i < intLayerCount; i++)
            {
                List <double> OutPutLt = new List <double>(18);
                lngStartMemory = GC.GetTotalMemory(true);

                pFeatureLayer = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(i);
                List <CPoint> CptLt = CHelpFunc.GetCPtLtFromPointFeatureLayer(pFeatureLayer);
                //for (int j = 0; j < CptLt.Count; j++)
                //{
                //    CptLt[j].GID = j;
                //    //CptLt[j].intTS = new TreeSet<int>();
                //}
                //long lngMemory1 = GC.GetTotalMemory(true);
                double dblThreshold2 = dblThreshold * Math.Pow(Convert.ToDouble(intPtNumLast) / Convert.ToDouble(CptLt.Count), 0.5);//---------------dblThreshold------------------------------------------------//
                //------------------------------------------------Start------------------------------------------------//
                //long lngStartTime = System.Environment.TickCount; //record the start time
                //----------------------------------------SweepLineTwoCopiesTreeSet----------------------------------------//
                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesTreeSet(ref CptLt, dblThreshold, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesTreeSet(ref CptLt, dblThreshold2, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                //----------------------------------------SortedSet----------------------------------------//
                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesSortedSet(ref CptLt, dblThreshold, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesSortedSet(ref CptLt, dblThreshold2, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                //----------------------------------------TwoCopiesSortedDictionary----------------------------------------//
                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesWithoutC5(ref CptLt, dblThreshold, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                SweepLineTwoCopiesWithoutC5(ref CptLt, dblThreshold2, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                OutPutLtLt.Add(OutPutLt);
                ParameterInitialize.tspbMain.Value = (i + 1) * 100 / intLayerCount;
                pFeatureLayer = null;
                CptLt         = null;
                OutPutLt      = null;
            }

            CHelpFuncExcel.ExportDataltltToExcel(OutPutLtLt, "Time&Output", ParameterInitialize.strSavePath);



            //dblTimeLt = new List<double>(intLayerCount);
            //dblOutPutLt = new List<double>(intLayerCount);
            //lngMemoryLt = new List<double>(intLayerCount);
            //OutPutLtLt = new List<List<double>>(3);
            ////for (int i = 0; i < intLayerCount; i++)
            //for (int i = 0; i < intLayerCount; i++)
            //{
            //    long lngMemory = GC.GetTotalMemory(true);

            //    pFeatureLayer = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(intLayerCount - 1 - i);
            //    List<CPoint> CptLt = CHelpFunc.GetCPtLtByFeatureLayer(pFeatureLayer);
            //    for (int j = 0; j < CptLt.Count; j++)
            //    {
            //        CptLt[j].GID = j;
            //        //CptLt[j].intTS = new TreeSet<int>();
            //    }
            //    //long lngMemory1 = GC.GetTotalMemory(true);
            //    dblThreshold = Math.Pow(1.8 / Convert.ToDouble(CptLt.Count), 0.5);//---------------dblThreshold------------------------------------------------//
            //    //------------------------------------------------Start------------------------------------------------//
            //    int intOutPut = 0;
            //    long lngStartTime = System.Environment.TickCount; //record the start time
            //    if (cboFunction.Text == "Two Copies")
            //    {
            //        SweepLineTwoCopiesTreeSet(ref CptLt, dblThreshold, ref lngMemory, ref intOutPut);
            //    }
            //    else if (cboFunction.Text == "Two Copies Without C5")
            //    {
            //        SweepLineTwoCopiesWithoutC5(ref CptLt, dblThreshold, ref lngMemory, ref intOutPut);
            //    }
            //    else if (cboFunction.Text == "Two Sweep Lines")
            //    {
            //        SweepLineTwoSweepLines(ref CptLt, dblThreshold);
            //    }


            //    dblTimeLt.Add(System.Environment.TickCount - lngStartTime);
            //    lngMemoryLt.Add(Convert.ToDouble(lngMemory) / 1048576);
            //    dblOutPutLt.Add(intOutPut);

            //    //int intOutPut = 0;
            //    //for (int j = 0; j < CptLt.Count; j++)
            //    //{
            //    //    intOutPut += CptLt[j].intTS.Count;
            //    //}
            //    //dblOutPutLt.Add(intOutPut / 2);

            //    //for (int j = 0; j < CptLt.Count; j++)
            //    //{
            //    //    CptLt[j].intTS.Dispose();
            //    //    CptLt[j].SetEmpty2();
            //    //}

            //    ParameterInitialize.tspbMain.Value = (i + 1) * 100 / intLayerCount;
            //    pFeatureLayer = null;
            //    CptLt = null;
            //}

            //OutPutLtLt.Add(dblTimeLt);
            //OutPutLtLt.Add(lngMemoryLt);
            //OutPutLtLt.Add(dblOutPutLt);
            //CHelpFuncExcel.ExportColDataltltToExcel(OutPutLtLt, "Time&Output_ChangeThreshold", ParameterInitialize.strSavePath);



            MessageBox.Show("Done!");
        }
예제 #9
0
        /// <summary>多个结果的Morphing方法</summary>
        /// <remarks>对于指定的回溯参数K,不断计算增大的结果,直到Translation值稳定</remarks>
        public CParameterResult OptCorMorphing()
        {
            var pParameterInitialize = _ParameterInitialize;

            var pFrCptLtLt      = this.FrCptLtLt;
            var pToCptLtLt      = this.ToCptLtLt;
            var pObjValueLtLtLt = this.ObjValueLtLtLt;

            //var intFieldIndex = pParameterInitialize.pFLayerLt[0].FeatureClass.FindField(pParameterInitialize.txtAttributeOfKnown.Text);
            //try to add an attribute, if this attribute is already existed, then do nothing, otherwise, add this attribute and set value to -1
            //if (intFieldIndex == -1)
            //{
            //    intFieldIndex = CSaveFeature.AddField(pParameterInitialize.pFLayerLt[0].FeatureClass,
            //      esriFieldType.esriFieldTypeDouble, pParameterInitialize.txtAttributeOfKnown.Text);
            //    //CSaveFeature.SetFieldValue(pParameterInitialize.pFLayerLt[0].FeatureClass, intFieldIndex, -1);

            //    this.strFieldNameLtLt[0].Add(pParameterInitialize.txtAttributeOfKnown.Text);
            //    this.esriFieldTypeLtLt[0].Add(esriFieldType.esriFieldTypeDouble);

            //    for (int i = 0; i < pFrCptLtLt.Count; i++)
            //    {
            //        pObjValueLtLtLt[0][i].Add(0);
            //    }
            //}


            int intMaxBackKforI = Convert.ToInt32(pParameterInitialize.txtMaxBackK.Text);
            int intMaxBackKforJ = SetintMaxBackKforJ(pParameterInitialize.cboIntMaxBackKforJ.SelectedIndex, intMaxBackKforI);
            int intMulti        = Convert.ToInt32(pParameterInitialize.txtMulti.Text);
            int intIncrease     = Convert.ToInt32(pParameterInitialize.txtIncrease.Text);

            CConstants.strMethod = pParameterInitialize.cboMorphingMethod.Text;

            //delegation of morphing method
            DlgCreateTable dlgCreateTable = SetDlgCreateTable(pParameterInitialize.cboMorphingMethod.Text);

            _pEvaluation = new CEvaluation(pParameterInitialize.cboEvaluationMethod.SelectedIndex);
            var StandardVectorCpt = SetStandardVectorCpt(pParameterInitialize.cboStandardVector.SelectedIndex,
                                                         pFrCptLtLt[0].First(), pToCptLtLt[0].First());

            long lngStartTime1 = System.Environment.TickCount;  //lngTime1

            Stopwatch pStopwatch1 = Stopwatch.StartNew();

            foreach (var cptlt in pFrCptLtLt)
            {
                CGeoFunc.SetEdgeLengthOnToCpt(cptlt);
            }
            foreach (var cptlt in pToCptLtLt)
            {
                CGeoFunc.SetEdgeLengthOnToCpt(cptlt);
            }
            CGeoFunc.IntegrateStandardVectorCpt(pFrCptLtLt, StandardVectorCpt);

            //generate cptltltlt
            var frcptltltlt = new List <List <List <CPoint> > >(pFrCptLtLt.Count);
            var tocptltltlt = new List <List <List <CPoint> > >(pToCptLtLt.Count);

            SetCptLtLtLt(pParameterInitialize.chkCoincidentPoints.Checked, pFrCptLtLt, pToCptLtLt, ref frcptltltlt, ref tocptltltlt);
            pStopwatch1.Stop();


            long lngTimeSetLength = System.Environment.TickCount - lngStartTime1;  //lngTime1

            var dblDistanceLt = new List <double>(intMulti);
            var dblTimeLt     = new List <double>(intMulti);

            var pCorrCptsLtLt = new List <List <CCorrCpts> >(pFrCptLtLt.Count);  //we only record the last one, when i = intMulti -1
            var pCtrlCptsLtLt = new List <List <CCorrCpts> >(pToCptLtLt.Count);  //we only record the last one, when i = intMulti -1


            for (int i = 0; i < intMulti; i++)
            {
                //Stopwatch pStopwatch2 = Stopwatch.StartNew();
                double dblTotalDistance   = 0;
                long   lngTotalOptCorTime = 0;

                IFeatureCursor pFeatureCursor = pParameterInitialize.pFLayerLt[0].FeatureClass.Search(null, false);
                for (int j = 0; j < pFrCptLtLt.Count; j++)   //for every polyline
                //for (int j = 0; j < 100; j++)
                {
                    Stopwatch pStopwatch2 = Stopwatch.StartNew();
                    double    dblDistance = 0;
                    //double dblComputedDis = Convert.ToDouble(pObjValueLtLtLt[0][j][intFieldIndex]);
                    double dblComputedDis = 0;
                    if (dblComputedDis > 0 && intMaxBackKforI >= (pFrCptLtLt[j].Count - 1) && intMaxBackKforJ >= (pToCptLtLt[j].Count - 1))
                    {
                        dblDistance = dblComputedDis;
                    }
                    else
                    {
                        var frcptltlt = frcptltltlt[j];   //cptltlt are all the points of a polyline
                        var tocptltlt = tocptltltlt[j];

                        var TableLt = new List <CTable>(frcptltlt.Count);

                        Console.WriteLine("intMulti= " + i + ",  Line ID:" + j);

                        for (int k = 0; k < frcptltlt.Count; k++)
                        {
                            //Console.WriteLine("intMulti= " + i + ",  Line ID:" + j + ",  Segment ID:" + k);
                            var Table = dlgCreateTable(frcptltlt[k], tocptltlt[k], intMaxBackKforI, intMaxBackKforJ);
                            dblDistance += Table.dblCost;

                            //Console.WriteLine("cost:  " + dblDistance);
                            TableLt.Add(Table);
                        }
                        dblDistance /= _pEvaluation.dblCorrection;

                        pStopwatch2.Stop();
                        lngTotalOptCorTime += pStopwatch2.ElapsedMilliseconds;

                        CGeoFunc.RemoveStandardVectorCpt(pFrCptLtLt [j], StandardVectorCpt);
                        List <CCorrCpts> CtrlCptsLt;
                        var pCorrCptsLt = GetCorrespondences(TableLt, frcptltlt,
                                                             tocptltlt, pFrCptLtLt[j].Count, pToCptLtLt[j].Count, out CtrlCptsLt);
                        pCorrCptsLtLt.Add(pCorrCptsLt);
                        pCtrlCptsLtLt.Add(CtrlCptsLt);

                        //this will also set MoveVector for CtrlCptsLt
                        //CsfInter0.SaveIGeoEbToLayer(CHelpFunc.MakeEb(1, GenerateInterpolatedIPl(pCorrCptsLt, 0)));
                        //CsfInter1.SaveIGeoEbToLayer(CHelpFunc.MakeEb(1, GenerateInterpolatedIPl(pCorrCptsLt, 1)));
                        //CsfCtrlpl.SaveIGeoEbToLayer(GenerateCorrIPlEb(CtrlCptsLt));
                        //CsfCorrpl.SaveIGeoEbToLayer(GenerateCorrIPlEb(pCorrCptsLt));
                        CHelpFunc.SetMoveVectorForCorrCptsLt(pCorrCptsLt);

                        //if the look-back parameter is larger than the points number of a pair of polylines,
                        //than we don't need to try a larger look-back parameter
                        //Therefore, we record the distance for the two polylines
                        //if (intMaxBackKforI >= (pFrCptLtLt[j].Count - 1) && intMaxBackKforJ >= (pToCptLtLt[j].Count - 1))
                        //{
                        //    pObjValueLtLtLt[0][j][intFieldIndex] = dblDistance;
                        //    for (int l = intFeatureNum; l < pFrCptLtLt.Count; l++)  //find the feature and record it
                        //    {
                        //        IFeature pFeature = pFeatureCursor.NextFeature();
                        //        if (j == l)
                        //        {
                        //            pFeature.set_Value(intFieldIndex, dblDistance);
                        //            pFeature.Store();
                        //            intFeatureNum = j + 1;  //we record the index, so that next time we can start from this index
                        //            break;
                        //        }
                        //    }
                        //}
                        //pExcelSaver.WriteLine(CHelpFunc.MakeEb<object>(5, j,
                        //pLSCPlLt[j].CptLt.Count, pSSCPlLt[j].CptLt.Count, dblDistance, pStopwatch2.ElapsedMilliseconds));
                    }
                    dblTotalDistance += dblDistance;
                }

                dblTimeLt.Add(pStopwatch1.ElapsedMilliseconds + lngTotalOptCorTime);
                dblDistanceLt.Add(dblTotalDistance);
                //pExcelSaver.Close ();
                //CHelpFuncExcel.ExportDataltltToExcel(tablevalueltlt, intMaxBackKforI + "Tableltlt0", pParameterInitialize.strSavePath);
                //保存对应线
                CHelpFuncExcel.ExportDataltToExcel(dblTimeLt, intMaxBackKforI + "Timelt0", pParameterInitialize.strSavePath);
                CHelpFuncExcel.ExportDataltToExcel(dblDistanceLt, intMaxBackKforI + "Distancelt0", pParameterInitialize.strSavePath);

                CHelpFunc.Displaytspb(i + 1, intMulti);
                pParameterInitialize.txtEvaluation.Text = dblDistanceLt.Last().ToString();
                pParameterInitialize.tsslTime.Text      = "Running Time: " + dblTimeLt.Last().ToString();

                intMaxBackKforI = intMaxBackKforI + intIncrease;
                _CorrCptsLtLt   = pCorrCptsLtLt;
            }


            double dblStandardLength = CGeoFunc.CalDis(0, 0, StandardVectorCpt.X, StandardVectorCpt.Y);

            intMaxBackKforI--;
            CHelpFunc.SaveCtrlLine(pCtrlCptsLtLt, intMaxBackKforI + "_" + CConstants.strMethod + "CtrlLine",
                                   dblStandardLength, pParameterInitialize.pWorkspace, pParameterInitialize.m_mapControl);
            CHelpFunc.SaveCorrLine(pCorrCptsLtLt, intMaxBackKforI + "_" + CConstants.strMethod + "CorrLine",
                                   pParameterInitialize.pWorkspace, pParameterInitialize.m_mapControl);

            CHelpFunc.SetMoveVectorForCorrCptsLtLt(_CorrCptsLtLt);

            //the results will be recorded in _ParameterResult
            CParameterResult ParameterResult = new CParameterResult();

            ParameterResult.pMorphingBaseCpl = this as CMorphingBaseCpl;
            ParameterResult.pMorphingBase    = this as CMorphingBase;
            _ParameterResult = ParameterResult;
            return(ParameterResult);
        }
예제 #10
0
        private void btnRunMulti_Click(object sender, EventArgs e)
        {
            double               dblThreshold        = Convert.ToDouble(this.txtThreshold.Text);
            IFeatureLayer        pFeatureLayer       = null;
            CParameterInitialize ParameterInitialize = _DataRecords.ParameterInitialize;

            //dialogue for saving
            SaveFileDialog SFD = new SaveFileDialog();

            SFD.ShowDialog();
            string strPath = SFD.FileName;

            ParameterInitialize.strSavePath = strPath;
            ParameterInitialize.pWorkspace  = CHelpFunc.OpenWorkspace(strPath);
            string strTINPath  = strPath + "\\TIN";
            string strTINPath2 = strPath + "\\TIN2";

            System.IO.Directory.CreateDirectory(strTINPath);
            System.IO.Directory.CreateDirectory(strTINPath2);
            int intLayerCount = ParameterInitialize.m_mapFeature.LayerCount;
            List <List <double> > OutPutLtLt = new List <List <double> >(intLayerCount);

            //some stupid codes  :-)
            IFeatureLayer pFeatureLayerLast = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(intLayerCount - 1);
            List <CPoint> CptLtLast         = CHelpFunc.GetCPtLtFromPointFeatureLayer(pFeatureLayerLast);
            int           intPtNumLast      = CptLtLast.Count;

            long          lngMemory           = 0;
            long          lngMemoryDT         = 0;
            long          lngMemoryDTProcess  = 0;
            int           intOutPut           = 0;
            long          lngTimeForSearching = 0;
            long          lngTimeForDT        = 0;
            List <CPoint> CptLt = new List <CPoint>();

            OutPutLtLt = new List <List <double> >(6);
            for (int i = 0; i < intLayerCount; i++)
            //for (int i = 0; i < 2; i++)
            {
                List <double> OutPutLt = new List <double>(8);

                //double ss = intPtNumLast / Convert.ToDouble(159);
                //double kk = Math.Pow(intPtNumLast / Convert.ToDouble(CptLt.Count), 0.5);
                //double dblThreshold2 = dblThreshold * Math.Pow(intPtNumLast / Convert.ToDouble(CptLt.Count), 0.5);  //---------------dblThreshold------------------------------------------------//
                pFeatureLayer = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(i);
                //long lngMemory2 = GC.GetTotalMemory(true);

                lngMemoryDT = 0; lngMemoryDTProcess = 0; intOutPut = 0; lngTimeForSearching = 0; lngTimeForDT = 0;

                //------------------------------------Action------------------------------------//
                CptLt = LookingForNeighboursDT(pFeatureLayer, dblThreshold, -1, ref lngTimeForSearching, ref lngTimeForDT,
                                               ref lngMemory, ref lngMemoryDT, ref lngMemoryDTProcess, ref intOutPut, strTINPath);
                //long lngMemory3 = GC.GetTotalMemory(true);
                OutPutLt.Add(Convert.ToDouble(lngTimeForSearching + lngTimeForDT) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngTimeForDT) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(lngMemoryDT) / 1048576);
                OutPutLt.Add(Convert.ToDouble(lngMemoryDTProcess) / 1048576);
                //int intOutPut = 0;
                //for (int j = 0; j < CptLt.Count; j++)
                //{
                //    intOutPut += CptLt[j].intTS.Count;
                //}
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 2 / 1000);


                //long lngMemory2 = GC.GetTotalMemory(true);
                lngMemoryDT = 0; lngMemoryDTProcess = 0; intOutPut = 0; lngTimeForSearching = 0; lngTimeForDT = 0;
                CptLt       = LookingForNeighboursDT(pFeatureLayer, dblThreshold, intPtNumLast, ref lngTimeForSearching, ref lngTimeForDT, ref lngMemory, ref lngMemoryDT, ref lngMemoryDTProcess, ref intOutPut, strTINPath2); //*******************Action*******************//
                //long lngMemory3 = GC.GetTotalMemory(true);
                OutPutLt.Add(Convert.ToDouble(lngTimeForSearching) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngTimeForDT) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(lngMemoryDT) / 1048576);
                OutPutLt.Add(Convert.ToDouble(lngMemoryDTProcess) / 1048576);
                //int intOutPut = 0;
                //for (int j = 0; j < CptLt.Count; j++)
                //{
                //    intOutPut += CptLt[j].intTS.Count;
                //}
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 2 / 1000);


                OutPutLtLt.Add(OutPutLt);
                CHelpFunc.Displaytspb(i + 1, intLayerCount);
                pFeatureLayer = null;
                CptLt         = null;
                OutPutLt      = null;
            }


            CHelpFuncExcel.ExportDataltltToExcel(OutPutLtLt, "Time&Output_ChangeThreshold", ParameterInitialize.strSavePath);


            MessageBox.Show("Done!");
        }
        /// <summary>
        /// output the information that we want
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRun2_Click(object sender, EventArgs e)
        {
            var aObj_Out_kars = CHelpFuncExcel.ReadDataFromExcel
                                    (@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out\kars2");
            var aObj_Met_pos = CHelpFuncExcel.ReadDataFromExcel
                                   (@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out\methods_position");

            //char[] charSeparators = new char[] { ' ', ';' };
            //var result = str.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);

            //var strPos_fileSD = new SortedDictionary<string, string>();
            var CheckRangeSS = new SortedSet <CCheckRange>();

            for (int i = 1; i < aObj_Met_pos.GetLength(0); i++)
            {
                int j = 1;
                while (j < aObj_Met_pos[i].GetLength(0) && aObj_Met_pos[i][j].ToString() != "" && aObj_Met_pos[i][j].ToString() != null)
                {
                    CCheckRange pchkrng = new CCheckRange(aObj_Met_pos[i][j++].ToString(),
                                                          Convert.ToInt32(aObj_Met_pos[i][j++]),
                                                          Convert.ToInt32(aObj_Met_pos[i][j++]),
                                                          aObj_Met_pos[i][0].ToString());

                    CheckRangeSS.Add(pchkrng);
                }
            }

            //var astrRemainLt = new List<object[]>();
            var astrPasteLt = new List <object[]>();

            //from 'possible_files', we know that whether a function is at top-level
            var aObj_Pos_fil = CHelpFuncExcel.ReadDataFromExcel
                                   (@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out\possible_files");
            var strMethodFilesSD = new SortedDictionary <string, object[]>();

            for (int i = 1; i < aObj_Pos_fil.GetLength(0); i++)
            {
                strMethodFilesSD.Add(aObj_Pos_fil[i][0].ToString(), aObj_Pos_fil[i]);
            }

            for (int i = 1; i < aObj_Out_kars.GetLength(0); i++)
            {
                CCheckRange pchkrng = new CCheckRange(aObj_Out_kars[i][0].ToString(),
                                                      Convert.ToInt32(aObj_Out_kars[i][1]),
                                                      Convert.ToInt32(aObj_Out_kars[i][1]));
                CCheckRange pchkrngstart = new CCheckRange(aObj_Out_kars[i][0].ToString(), 0, 0);
                var         predecessor  = CheckRangeSS.GetViewBetween(pchkrngstart, pchkrng).Max;

                if (predecessor != null && predecessor.intEndline >= pchkrng.intEndline)
                {
                    //astrRemainLt.Add(aObj_Out_kars[i]);

                    var aPaste = new object[]
                    {
                        predecessor.strFileName,
                        predecessor.strMethod,
                        "",  //Mangled Name
                        "",  //Line, actual
                        pchkrng.intStartline,
                        GetColumn(@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Eclipse\fsvw_common_KARS_DM\" + predecessor.strFileName, pchkrng.intStartline),
                        "",  //Stmt-No
                        IsCalled(strMethodFilesSD, predecessor.strMethod),
                        aObj_Out_kars[i][2],
                        aObj_Out_kars[i][3],
                        aObj_Out_kars[i][4]
                    };
                    astrPasteLt.Add(aPaste);
                }
            }

            //CHelpFuncExcel.ExportToExcel(astrRemainLt,
            //    CHelpFunc.GetTimeStamp() + "_out_kars_Extracted_" + astrRemainLt.Count,
            //    @"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out");
            CHelpFuncExcel.ExportToExcel(astrPasteLt, "out_kars_ExtractedProcessed_" + astrPasteLt.Count,
                                         @"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out");
        }
예제 #12
0
 private void btnExportToExcel_Click(object sender, EventArgs e)
 {
     CHelpFuncExcel.ExportEvaluationToExcelCorr(_DataRecords.ParameterResult, _DataRecords.ParameterInitialize.strSavePath);
 }
        /// <summary>
        /// for the methods that we want to check, we find their positions
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void btnRun_Click(object sender, EventArgs e)
        {
            var aObj_CheckingMethods = CHelpFuncExcel.ReadDataFromExcel
                                           (@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out\checkingmethods");

            List <List <object> > resultobjltlt = new List <List <object> >(aObj_CheckingMethods.GetLength(0));
            int intMaxOccurency = 0;

            for (int i = 0; i < aObj_CheckingMethods.GetLength(0); i++)
            //for (int i = 0; i < 1; i++)
            {
                var           strMethod   = aObj_CheckingMethods[i][0].ToString();
                string[]      filenames   = Directory.GetFiles(@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Eclipse\fsvw_common_KARS_DM", "*.*", SearchOption.TopDirectoryOnly);
                List <object> resultobjlt = new List <object> {
                    strMethod
                };
                int intOccurency = 0;
                foreach (var filename in filenames)
                {
                    System.IO.StreamReader file = new System.IO.StreamReader(filename);
                    string strline        = "";
                    int    intlinecounter = 1;
                    while ((strline = file.ReadLine()) != null)
                    {
                        //strline.
                        //if (intlinecounter==60)
                        //{
                        //    int ss = 5;
                        //}

                        if (strline.Contains(strMethod + "(") && !strline.Contains("<td>" + strMethod)) //if strMethod is used as a method, we try to find the end of this using
                        {
                            int intStartline = intlinecounter;


                            while (strline != null)
                            {
                                if (strline.Contains(";"))
                                {
                                    break;
                                }

                                if (strline.Contains("{") && strline[0] == '{')
                                {
                                    break;
                                }

                                strline = file.ReadLine();
                                intlinecounter++;
                            }

                            if (strline.Contains(";") && !(strline.Contains("{") && strline[0] == '{'))
                            {
                                //the strMethod is called here, we don't care
                            }
                            else if (!strline.Contains(";") && (strline.Contains("{") && strline[0] == '{'))
                            {
                                resultobjlt.Add(System.IO.Path.GetFileName(filename));
                                resultobjlt.Add(intStartline);
                                while (!(strline.Contains("}") && strline[0] == '}'))
                                {
                                    strline = file.ReadLine();
                                    intlinecounter++;
                                }
                                resultobjlt.Add(intlinecounter);
                                intOccurency++;
                            }
                            else
                            {
                                MessageBox.Show("impossible case!");
                            }
                        }
                        intlinecounter++;
                    }
                    file.Close();
                }
                resultobjltlt.Add(resultobjlt);
                intMaxOccurency = Math.Max(intMaxOccurency, intOccurency);
            }

            var strHeadLt = new List <string>(1 + intMaxOccurency * 3);

            strHeadLt.Add("Methods");
            for (int i = 0; i < intMaxOccurency; i++)
            {
                strHeadLt.Add("File");
                strHeadLt.Add("Start");
                strHeadLt.Add("End");
            }

            CHelpFuncExcel.ExportToExcel(resultobjltlt, "methods_position",
                                         @"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out", strHeadLt);

            MessageBox.Show("done!");
        }
        private void btnRun3_Click(object sender, EventArgs e)
        {
            string strFileNameCheckingMethods = @"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out\checkingmethods";
            var    aObj_CheckingMethods       = CHelpFuncExcel.ReadDataFromExcel(strFileNameCheckingMethods);

            List <List <object> > resultobjltlt = new List <List <object> >(aObj_CheckingMethods.GetLength(0));
            int intMaxOccurency = 0;

            for (int i = 0; i < aObj_CheckingMethods.GetLength(0); i++)
            //for (int i = 0; i < 1; i++)
            {
                var           strMethod   = aObj_CheckingMethods[i][0].ToString();
                string[]      filenames   = Directory.GetFiles(@"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Eclipse\fsvw_common_KARS_DM", "*.*", SearchOption.TopDirectoryOnly);
                List <object> resultobjlt = new List <object> {
                    strMethod
                };
                int intOccurency = 0;
                foreach (var filename in filenames)
                {
                    System.IO.StreamReader file = new System.IO.StreamReader(filename);
                    string strline        = "";
                    int    intlinecounter = 1;
                    while ((strline = file.ReadLine()) != null)
                    {
                        if (strline.Contains(strMethod))
                        {
                            resultobjlt.Add(System.IO.Path.GetFileName(filename));
                            if (strline.Contains(strMethod + "("))  //if strMethod is used as a method, we try to find the end of this using
                            {
                                resultobjlt.Add(intlinecounter);

                                while (strline != null && !strline.Contains(";"))
                                {
                                    strline = file.ReadLine();
                                    intlinecounter++;
                                }
                                resultobjlt.Add(intlinecounter);
                            }
                            else  //a special announce case
                            {
                                resultobjlt.Add(intlinecounter - 1);
                                resultobjlt.Add(intlinecounter + 2);
                            }

                            intOccurency++;
                        }
                        intlinecounter++;
                    }
                    file.Close();
                }
                resultobjltlt.Add(resultobjlt);
                intMaxOccurency = Math.Max(intMaxOccurency, intOccurency);
            }

            var strHeadLt = new List <string>(1 + intMaxOccurency * 3);

            strHeadLt.Add("Methods");
            for (int i = 0; i < intMaxOccurency; i++)
            {
                strHeadLt.Add("File");
                strHeadLt.Add("Start");
                strHeadLt.Add("End");
            }

            CHelpFuncExcel.ExportToExcel(resultobjltlt, "methods_position",
                                         @"C:\Study\MyWork\CodesChecking\fsvw_common_KARS_DM_Out", strHeadLt);

            MessageBox.Show("done!");
        }
예제 #15
0
 private void btnExportToExcel_Click(object sender, EventArgs e)
 {
     CHelpFuncExcel.ExportEvaluationToExcel(_DataRecords.ParameterResultToExcel, _DataRecords.ParameterInitialize, "0");
     //CHelpFuncExcel.KillExcel();
 }
예제 #16
0
        private void btnRunMulti_Click(object sender, EventArgs e)
        {
            double               dblThreshold        = Convert.ToDouble(this.txtThreshold.Text);
            double               dblGridSize         = Convert.ToDouble(this.txtGridSize.Text);
            IFeatureLayer        pFeatureLayer       = null;
            CParameterInitialize ParameterInitialize = _DataRecords.ParameterInitialize;

            //dialogue for saving
            SaveFileDialog SFD = new SaveFileDialog();

            SFD.ShowDialog();
            string strPath = SFD.FileName;

            ParameterInitialize.strSavePath = strPath;
            ParameterInitialize.pWorkspace  = CHelpFunc.OpenWorkspace(strPath);

            int intLayerCount = ParameterInitialize.m_mapFeature.LayerCount;
            List <List <double> > OutPutLtLt = new List <List <double> >(intLayerCount);

            //some stupid codes  :-)
            IFeatureLayer pFeatureLayerLast = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(intLayerCount - 1);
            List <CPoint> CptLtLast         = CHelpFunc.GetCPtLtFromPointFeatureLayer(pFeatureLayerLast);
            int           intPtNumLast      = CptLtLast.Count;

            long lngTime        = 0;
            long lngStartMemory = 0;
            long lngMemory      = 0;
            int  intOutPut      = 0;

            for (int i = 9; i < intLayerCount; i++)
            {
                List <double> OutPutLt = new List <double>(6);
                lngStartMemory = GC.GetTotalMemory(true);
                //long lngMemory1 = GC.GetTotalMemory(true);
                pFeatureLayer = (IFeatureLayer)ParameterInitialize.m_mapFeature.get_Layer(i);
                List <CPoint> CptLt = CHelpFunc.GetCPtLtFromPointFeatureLayer(pFeatureLayer);
                //GC.GetTotalMemory(true);
                //long lngMemory2 = GC.GetTotalMemory(true);
                //for (int j = 0; j < CptLt.Count; j++)
                //{
                //    CptLt[j].GID = j;
                //    //CptLt[j].intTS = new TreeSet<int>();
                //}
                //long lngMemory3 = GC.GetTotalMemory(true);
                //dblThreshold = Math.Pow(1.8 / Convert.ToDouble(CptLt.Count), 0.5);//---------------dblThreshold------------------------------------------------//


                //222222222222222222
                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                double dblThreshold2 = dblThreshold;
                double dblGridSize2  = dblGridSize * Math.Pow(Convert.ToDouble(intPtNumLast) / Convert.ToDouble(CptLt.Count), 0.5);
                Grids(ref CptLt, dblThreshold2, dblGridSize2, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                //3333333333333333
                lngTime = 0; lngMemory = lngStartMemory; intOutPut = 0;
                double dblThreshold3 = dblThreshold * Math.Pow(Convert.ToDouble(intPtNumLast) / Convert.ToDouble(CptLt.Count), 0.5);
                double dblGridSize3  = dblGridSize * Math.Pow(Convert.ToDouble(intPtNumLast) / Convert.ToDouble(CptLt.Count), 0.5);
                Grids(ref CptLt, dblThreshold3, dblGridSize3, ref lngTime, ref lngMemory, ref intOutPut);
                OutPutLt.Add(Convert.ToDouble(lngTime) / 1000);
                OutPutLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                OutPutLt.Add(Convert.ToDouble(intOutPut) / 1000);

                //dblTimeLt.Add(lngTime);
                //lngMemoryLt.Add(Convert.ToDouble(lngMemory) / 1048576);
                ////lngStartMemoryLt.Add(lngStartMemory);

                ////int intOutPut = 0;
                ////for (int j = 0; j < CptLt.Count; j++)
                ////{
                ////    intOutPut += CptLt[j].intTS.Count;
                ////}
                //dblOutPutLt.Add(intOutPut);

                OutPutLtLt.Add(OutPutLt);
                ParameterInitialize.tspbMain.Value = (i + 1) * 100 / intLayerCount;
                pFeatureLayer = null;
                CptLt         = null;
                OutPutLt      = null;
            }

            CHelpFuncExcel.ExportDataltltToExcel(OutPutLtLt, "Time&Memory&Output", ParameterInitialize.strSavePath);



            MessageBox.Show("Done!");
        }
        /// <summary>
        /// 获取线状要素
        /// </summary>
        /// <param name="intInterNum">Inter: Interpolation</param>
        /// <returns>在处理面状要素时,本程序将原面状要素的边界切开,按线状要素处理,处理完后再重新生成面状要素</returns>
        public List <CPolyline> GetTargetcpllt()
        {
            int intIterationNum          = Convert.ToInt32(_DataRecords.ParameterInitialize.txtIterationNum.Text);
            int intInterNum              = Convert.ToInt32(_DataRecords.ParameterInitialize.txtInterpolationNum.Text);
            List <CCorrCpts> pCorrCptsLt = _DataRecords.ParameterResult.CCorrCptsLt;   //Read Datasets后,此处ResultPtLt中的对应点为一一对应
            double           dblTX       = _dblTX;
            double           dblInterval = 1 / Convert.ToDouble(intInterNum + 1);


            int intPtNum      = pCorrCptsLt.Count;
            int intXYNum      = intPtNum * 2;
            int intMultiXYNum = intInterNum * intXYNum;


            //计算长度初始值(全部计算)
            double[,] adblLength0 = new double[intInterNum, intPtNum - 1];
            double[,] adblLength  = new double[intInterNum, intPtNum - 1];  //顺便定义中间值数组
            for (int j = 0; j < pCorrCptsLt.Count - 1; j++)
            {
                double dblfrsublength = CGeoFunc.CalDis(pCorrCptsLt[j + 1].FrCpt, pCorrCptsLt[j].FrCpt);
                double dbltosublength = CGeoFunc.CalDis(pCorrCptsLt[j + 1].ToCpt, pCorrCptsLt[j].ToCpt);
                for (int i = 0; i < intInterNum; i++)
                {
                    double dblProp = (i + 1) * dblInterval;
                    adblLength0[i, j] = (1 - dblProp) * dblfrsublength + dblProp * dbltosublength;
                }
                //pCorrCptsLt[j].FrCpt.isCtrl = false;  //仅以最开始两对和最终两队对应点为固定点,故此先设置为false
            }

            //计算角度初始值(全部计算)
            double[,] adblAngle0 = new double[intInterNum, intPtNum - 2];
            double[,] adblAngle  = new double[intInterNum, intPtNum - 2];
            for (int j = 0; j < pCorrCptsLt.Count - 2; j++)
            {
                //较大比例尺线状要素上的夹角
                double dblfrAngle = CGeoFunc.CalAngle_Counterclockwise(pCorrCptsLt[j].FrCpt, pCorrCptsLt[j + 1].FrCpt, pCorrCptsLt[j + 2].FrCpt);
                //较小比例尺线状要素上的夹角
                double dbltoAngle = CGeoFunc.CalAngle_Counterclockwise(pCorrCptsLt[j].ToCpt, pCorrCptsLt[j + 1].ToCpt, pCorrCptsLt[j + 2].ToCpt);

                //角度初始值
                for (int i = 0; i < intInterNum; i++)
                {
                    double dblProp = (i + 1) * dblInterval;
                    adblAngle0[i, j] = (1 - dblProp) * dblfrAngle + dblProp * dbltoAngle;
                }
            }

            //多线段间对应顶点距离初始值(全部计算),全部设置为0
            //目标值也设置为0
            double[,] adblIntervalDis0 = new double[intInterNum + 1, intPtNum];
            double[,] adblIntervalDis  = new double[intInterNum + 1, intPtNum];  //顺便定义中间值数组
            for (int j = 0; j < pCorrCptsLt.Count; j++)
            {
                //长度初始值
                for (int i = 0; i <= intInterNum; i++)
                {
                    adblIntervalDis0[i, j] = 0;
                    adblIntervalDis[i, j]  = 0;
                }
            }


            //计算坐标初始值,以及各线段方位角初始值
            //注意:默认固定第一条边
            pCorrCptsLt[0].FrCpt.isCtrl = true;
            pCorrCptsLt[1].FrCpt.isCtrl = true;
            VBMatrix X0 = new VBMatrix(intMultiXYNum, 1);

            double[,] adblAzimuth = new double[intInterNum, intPtNum - 1];
            for (int i = 0; i < intInterNum; i++)
            {
                double dblProp  = (i + 1) * dblInterval;
                double dblnewX0 = (1 - dblProp) * pCorrCptsLt[0].FrCpt.X + dblProp * pCorrCptsLt[0].ToCpt.X;
                double dblnewY0 = (1 - dblProp) * pCorrCptsLt[0].FrCpt.Y + dblProp * pCorrCptsLt[0].ToCpt.Y;
                double dblnewX1 = (1 - dblProp) * pCorrCptsLt[1].FrCpt.X + dblProp * pCorrCptsLt[1].ToCpt.X;
                double dblnewY1 = (1 - dblProp) * pCorrCptsLt[1].FrCpt.Y + dblProp * pCorrCptsLt[1].ToCpt.Y;
                adblAzimuth[i, 0] = CGeoFunc.CalAxisAngle(dblnewX0, dblnewY0, dblnewX1, dblnewY1);

                int intBasicIndex = i * intXYNum;
                X0[intBasicIndex + 0, 0] = dblnewX0;
                X0[intBasicIndex + 1, 0] = dblnewY0;
                X0[intBasicIndex + 2, 0] = dblnewX1;
                X0[intBasicIndex + 3, 0] = dblnewY1;
            }

            //其它点
            //是否固定最后两个点
            pCorrCptsLt[pCorrCptsLt.Count - 2].FrCpt.isCtrl = true;
            pCorrCptsLt[pCorrCptsLt.Count - 1].FrCpt.isCtrl = true;

            for (int j = 2; j < intPtNum; j++)
            {
                for (int i = 0; i < intInterNum; i++)
                {
                    int    intBasicIndexIJ = i * intXYNum + 2 * j;
                    double dblProp         = (i + 1) * dblInterval;
                    X0[intBasicIndexIJ + 0, 0] = (1 - dblProp) * pCorrCptsLt[j].FrCpt.X + dblProp * pCorrCptsLt[j].ToCpt.X;
                    X0[intBasicIndexIJ + 1, 0] = (1 - dblProp) * pCorrCptsLt[j].FrCpt.Y + dblProp * pCorrCptsLt[j].ToCpt.Y;
                    double dblAngle = CGeoFunc.CalAngle_Counterclockwise(X0[intBasicIndexIJ - 4, 0], X0[intBasicIndexIJ - 3, 0], X0[intBasicIndexIJ - 2, 0], X0[intBasicIndexIJ - 1, 0], X0[intBasicIndexIJ - 0, 0], X0[intBasicIndexIJ + 1, 0]);  //计算实际夹角
                    adblAzimuth[i, j - 1] = adblAzimuth[i, j - 2] + dblAngle - Math.PI;
                }
            }


            //for (int j = 2; j < intPtNum; j++)
            //{

            //    if (pCorrCptsLt[j].FrCpt.isCtrl == false)
            //    {
            //        for (int i = 0; i < intInterNum; i++)
            //        {
            //            int intBasicIndexI = i * intXYNum;
            //            adblAzimuth[i, j - 1] = adblAzimuth[i, j - 2] + adblAngle0[i, j - 2] - Math.PI;
            //            X0[intBasicIndexI + 2 * j + 0, 0] = X0[intBasicIndexI + 2 * (j - 1) + 0, 0] + adblLength0[i, j - 1] * Math.Cos(adblAzimuth[i, j - 1]);
            //            X0[intBasicIndexI + 2 * j + 1, 0] = X0[intBasicIndexI + 2 * (j - 1) + 1, 0] + adblLength0[i, j - 1] * Math.Sin(adblAzimuth[i, j - 1]);
            //        }
            //    }
            //    else
            //    {
            //        for (int i = 0; i < intInterNum; i++)
            //        {
            //            int intBasicIndexIJ = i * intXYNum + 2 * j;
            //            double dblProp = (i + 1) * dblInterval;
            //            X0[intBasicIndexIJ + 0, 0] = (1 - dblProp) * pCorrCptsLt[j].FrCpt.X + dblProp * pCorrCptsLt[j].ToCpt.X;
            //            X0[intBasicIndexIJ + 1, 0] = (1 - dblProp) * pCorrCptsLt[j].FrCpt.Y + dblProp * pCorrCptsLt[j].ToCpt.Y;
            //            double dblAngle = CGeoFunc.CalAngle_Counterclockwise(X0[intBasicIndexIJ - 4, 0], X0[intBasicIndexIJ - 3, 0], X0[intBasicIndexIJ - 2, 0], X0[intBasicIndexIJ - 1, 0], X0[intBasicIndexIJ - 0, 0], X0[intBasicIndexIJ + 1, 0]);  //计算实际夹角
            //            adblAzimuth[i, j - 1] = adblAzimuth[i, j - 2] + dblAngle - Math.PI;
            //        }
            //    }
            //}


            //统计插值点数
            int intKnownPt   = 0;                             //固定点的数目
            int intUnknownPt = 0;                             //非固定点的数目

            List <int> intKnownLocationLt = new List <int>(); //记录已知点的序号

            //注意:对于该循环,有一个默认条件,即FromCpl的第一个顶点只有一个对应点
            for (int i = 0; i < intPtNum; i++)
            {
                if (pCorrCptsLt[i].FrCpt.isCtrl == true)
                {
                    intKnownLocationLt.Add(i);
                    intKnownPt += 1;
                }
                else
                {
                    intUnknownPt += 1;
                }
            }
            int intUnknownXY      = intUnknownPt * 2; //每个点都有X、Y坐标
            int intMultiUnknownXY = intInterNum * intUnknownXY;

            //找出长度固定的位置(如果一个线段的前后两个点都固定,则该长度固定)。另外,长度固定则该边的方位角也固定
            List <int> intKnownLengthLt = new List <int>();

            for (int i = 0; i < intKnownLocationLt.Count - 1; i++)
            {
                if ((intKnownLocationLt[i + 1] - intKnownLocationLt[i]) == 1)
                {
                    intKnownLengthLt.Add(intKnownLocationLt[i]);
                }
            }
            int intUnknownLength = intPtNum - 1 - intKnownLengthLt.Count;

            //找出角度固定的位置(如果一个固定顶点的前后两个点都固定,则该角度固定)
            List <int> intKnownAngleLt = new List <int>();

            for (int i = 0; i < intKnownLocationLt.Count - 2; i++)
            {
                if ((intKnownLocationLt[i + 1] - intKnownLocationLt[i]) == 1 && (intKnownLocationLt[i + 2] - intKnownLocationLt[i + 1]) == 1)
                {
                    intKnownAngleLt.Add(intKnownLocationLt[i]);
                }
            }
            int intUnknownAngle = intPtNum - 2 - intKnownAngleLt.Count;

            //长度角度未知量
            int intUnknownLengthAngle = intUnknownLength + intUnknownAngle;

            //各未知量个数
            int intMultiUnknownLength      = intInterNum * intUnknownLength;
            int intMultiUnknownAngle       = intInterNum * intUnknownAngle;
            int intMultiUnknownLengthAngle = intMultiUnknownLength + intMultiUnknownAngle;
            int intMultiUnknownInterval    = (intInterNum + 1) * intUnknownPt;
            int intSumConstraints          = intMultiUnknownLength + intMultiUnknownAngle + intMultiUnknownInterval;

            intMultiUnknownLength      = 0;
            intMultiUnknownAngle       = 0;
            intMultiUnknownLengthAngle = intMultiUnknownLength + intMultiUnknownAngle;
            intMultiUnknownInterval    = (intInterNum + 1) * intUnknownPt;
            intSumConstraints          = intMultiUnknownLength + intMultiUnknownAngle + intMultiUnknownInterval;


            //定义权重矩阵
            VBMatrix P = new VBMatrix(intSumConstraints, intSumConstraints);

            for (int i = 0; i < intMultiUnknownLength; i++)  //长度权重
            {
                P[i, i] = 1;
            }
            for (int i = 0; i < intMultiUnknownAngle; i++)   //角度权重
            {
                P[intMultiUnknownLength + i, intMultiUnknownLength + i] = 40;
            }
            for (int i = 0; i < intMultiUnknownInterval; i++)   //角度权重
            {
                P[intMultiUnknownLengthAngle + i, intMultiUnknownLengthAngle + i] = 10000000000000;
            }



            //for (int i = 0; i < intInterNum; i++)
            //{
            //    int intBasicIndex2 = i * intUnknownLengthAngle;
            //    for (int j = 0; j < intUnknownLength; j++)
            //    {
            //        P[intBasicIndex2 + j, intBasicIndex2 + j] = 1;
            //    }
            //    for (int j = 0; j < intUnknownAngle; j++)
            //    {
            //        P[intBasicIndex2 + intUnknownLength + j, intBasicIndex2 + intUnknownLength + j] = 1;
            //    }
            //}

            //Xmix里存储了XA和X0的最新混合值(此矩阵在公式推导中并不存在,只是为了方便编写代码而建立)
            VBMatrix Xmix = new VBMatrix(intMultiXYNum, 1);

            for (int i = 0; i < intMultiXYNum; i++)
            {
                Xmix[i, 0] = X0[i, 0];
            }

            //定义坐标近似值矩阵XA
            VBMatrix XA           = new VBMatrix(intMultiUnknownXY, 1);
            VBMatrix XA0          = new VBMatrix(intMultiUnknownXY, 1);
            int      intSumCount0 = 0;

            for (int j = 0; j < intUnknownPt; j++)
            {
                if (pCorrCptsLt[intSumCount0].FrCpt.isCtrl == false)
                {
                    for (int i = 0; i < intInterNum; i++)
                    {
                        XA[i * intUnknownXY + j * 2 + 0, 0] = X0[i * intXYNum + intSumCount0 * 2 + 0, 0];
                        XA[i * intUnknownXY + j * 2 + 1, 0] = X0[i * intXYNum + intSumCount0 * 2 + 1, 0];

                        XA0[i * intUnknownXY + j * 2 + 0, 0] = XA[i * intUnknownXY + j * 2 + 0, 0];
                        XA0[i * intUnknownXY + j * 2 + 1, 0] = XA[i * intUnknownXY + j * 2 + 1, 0];
                    }
                }
                else
                {
                    j -= 1;
                }
                intSumCount0 += 1;
            }

            //定义系数矩阵A(各方程对坐标的导数值),A的导数值将在循环中给出
            VBMatrix A                 = new VBMatrix(intSumConstraints, intMultiUnknownXY);
            double   dblJudge1         = 0; //该值用于判断是否应该跳出循环
            double   dblJudge2         = 0; //该值用于判断是否应该跳出循环
            double   dblJudge3         = 0; //该值用于判断是否应该跳出循环
            int      intJudgeIndex     = intMultiUnknownXY / 4;
            int      intIterativeCount = 0;

            for (int k = 0; k < 2; k++)
            {
                //break;
                do
                {
                    if (intIterativeCount >= intIterationNum)
                    {
                        break;
                    }
                    intIterativeCount += 1;


                    VBMatrix matl = new VBMatrix(intSumConstraints, 1);


                    //计算系数矩阵A第0行到"intUnknownLength"行的各元素,即线段长度对各未知数求偏导的值
                    //先计算各分母值(注意:分母实际上是求偏导后的一部分值,但却恰好等于两点之间距离,因此其计算公式与距离计算公式相同
                    for (int i = 0; i < intInterNum; i++)
                    {
                        int intBasicIndexS1 = i * intXYNum;
                        for (int j = 0; j < intPtNum - 1; j++)
                        {
                            int intBasicIndexIJS1 = intBasicIndexS1 + 2 * j;
                            adblLength[i, j] = Math.Sqrt((Xmix[intBasicIndexIJS1 + 0, 0] - Xmix[intBasicIndexIJS1 + 2, 0]) * (Xmix[intBasicIndexIJS1 + 0, 0] - Xmix[intBasicIndexIJS1 + 2, 0]) +
                                                         (Xmix[intBasicIndexIJS1 + 1, 0] - Xmix[intBasicIndexIJS1 + 3, 0]) * (Xmix[intBasicIndexIJS1 + 1, 0] - Xmix[intBasicIndexIJS1 + 3, 0]));
                        }
                    }

                    //计算新的方位角
                    for (int i = 0; i < intInterNum; i++)
                    {
                        int intBasicIndexA1 = i * intXYNum;
                        //第一条线段的方位角
                        adblAzimuth[i, 0] = CGeoFunc.CalAxisAngle(Xmix[intBasicIndexA1 + 0, 0], Xmix[intBasicIndexA1 + 1, 0], Xmix[intBasicIndexA1 + 2, 0], Xmix[intBasicIndexA1 + 3, 0]);
                        //后面线段的方位角
                        for (int j = 1; j < intPtNum - 1; j++)
                        {
                            int    intBasicIndexIJA1 = intBasicIndexA1 + 2 * j;
                            double dblAngle          = CGeoFunc.CalAngle_Counterclockwise(Xmix[intBasicIndexIJA1 - 2, 0], Xmix[intBasicIndexIJA1 - 1, 0],
                                                                                          Xmix[intBasicIndexIJA1 + 0, 0], Xmix[intBasicIndexIJA1 + 1, 0],
                                                                                          Xmix[intBasicIndexIJA1 + 2, 0], Xmix[intBasicIndexIJA1 + 3, 0]);
                            adblAzimuth[i, j] = adblAzimuth[i, j - 1] + dblAngle - Math.PI;
                        }
                    }

                    //计算新的多线段间对应顶点距离
                    for (int j = 0; j < intPtNum; j++)
                    {
                        int int2J = 2 * j;
                        //源线段与第一生成线段间对应点距离
                        adblIntervalDis[0, j] = Math.Sqrt((pCorrCptsLt[j].FrCpt.X - Xmix[int2J + 0, 0]) * (pCorrCptsLt[j].FrCpt.X - Xmix[int2J + 0, 0]) +
                                                          (pCorrCptsLt[j].FrCpt.Y - Xmix[int2J + 1, 0]) * (pCorrCptsLt[j].FrCpt.Y - Xmix[int2J + 1, 0]));
                        //目标线段与最后生成线段间对应点距离
                        adblIntervalDis[intInterNum, j] = Math.Sqrt((pCorrCptsLt[j].ToCpt.X - Xmix[(intInterNum - 1) * intXYNum + int2J + 0, 0]) * (pCorrCptsLt[j].ToCpt.X - Xmix[(intInterNum - 1) * intXYNum + int2J + 0, 0]) +
                                                                    (pCorrCptsLt[j].ToCpt.Y - Xmix[(intInterNum - 1) * intXYNum + int2J + 1, 0]) * (pCorrCptsLt[j].ToCpt.Y - Xmix[(intInterNum - 1) * intXYNum + int2J + 1, 0]));
                        //各生成线段间对应点距离
                        for (int i = 1; i < intInterNum; i++)
                        {
                            adblIntervalDis[i, j] = Math.Sqrt((Xmix[(i - 1) * intXYNum + int2J + 0, 0] - Xmix[i * intXYNum + int2J + 0, 0]) * (Xmix[(i - 1) * intXYNum + int2J + 0, 0] - Xmix[i * intXYNum + int2J + 0, 0]) +
                                                              (Xmix[(i - 1) * intXYNum + int2J + 1, 0] - Xmix[i * intXYNum + int2J + 1, 0]) * (Xmix[(i - 1) * intXYNum + int2J + 1, 0] - Xmix[i * intXYNum + int2J + 1, 0]));
                        }
                    }

                    ////计算系数矩阵中关于长度值的导数部分(注意:隐含的距离计算公式为后一个点的坐标减前一个点的坐标)
                    //int intKnownCount2 = 0;
                    //int intUnKnownCount2 = 0;
                    //for (int j = 0; j < intUnknownLength; j++)
                    //{
                    //    int intSumCount = intKnownCount2 + intUnKnownCount2;
                    //    int intBasicIndexL2 = 2 * intUnKnownCount2;
                    //    if (pCorrCptsLt[intSumCount].FrCpt.isCtrl == false && pCorrCptsLt[intSumCount + 1].FrCpt.isCtrl == false)
                    //    {
                    //        for (int i = 0; i < intInterNum; i++)
                    //        {
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 0] = -Math.Cos(adblAzimuth[i, intSumCount]);
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 1] = -Math.Sin(adblAzimuth[i, intSumCount]);
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 2] = -A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 0];
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 3] = -A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 1];

                    //            matl[i * intUnknownLength + j, 0] =adblLength0[i, intSumCount]- adblLength[i, intSumCount];   //图方便,顺便计算matl
                    //        }
                    //        intUnKnownCount2 += 1;
                    //    }
                    //    else if (pCorrCptsLt[intSumCount].FrCpt.isCtrl == false && pCorrCptsLt[intSumCount + 1].FrCpt.isCtrl == true)
                    //    {
                    //        for (int i = 0; i < intInterNum; i++)
                    //        {
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 0] = -Math.Cos(adblAzimuth[i, intSumCount]);
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 1] = -Math.Sin(adblAzimuth[i, intSumCount]);

                    //            matl[i * intUnknownLength + j, 0] = adblLength0[i, intSumCount]- adblLength[i, intSumCount];   //图方便,顺便计算matl
                    //        }
                    //        intUnKnownCount2 += 1;
                    //    }
                    //    else if (pCorrCptsLt[intSumCount].FrCpt.isCtrl == true && pCorrCptsLt[intSumCount + 1].FrCpt.isCtrl == false)
                    //    {
                    //        for (int i = 0; i < intInterNum; i++)
                    //        {
                    //            //注意这种情况,由于"pCorrCptsLt[intSumCount].FrCpt.isCtrl == true"不占位子(即不占列),因此列序号依然为" 2 * intUnKnownCount + 0"和" 2 * intUnKnownCount + 1",而不是+2,+3
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 0] = Math.Cos(adblAzimuth[i, intSumCount]);
                    //            A[i * intUnknownLength + j, i * intUnknownXY + intBasicIndexL2 + 1] = Math.Sin(adblAzimuth[i, intSumCount]);

                    //            matl[i * intUnknownLength + j, 0] =adblLength0[i, intSumCount]- adblLength[i, intSumCount];   //图方便,顺便计算matl
                    //        }
                    //        intKnownCount2 += 1;
                    //    }
                    //    else
                    //    {
                    //        intKnownCount2 += 1;
                    //        j -= 1;
                    //    }
                    //}

                    ////计算系数矩阵中关于夹角值的导数部分
                    //int intKnownCount3 = 0;
                    //int intUnKnownCount3 = 0;
                    //for (int j = 0; j < intUnknownAngle; j++)
                    //{
                    //    //真是太幸运了,虽然求两向量逆时针夹角时需分多种情况讨论,但各情况的导数形式却是一致的,节省了不少编程精力啊,哈哈
                    //    int intSumCount = intKnownCount3 + intUnKnownCount3;


                    //    //常用数据准备
                    //    double[] adblA2 = new double[intInterNum];
                    //    double[] adblB2 = new double[intInterNum];
                    //    for (int i = 0; i < intInterNum; i++)
                    //    {
                    //        adblA2[i] = adblLength[i, intSumCount + 0] * adblLength[i, intSumCount + 0];
                    //        adblB2[i] = adblLength[i, intSumCount + 1] * adblLength[i, intSumCount + 1];
                    //    }

                    //    //开始计算系数值,由于将以下三个情况排列组合将有八种情况,因此按如下方式计算
                    //    if (pCorrCptsLt[intUnKnownCount3 + intKnownCount3].FrCpt.isCtrl == true && pCorrCptsLt[intUnKnownCount3 + intKnownCount3 + 1].FrCpt.isCtrl == true && pCorrCptsLt[intUnKnownCount3 + intKnownCount3 + 2].FrCpt.isCtrl == true)
                    //    {
                    //        intKnownCount3 += 1;
                    //        j -= 1;
                    //    }
                    //    else
                    //    {
                    //        for (int i = 0; i < intInterNum; i++)
                    //        {
                    //            int intBasicIndexFi3 = i * intXYNum + 2 * intSumCount;
                    //            double dblNewAngle = CGeoFunc.CalAngle_Counterclockwise(Xmix[intBasicIndexFi3 + 0, 0], Xmix[intBasicIndexFi3 + 1, 0],
                    //                                                           Xmix[intBasicIndexFi3 + 2, 0], Xmix[intBasicIndexFi3 + 3, 0],
                    //                                                           Xmix[intBasicIndexFi3 + 4, 0], Xmix[intBasicIndexFi3 + 5, 0]);

                    //            adblAngle[i, j] = dblNewAngle;
                    //            matl[intMultiUnknownLength + i * intUnknownAngle + j, 0] =adblAngle0[i, intSumCount]- dblNewAngle;      //图方便,顺便计算matl
                    //        }

                    //        int intPreTrueNum = 0;
                    //        int intUnKnownCount3orginal = intUnKnownCount3;
                    //        int intKnownCount3orginal = intKnownCount3;
                    //        if (pCorrCptsLt[intUnKnownCount3orginal + intKnownCount3orginal + 0].FrCpt.isCtrl == false)
                    //        {
                    //            //X1,Y1的导数值(注意:该部分是减数,因此值为导数的负数)
                    //            for (int i = 0; i < intInterNum; i++)
                    //            {
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * intUnKnownCount3orginal + 0] = -(Xmix[i * intXYNum + 2 * intSumCount + 3, 0] - Xmix[i * intXYNum + 2 * intSumCount + 1, 0]) / adblA2[i];
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * intUnKnownCount3orginal + 1] = (Xmix[i * intXYNum + 2 * intSumCount + 2, 0] - Xmix[i * intXYNum + 2 * intSumCount + 0, 0]) / adblA2[i];
                    //            }

                    //            intUnKnownCount3 += 1;
                    //        }
                    //        else
                    //        {
                    //            intPreTrueNum += 1;
                    //            intKnownCount3 += 1;
                    //        }

                    //        if (pCorrCptsLt[intUnKnownCount3orginal + intKnownCount3orginal + 1].FrCpt.isCtrl == false)
                    //        {
                    //            //X2,Y2的导数值
                    //            for (int i = 0; i < intInterNum; i++)
                    //            {
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * (intUnKnownCount3orginal - intPreTrueNum) + 2] = (Xmix[i * intXYNum + 2 * intSumCount + 5, 0] - Xmix[i * intXYNum + 2 * intSumCount + 3, 0]) / adblB2[i]
                    //                                                                                                                                         + (Xmix[i * intXYNum + 2 * intSumCount + 3, 0] - Xmix[i * intXYNum + 2 * intSumCount + 1, 0]) / adblA2[i];
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * (intUnKnownCount3orginal - intPreTrueNum) + 3] = -(Xmix[i * intXYNum + 2 * intSumCount + 4, 0] - Xmix[i * intXYNum + 2 * intSumCount + 2, 0]) / adblB2[i]
                    //                                                                                                                                          - (Xmix[i * intXYNum + 2 * intSumCount + 2, 0] - Xmix[i * intXYNum + 2 * intSumCount + 0, 0]) / adblA2[i];
                    //            }
                    //        }
                    //        else
                    //        {
                    //            intPreTrueNum += 1;
                    //        }
                    //        if (pCorrCptsLt[intUnKnownCount3orginal + intKnownCount3orginal + 2].FrCpt.isCtrl == false)
                    //        {
                    //            //X3,Y3的导数值
                    //            for (int i = 0; i < intInterNum; i++)
                    //            {
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * (intUnKnownCount3orginal - intPreTrueNum) + 4] = -(Xmix[i * intXYNum + 2 * intSumCount + 5, 0] - Xmix[i * intXYNum + 2 * intSumCount + 3, 0]) / adblB2[i];
                    //                A[intMultiUnknownLength + i * intUnknownAngle + j, i * intUnknownXY + 2 * (intUnKnownCount3orginal - intPreTrueNum) + 5] = (Xmix[i * intXYNum + 2 * intSumCount + 4, 0] - Xmix[i * intXYNum + 2 * intSumCount + 2, 0]) / adblB2[i];
                    //            }
                    //        }
                    //    }
                    //}

                    //计算系数矩阵中关于多线段间对应顶点距离的导数部分(注意:隐含的距离计算公式为后一个点的坐标减前一个点的坐标)
                    int intKnownCount4   = 0;
                    int intUnKnownCount4 = 0;
                    for (int j = 0; j < intUnknownPt; j++)
                    {
                        int intSumCount4    = intKnownCount4 + intUnKnownCount4;
                        int intBasicIndexL4 = 2 * intUnKnownCount4;
                        if (pCorrCptsLt[intSumCount4].FrCpt.isCtrl == false)
                        {
                            int l = 0;
                            //源线段与第一生成线段间对应点距离导数
                            A[intMultiUnknownLengthAngle + l * intUnknownPt + j, (l - 0) * intUnknownXY + intBasicIndexL4 + 0] = (Xmix[l * intXYNum + 2 * intSumCount4 + 0, 0] - pCorrCptsLt[intSumCount4].FrCpt.X) / adblIntervalDis[l, intSumCount4];
                            A[intMultiUnknownLengthAngle + l * intUnknownPt + j, (l - 0) * intUnknownXY + intBasicIndexL4 + 1] = (Xmix[l * intXYNum + 2 * intSumCount4 + 1, 0] - pCorrCptsLt[intSumCount4].FrCpt.Y) / adblIntervalDis[l, intSumCount4];

                            matl[intMultiUnknownLengthAngle + l * intUnknownPt + j, 0] = adblIntervalDis0[l, intSumCount4] - adblIntervalDis[l, intSumCount4];      //图方便,顺便计算matl

                            //最后生成线段与目标线段间对应点距离导数
                            l = intInterNum;
                            A[intMultiUnknownLengthAngle + l * intUnknownPt + j, (l - 1) * intUnknownXY + intBasicIndexL4 + 0] = -(pCorrCptsLt[intSumCount4].ToCpt.X - Xmix[(l - 1) * intXYNum + 2 * intSumCount4 + 0, 0]) / adblIntervalDis[l, intSumCount4];
                            A[intMultiUnknownLengthAngle + l * intUnknownPt + j, (l - 1) * intUnknownXY + intBasicIndexL4 + 1] = -(pCorrCptsLt[intSumCount4].ToCpt.Y - Xmix[(l - 1) * intXYNum + 2 * intSumCount4 + 1, 0]) / adblIntervalDis[l, intSumCount4];

                            matl[intMultiUnknownLengthAngle + l * intUnknownPt + j, 0] = adblIntervalDis0[l, intSumCount4] - adblIntervalDis[l, intSumCount4];       //图方便,顺便计算matl

                            //各生成线段间对应点距离导数
                            for (int i = 1; i < intInterNum; i++)
                            {
                                A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 1) * intUnknownXY + intBasicIndexL4 + 0] = -(Xmix[i * intXYNum + 2 * intSumCount4 + 0, 0] - Xmix[(i - 1) * intXYNum + 2 * intSumCount4 + 0, 0]) / adblIntervalDis[i, intSumCount4];
                                A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 1) * intUnknownXY + intBasicIndexL4 + 1] = -(Xmix[i * intXYNum + 2 * intSumCount4 + 1, 0] - Xmix[(i - 1) * intXYNum + 2 * intSumCount4 + 1, 0]) / adblIntervalDis[i, intSumCount4];
                                A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 0) * intUnknownXY + intBasicIndexL4 + 0] = -A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 1) * intUnknownXY + +intBasicIndexL4 + 0];
                                A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 0) * intUnknownXY + intBasicIndexL4 + 1] = -A[intMultiUnknownLengthAngle + i * intUnknownPt + j, (i - 1) * intUnknownXY + +intBasicIndexL4 + 1];

                                matl[intMultiUnknownLengthAngle + i * intUnknownPt + j, 0] = adblIntervalDis0[i, intSumCount4] - adblIntervalDis[i, intSumCount4];      //图方便,顺便计算matl
                                //double dblIntervalDis = adblIntervalDis[i, intSumCount4];
                                //double dblIntervalDis0 = adblIntervalDis0[i, intSumCount4];
                                //double dblmatl = dblIntervalDis - dblIntervalDis0;
                                //double ttt = 6;
                            }

                            intUnKnownCount4 += 1;
                        }
                        else
                        {
                            intKnownCount4 += 1;
                            j -= 1;
                        }
                    }



                    int tt = 5;

                    //CHelpFuncExcel.ExportDataToExcel2(A, "matA", _DataRecords.ParameterInitialize.strSavePath);
                    //CHelpFuncExcel.ExportDataToExcelP(P, "matP", _DataRecords.ParameterInitialize.strSavePath);
                    //CHelpFuncExcel.ExportDataToExcel2(matl, "matl", _DataRecords.ParameterInitialize.strSavePath);



                    //平差
                    VBMatrix Temp    = A.Trans() * P * A;
                    VBMatrix InvTemp = Temp.Inv(Temp);
                    VBMatrix x       = InvTemp * A.Trans() * P * matl;

                    XA += x;

                    CHelpFuncExcel.ExportDataToExcel2(x, "matx", _DataRecords.ParameterInitialize.strSavePath);
                    CHelpFuncExcel.ExportDataToExcel2(XA, "matXA", _DataRecords.ParameterInitialize.strSavePath);

                    //记录各平差成果
                    //坐标改正值
                    //VBMatrix Xc = XA - XA0;
                    //观测值改正值矩阵V
                    VBMatrix V = A * x - matl;
                    //VtPV值
                    double dblVtPV = (V.Trans() * P * V).MatData[0, 0];

                    _DataRecords.ParameterInitialize.txtVtPV.Text = "   VtPV = " + dblVtPV.ToString();


                    //VBMatrix L = new VBMatrix(intSumConstraints, 1);
                    //for (int i = 0; i < intInterNum; i++)
                    //{
                    //    for (int j = 0; j < intUnknownLength; j++)
                    //    {
                    //        L[i * intUnknownLength + j, 0] = adblLength[i, j];
                    //    }

                    //    for (int j = 0; j < intUnknownAngle; j++)
                    //    {
                    //        L[intInterNum * intUnknownLength + i * intUnknownAngle + j, 0] = adblAngle[i, j];
                    //    }
                    //}
                    //for (int i = 0; i <= intInterNum; i++)
                    //{
                    //    for (int j = 0; j < intUnknownPt; j++)
                    //    {
                    //        L[intInterNum * intUnknownLengthAngle + i * intUnknownPt + j, 0] = adblIntervalDis[i, j];
                    //    }
                    //}


                    //VBMatrix LPlusV = L + V;
                    //VBMatrix AX = A * XA;

                    //CHelpFuncExcel.ExportDataToExcel2(LPlusV, "matLPlusV", _DataRecords.ParameterInitialize.strSavePath);
                    //CHelpFuncExcel.ExportDataToExcel2(AX, "matAX", _DataRecords.ParameterInitialize.strSavePath);



                    //更新Xmix
                    int intSumCount5 = 0;
                    for (int j = 0; j < intUnknownPt; j++)
                    {
                        if (pCorrCptsLt[intSumCount5].FrCpt.isCtrl == false)
                        {
                            for (int i = 0; i < intInterNum; i++)
                            {
                                Xmix[i * intXYNum + intSumCount5 * 2 + 0, 0] = XA[i * intUnknownXY + j * 2 + 0, 0];
                                Xmix[i * intXYNum + intSumCount5 * 2 + 1, 0] = XA[i * intUnknownXY + j * 2 + 1, 0];
                            }
                        }
                        else
                        {
                            j -= 1;
                        }
                        intSumCount5 += 1;
                    }



                    //这里只是随便取两个中间值以观测是否收敛
                    dblJudge1 = Math.Abs(x[1 * intJudgeIndex, 0]);
                    dblJudge2 = Math.Abs(x[2 * intJudgeIndex, 0]);
                    dblJudge3 = Math.Abs(x[3 * intJudgeIndex, 0]);

                    //} while ((dblJudge1 > dblTX) || (dblJudge2 > dblTX) || (dblJudge3 > dblTX));
                }while ((dblJudge1 >= 0) || (dblJudge2 >= 0) || (dblJudge3 >= 0));
                break;



                for (int i = 0; i < intMultiUnknownLength; i++)  //长度权重
                {
                    P[i, i] = 1;
                }
                for (int i = 0; i < intMultiUnknownAngle; i++)   //角度权重
                {
                    P[intMultiUnknownLength + i, intMultiUnknownLength + i] = 39.48;
                }
                for (int i = 0; i < intMultiUnknownInterval; i++)   //角度权重
                {
                    P[intMultiUnknownLengthAngle + i, intMultiUnknownLengthAngle + i] = 1;
                }
            }


            //生成目标线段
            List <CPolyline> cpllt = new List <CPolyline>();

            for (int i = 0; i < intInterNum; i++)
            {
                List <CPoint> cptlt = new List <CPoint>();
                for (int j = 0; j < intPtNum; j++)
                {
                    CPoint cpt = new CPoint(j, Xmix[i * intXYNum + j * 2, 0], Xmix[i * intXYNum + j * 2 + 1, 0]);
                    cptlt.Add(cpt);
                }
                CPolyline cpl = new CPolyline(i, cptlt);
                cpllt.Add(cpl);
            }

            return(cpllt);
        }