Exemple #1
0
        /// <summary>
        /// Deflection (i.e. the integral distance between two line segments)
        /// </summary>
        /// <param name="LastCorrCpts">the last pair of corresponding points</param>
        /// <param name="CurrentCorrCpts">the current pair of corresponding points</param>
        /// <param name="pStandardVectorCpt"></param>
        /// <returns>the integral distance between the two line segments</returns>
        private static double CalDeflectionCLIA(CCorrCpts LastCorrCpts, CCorrCpts CurrentCorrCpts, double dblFrTotalLength, double dblToTotalLength)
        {
            double dblfrlength = dblFrTotalLength * (CurrentCorrCpts.FrCpt.dblRatioLengthFromStart - LastCorrCpts.FrCpt.dblRatioLengthFromStart);
            double dbltolength = dblToTotalLength * (CurrentCorrCpts.ToCpt.dblRatioLengthFromStart - LastCorrCpts.ToCpt.dblRatioLengthFromStart);

            return(CalDeflectionSub(LastCorrCpts, CurrentCorrCpts, dblfrlength, dbltolength));
        }
Exemple #2
0
        /// <summary>
        /// Deflection (i.e. the integral distance between two line segments)
        /// </summary>
        /// <param name="LastCorrCpts">the last pair of corresponding points</param>
        /// <param name="CurrentCorrCpts">the current pair of corresponding points</param>
        /// <param name="pStandardVectorCpt"></param>
        /// <returns>the integral distance between the two line segments</returns>
        private static double CalDeflection(CCorrCpts LastCorrCpts, CCorrCpts CurrentCorrCpts, double dblFrTotalLength, double dblToTotalLength)
        {
            double dblfrlength = CGeoFunc.CalDis(LastCorrCpts.FrCpt, CurrentCorrCpts.FrCpt);
            double dbltolength = CGeoFunc.CalDis(LastCorrCpts.ToCpt, CurrentCorrCpts.ToCpt);

            return(CalDeflectionSub(LastCorrCpts, CurrentCorrCpts, dblfrlength, dbltolength));
        }
        public IPolyline5 GenerateCorrIPl(CCorrCpts pCorrCpts)
        {
            IPointCollection4 pCol = new PolylineClass();

            pCol.AddPoint(pCorrCpts.FrCpt.JudgeAndSetAEGeometry() as IPoint);
            pCol.AddPoint(pCorrCpts.ToCpt.JudgeAndSetAEGeometry() as IPoint);

            return(pCol as IPolyline5);
        }
        /// <summary>
        /// 提取对应线段
        /// </summary>
        /// <param name="frcpl">大比例尺线状要素</param>
        /// <param name="tocpl">小比例尺线状要素</param>
        /// <param name="pCorrespondBendLt">对应弯曲列表</param>
        /// <returns>对应线段</returns>
        /// <remarks></remarks>
        public static SCG.LinkedList <CCorrSegment> DetectCorrespondSegment(CPolyline frcpl, CPolyline tocpl, List <CCorrespondBend> pCorrespondBendLt)
        {
            //提取对应弯曲的首尾点为对应特征点
            SortedList <double, CCorrCpts> pCorrespondingCptSlt = new SortedList <double, CCorrCpts>(new CCmpDbl());

            CCorrCpts pStartCorrespondingCpt0 = new CCorrCpts(frcpl.CptLt[0], tocpl.CptLt[0]);                                         //第一对对应特征点
            CCorrCpts pEndCorrespondingCpt0   = new CCorrCpts(frcpl.CptLt[frcpl.CptLt.Count - 1], tocpl.CptLt[tocpl.CptLt.Count - 1]); //第二对对应特征点

            pCorrespondingCptSlt.Add(0, pStartCorrespondingCpt0);
            pCorrespondingCptSlt.Add(1, pEndCorrespondingCpt0);

            //其它对应特征点
            for (int i = 0; i < pCorrespondBendLt.Count; i++)
            {
                CCorrCpts pStartCorrespondingCpt = new CCorrCpts(pCorrespondBendLt[i].CFromBend.CptLt[0], pCorrespondBendLt[i].CToBend.CptLt[0]);
                CCorrCpts pEndCorrespondingCpt   = new CCorrCpts(
                    pCorrespondBendLt[i].CFromBend.CptLt[pCorrespondBendLt[i].CFromBend.CptLt.Count - 1],
                    pCorrespondBendLt[i].CToBend.CptLt[pCorrespondBendLt[i].CToBend.CptLt.Count - 1]);

                pCorrespondingCptSlt.Add(pCorrespondBendLt[i].CFromBend.dblStartRL, pStartCorrespondingCpt);
                pCorrespondingCptSlt.Add(pCorrespondBendLt[i].CFromBend.dblEndRL, pEndCorrespondingCpt);
            }


            //查找并删除重复对应特征点
            for (int i = pCorrespondingCptSlt.Count - 1; i > 0; i--)
            {
                CPoint frcpt2 = pCorrespondingCptSlt.Values[i].FrCpt;
                CPoint tocpt2 = pCorrespondingCptSlt.Values[i].ToCpt;
                CPoint frcpt1 = pCorrespondingCptSlt.Values[i - 1].FrCpt;
                CPoint tocpt1 = pCorrespondingCptSlt.Values[i - 1].ToCpt;
                if (frcpt1.Equals2D(frcpt2) && tocpt1.Equals2D(tocpt2))
                {
                    pCorrespondingCptSlt.RemoveAt(i);
                }
            }

            //以对应特征点为断点分割原始线段,得到对应线段
            SCG.LinkedList <CCorrSegment> pCorrespondSegmentLk = new SCG.LinkedList <CCorrSegment>();

            //中间的对应线段
            for (int i = 0; i < pCorrespondingCptSlt.Count - 1; i++)
            {
                CPolyline frSegment = frcpl.GetSubPolyline(pCorrespondingCptSlt.Values[i].FrCpt, pCorrespondingCptSlt.Values[i + 1].FrCpt);
                CPolyline toSegment = tocpl.GetSubPolyline(pCorrespondingCptSlt.Values[i].ToCpt, pCorrespondingCptSlt.Values[i + 1].ToCpt);
                pCorrespondSegmentLk.AddLast(new CCorrSegment(frSegment, toSegment));
            }

            return(pCorrespondSegmentLk);
        }
        /// <summary>
        /// 确定对应关系(一一对应)
        /// </summary>
        /// <param name="XYCpl">平面XY线状要素</param>
        /// <param name="THCpl">时间高度线状要素</param>
        /// <returns>飞机高度与时间关系的折线</returns>
        /// <remarks>HT:Height respect to Time
        ///          固定倒数两个点</remarks>
        public List <CCorrCpts> GetCorrCptsLt(CPolyline XYCpl, CPolyline THCpl)
        {
            List <CCorrCpts> pCorrCptsLt = new List <CCorrCpts>();

            for (int i = 0; i < XYCpl.CptLt.Count; i++)
            {
                CCorrCpts pCorrCpts = new CCorrCpts(XYCpl.CptLt[i], THCpl.CptLt[i]);
                pCorrCptsLt.Add(pCorrCpts);
            }

            pCorrCptsLt[pCorrCptsLt.Count - 2].FrCpt.isCtrl = true;
            pCorrCptsLt[pCorrCptsLt.Count - 2].ToCpt.isCtrl = true;
            pCorrCptsLt[pCorrCptsLt.Count - 1].FrCpt.isCtrl = true;
            pCorrCptsLt[pCorrCptsLt.Count - 1].ToCpt.isCtrl = true;
            return(pCorrCptsLt);
        }
        /// <summary>
        /// 将ResultPtlt形式的结果转换为CorrespondPtlt形式的结果
        /// </summary>
        /// <param name="cresultptlt">ResultPtlt形式的结果</param>
        /// <returns>CorrespondPtlt形式的结果</returns>
        /// <remarks></remarks>
        public static List <CCorrCpts> TransferResultptltToCorrCptsLt(List <CPoint> cresultptlt)
        {
            var pCorrCptslt = new List <CCorrCpts>(cresultptlt.Count);

            for (int i = 0; i < cresultptlt.Count; i++)
            {
                CPoint frcpt = cresultptlt[i];
                for (int j = 0; j < cresultptlt[i].CorrespondingPtLt.Count; j++)
                {
                    CPoint tocpt = cresultptlt[i].CorrespondingPtLt[j];

                    //为了跟原来的点断绝关系,以产生不必要的麻烦,此处重新生成点
                    var newfrcpt  = new CPoint(frcpt.ID, frcpt.X, frcpt.Y, frcpt.Z);
                    var newtocpt  = new CPoint(tocpt.ID, tocpt.X, tocpt.Y, frcpt.Z);
                    var pCorrCpts = new CCorrCpts(newfrcpt, newtocpt);
                    pCorrCptslt.Add(pCorrCpts);
                }
            }
            return(pCorrCptslt);
        }
        /// <summary>以回溯的方式寻找对应线段</summary>
        /// <returns>对应线段数组</returns>
        protected List <CCorrCpts> GetCorrespondences(List <CTable> TableLt,
                                                      List <List <CPoint> > frcptltlt, List <List <CPoint> > tocptltlt, int inFrCptNum, int intToCptNum, out List <CCorrCpts> CtrlCptsLt)
        {
            List <CCorrCpts> CorrCptsLt = new List <CCorrCpts>(inFrCptNum + intToCptNum - 2);

            CtrlCptsLt = new List <CCorrCpts>(Convert.ToInt32(inFrCptNum / intToCptNum) + 1);

            var CCorrCptsFirst = new CCorrCpts(frcptltlt[0][0], tocptltlt[0][0]);

            CorrCptsLt.Add(CCorrCptsFirst);
            CtrlCptsLt.Add(CCorrCptsFirst);  // add the first pair of control points


            for (int i = 0; i < TableLt.Count; i++)
            {
                List <CCorrCpts> subCtrlCptsLt;
                CorrCptsLt.AddRange(GetCorrespondences(TableLt[i], frcptltlt[i], tocptltlt[i], out subCtrlCptsLt));
                CtrlCptsLt.AddRange(subCtrlCptsLt);
            }

            return(CorrCptsLt);
        }
        ///// <summary>
        ///// 输出系数矩阵A
        ///// </summary>
        ///// <param name="maxData">系数矩阵A(注意:该矩阵从第0行到第i行为对角矩阵,i行之后为全矩阵</param>
        ///// <param name="strName">文件名称</param>
        ///// <param name="strSavePath">保存路径</param>
        ///// <remarks>二维矩阵</remarks>
        //public static void ExportDataToExcelA(VBMatrix maxData, string strName, string strSavePath)
        //{
        //    //为应付Excel的bug,加入以下两行代码
        //    //System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
        //    //System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

        //    Excel.Application pExcelAPP = new Excel.Application();
        //    pExcelAPP.Visible = false;
        //    Workbook pWorkBook = pExcelAPP.Workbooks.Add(true);
        //    Worksheet pWorksheet = pWorkBook.Worksheets[1] as Worksheet;
        //    string strfilename = System.IO.Path.GetFileNameWithoutExtension(strSavePath);
        //    strfilename = strfilename + strName;

        //    int intRowCount = maxData.Row;
        //    int intColCount = maxData.Col;

        //    for (int i = 0; i < intColCount; i++)
        //    {
        //        pWorksheet.Cells[i + 1, i + 1] = maxData[i, i];
        //    }

        //    for (int i = intColCount; i < intRowCount; i++)
        //    {
        //        for (int j = 0; j < intColCount; j++)
        //        {
        //            pWorksheet.Cells[i + 1, j + 1] = maxData[i, j];
        //        }
        //    }

        //    pWorksheet.Columns.AutoFit();
        //    pExcelAPP.DisplayAlerts = false;
        //    pWorkBook.SaveAs(strSavePath + "\\" + strfilename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        //    pExcelAPP.Quit();
        //    //KillExcel();
        //}

        ///// <summary>
        ///// 输出权重矩阵P(注意:P为对角矩阵)
        ///// </summary>
        ///// <param name="maxData">权重矩阵P(注意:P为对角矩阵)</param>
        ///// <param name="strName">文件名称</param>
        ///// <param name="strSavePath">保存路径</param>
        ///// <remarks>二维矩阵</remarks>
        //public static void ExportDataToExcelP(VBMatrix maxData, string strName, string strSavePath)
        //{
        //    //为应付Excel的bug,加入以下两行代码
        //    //System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
        //    //System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

        //    Excel.Application pExcelAPP = new Excel.Application();
        //    pExcelAPP.Visible = false;
        //    Workbook pWorkBook = pExcelAPP.Workbooks.Add(true);
        //    Worksheet pWorksheet = pWorkBook.Worksheets[1] as Worksheet;
        //    string strfilename = System.IO.Path.GetFileNameWithoutExtension(strSavePath);
        //    strfilename = strfilename + strName;

        //    int intRowCount = maxData.Row;
        //    int intColCount = maxData.Col;

        //    for (int i = 0; i < intRowCount; i++)
        //    {
        //        pWorksheet.Cells[i + 1, i + 1] = maxData[i, i];

        //    }

        //    pWorksheet.Columns.AutoFit();
        //    pExcelAPP.DisplayAlerts = false;
        //    pWorkBook.SaveAs(strSavePath + "\\" + strfilename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        //    pExcelAPP.Quit();
        //    //KillExcel();
        //}

        ///// <summary>
        ///// insert a data into an existed excel file at specified cell
        ///// </summary>
        ///// <param name="strPath">the path of the file</param>
        //public static void InsertData(string strPath, int intRow, int intCol, double dblData)
        //{
        //    Excel.Application pExcelAPP = new Excel.Application();
        //    pExcelAPP.Visible = false;
        //    Workbook pWorkBook = pExcelAPP.Workbooks.Open(strPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        //    Worksheet pWorksheet = pWorkBook.Worksheets[1] as Worksheet;

        //    pWorksheet.Cells[intRow, intCol] = dblData;

        //    pExcelAPP.DisplayAlerts = false;
        //    pWorkBook.Save();
        //    pExcelAPP.Quit();
        //    //KillExcel();
        //}

        /// <summary>
        /// 从Excel中读入数据
        /// </summary>
        /// <param name="strPath">文件路径</param>
        /// <returns>pParameterResult:较大比例尺线状要素上、较小比例尺线状要素、对应点列</returns>
        public static CParameterResult InputDataResultPtLt(string strPath, bool blnReverse = false)
        {
            Excel.Application pExcelAPP = new Excel.Application();
            pExcelAPP.Visible = false;
            Workbook  pWorkBook  = pExcelAPP.Workbooks.Open(strPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            Worksheet pWorksheet = pWorkBook.Worksheets[1] as Worksheet;

            List <CCorrCpts> pCorrCptsLt = new List <CCorrCpts>();
            List <CPoint>    frcptlt     = new List <CPoint>();
            List <CPoint>    tocptlt     = new List <CPoint>();
            int intRow = pWorksheet.UsedRange.Rows.Count;

            System.Array values = (System.Array)pWorksheet.UsedRange.Formula;
            for (int i = 0; i < intRow - 1; i++)
            {
                CPoint frcpt = new CPoint(Convert.ToInt32(values.GetValue(i + 2, 1)), Convert.ToDouble(values.GetValue(i + 2, 2)), Convert.ToDouble(values.GetValue(i + 2, 3)));
                CPoint tocpt = new CPoint(Convert.ToInt32(values.GetValue(i + 2, 4)), Convert.ToDouble(values.GetValue(i + 2, 5)), Convert.ToDouble(values.GetValue(i + 2, 6)));

                if (blnReverse == true)
                {
                    CHelpFunc.Swap(frcpt, tocpt);
                }

                if ((frcpt.ID != -1) && (tocpt.ID != -1))
                {
                    frcpt.isCtrl = true;
                    tocpt.isCtrl = true;
                }
                frcpt.CorrespondingPtLt = new List <CPoint>();
                frcpt.CorrespondingPtLt.Add(tocpt);
                frcptlt.Add(frcpt);
                tocptlt.Add(tocpt);
                CCorrCpts pCorrCpts = new CCorrCpts(frcpt, tocpt);
                pCorrCptsLt.Add(pCorrCpts);
            }
            pExcelAPP.Quit();

            //删除重复点,以生成frcpl
            for (int i = frcptlt.Count - 2; i >= 0; i--)
            {
                if (frcptlt[i].Equals2D(frcptlt[i + 1]))
                {
                    frcptlt.RemoveAt(i + 1);
                }
            }

            //删除重复点,以生成tocpl
            for (int i = tocptlt.Count - 2; i >= 0; i--)
            {
                if (tocptlt[i].Equals2D(tocptlt[i + 1]))
                {
                    tocptlt.RemoveAt(i + 1);
                }
            }

            //生成结果
            CPolyline        frcpl            = new CPolyline(0, frcptlt);
            CPolyline        tocpl            = new CPolyline(1, tocptlt);
            CParameterResult pParameterResult = new CParameterResult();

            pParameterResult.FromCpl = frcpl;
            pParameterResult.ToCpl   = tocpl;
            double dblfr = frcpl.pPolyline.Length;
            double dblto = tocpl.pPolyline.Length;

            pParameterResult.CCorrCptsLt = pCorrCptsLt;
            //pParameterResult.CResultPtLt = ResultPtLt;

            return(pParameterResult);
        }
        private void SplitByCoincidentPoints(List <CPoint> frcptlt, List <CPoint> tocptlt,
                                             out List <List <CPoint> > frcptltlt, out List <List <CPoint> > tocptltlt)
        {
            //look for points having the same coordinates
            var tocptltWithoutEnds = new List <CPoint>();

            if (tocptlt.Count > 2)
            {
                tocptltWithoutEnds = tocptlt.GetRange(1, tocptlt.Count - 2);
            }
            var tocptsd = tocptltWithoutEnds.ToSD(cpt => cpt, CCmpCptYX_VerySmall.sComparer);

            LinkedList <CCorrCpts> CtrlCptsLk = new LinkedList <CCorrCpts>();

            CtrlCptsLk.AddLast(new CCorrCpts(frcptlt[0], tocptlt[0]));     //the first pair
            for (int i = 1; i < frcptlt.Count - 1; i++)
            {
                var    frcpt = frcptlt[i];
                CPoint outtocpt;
                bool   blnGetValue = tocptsd.TryGetValue(frcpt, out outtocpt);
                if (blnGetValue == true)
                {
                    CCorrCpts CtrlCpts = new CCorrCpts(frcpt, outtocpt);
                    CtrlCptsLk.AddLast(CtrlCpts);
                    tocptsd.Remove(frcpt);
                }
            }
            CtrlCptsLk.AddLast(new CCorrCpts(frcptlt.Last(), tocptlt.Last()));   //the last pair


            //check whether the CtrlCptsLk is valid
            List <LinkedListNode <CCorrCpts> > InvalidCorrCptsNodeLt = new List <LinkedListNode <CCorrCpts> >();
            var prenode = CtrlCptsLk.First;

            while (prenode.Next != null)
            {
                var prefrcpt = prenode.Value.FrCpt;
                var pretocpt = prenode.Value.ToCpt;

                var currentnode  = prenode.Next;
                var currentfrcpt = currentnode.Value.FrCpt;
                var currenttocpt = currentnode.Value.ToCpt;

                if (currentfrcpt.ID < prefrcpt.ID || currenttocpt.ID < pretocpt.ID)
                {
                    InvalidCorrCptsNodeLt.Add(currentnode);
                }

                prenode = currentnode;
            }

            //delelte all the conflict nodes from CtrlCptsLk
            foreach (var CorrCptsNode in InvalidCorrCptsNodeLt)
            {
                var currentfrcpt = CorrCptsNode.Value.FrCpt;
                var currenttocpt = CorrCptsNode.Value.ToCpt;

                while (CorrCptsNode.Previous != null)
                {
                    var prenode2 = CorrCptsNode.Previous;
                    var prefrcpt = prenode2.Value.FrCpt;
                    var pretocpt = prenode2.Value.ToCpt;

                    if (currentfrcpt.ID < prefrcpt.ID || currenttocpt.ID < pretocpt.ID)
                    {
                        CtrlCptsLk.Remove(prenode2);
                    }
                    else
                    {
                        break;
                    }
                }
                CtrlCptsLk.Remove(CorrCptsNode);
                Console.WriteLine("Invalid splits of polylines happened!");
            }

            frcptltlt = new List <List <CPoint> >(CtrlCptsLk.Count - 1);
            tocptltlt = new List <List <CPoint> >(CtrlCptsLk.Count - 1);

            var prenode3 = CtrlCptsLk.First;

            while (prenode3.Next != null)
            {
                var prefrcpt = prenode3.Value.FrCpt;
                var pretocpt = prenode3.Value.ToCpt;

                var currentnode  = prenode3.Next;
                var currentfrcpt = currentnode.Value.FrCpt;
                var currenttocpt = currentnode.Value.ToCpt;

                var subfrcptlt = frcptlt.GetRange(prefrcpt.ID, currentfrcpt.ID - prefrcpt.ID + 1);
                var subtocptlt = tocptlt.GetRange(pretocpt.ID, currenttocpt.ID - pretocpt.ID + 1);

                frcptltlt.Add(subfrcptlt);
                tocptltlt.Add(subtocptlt);

                prenode3 = currentnode;
            }
        }
Exemple #10
0
 public CPolyline(int intID, CCorrCpts CorrCpt, bool blnSetPolyline = false)
     : this(intID, CorrCpt.FrCpt, CorrCpt.ToCpt, blnSetPolyline)
 {
 }
Exemple #11
0
        private static double CalDeflectionSub(CCorrCpts LastCorrCpts, CCorrCpts CurrentCorrCpts, double dblfrlength, double dbltolength)
        {
            CPoint frfrcpt = LastCorrCpts.FrCpt;         //vertex1
            CPoint frtocpt = CurrentCorrCpts.FrCpt;      //vertex2
            CPoint tofrcpt = LastCorrCpts.ToCpt;         //vertex3
            CPoint totocpt = CurrentCorrCpts.ToCpt;      //vertex4

            //double dblfrfrX = LastCorrCpts.FrCpt.X + pStandardVectorCpt.X;        //x1
            //double dblfrfrY = LastCorrCpts.FrCpt.Y + pStandardVectorCpt.Y;        //y1
            //double dblfrtoX = CurrentCorrCpts.FrCpt.X + pStandardVectorCpt.X;     //x2
            //double dblfrtoY = CurrentCorrCpts.FrCpt.Y + pStandardVectorCpt.Y;     //y2

            double dblfftfx = frfrcpt.X - tofrcpt.X;            //x1-x3
            double dblfftfy = frfrcpt.Y - tofrcpt.Y;            //y1-y3

            double dblXPart = dblfftfx - frtocpt.X + totocpt.X; //x1-x2-x3+x4
            double dblYPart = dblfftfy - frtocpt.Y + totocpt.Y; //y1-y2-y3+y4


            //Integral of sqrt(ax^2+bx+c); X=ax^2+bx+c, delta=4ac-b^2; k=4a/delta
            double a = dblXPart * dblXPart + dblYPart * dblYPart;
            double b = -2 * (dblfftfx * dblXPart + dblfftfy * dblYPart);
            double c = dblfftfx * dblfftfx + dblfftfy * dblfftfy;

            double dblTwoA  = a + a;
            double dblFourA = dblTwoA + dblTwoA;

            CQuadraticEquation pQuadraticEquation = new CQuadraticEquation(a, b, c);    //since this is a function of distance, dblDelta <= 0
            double             dblIntegral        = 0;

            //we have a>=0
            if (CCmpMethods.CmpSquare(a, 0) == 0) //then b==0
            {
                dblIntegral = Math.Sqrt(c);
            }
            else
            {
                //f(x)=ax^2+bx+c, f(0)=c, f(1)=a+b+c
                double X_0 = c;
                double X_1 = CMath.JudgeNegtiveReturn0(a + b + c, "X1");

                double SqrtX_0 = Math.Sqrt(X_0);
                double SqrtX_1 = Math.Sqrt(X_1);


                double dblTwoAUplusB_0 = b;               //U = 0
                double dblTwoAUplusB_1 = dblTwoA + b;     //U = 1
                //double dblDelta = CMath

                double dblFirstPart  = (dblTwoAUplusB_1 * SqrtX_1 - dblTwoAUplusB_0 * SqrtX_0) / dblFourA;  //(2 * a * 1 + b) * SqrtX_1 / (4 * a) - (2 * a * 0 + b) * SqrtX_0 / (4 * a)
                double dblSecondPart = 0;

                //two line segments are parallel to each other is a special case of Delta=0, notice that the distance between the two parallel segments is changing
                if (CCmpMethods.CmpPower4(pQuadraticEquation.dblDelta, 0) != 0)
                {
                    double dblSqrtA    = Math.Sqrt(a);
                    double dblTwoSqrtA = 2 * dblSqrtA;
                    //double dblk = dblFourA / (-pQuadraticEquation.dblDelta);
                    double dblfisrtpart  = dblTwoSqrtA * SqrtX_1 + dblTwoAUplusB_1; //the part in ln when u=1
                    double dblsecondpart = dblTwoSqrtA * SqrtX_0 + dblTwoAUplusB_0; //the part in ln when u=0
                    double dblAbsPart    = dblfisrtpart / dblsecondpart;            //the ln part
                    double dblLnPart     = Math.Log(dblAbsPart);                    //Math.Log(2 * dblSqrtA * SqrtX_1 + 2 * a * 1 + b) - * Math.Log(2 * dblSqrtA * SqrtX_0 + 2 * a * 0 + b);
                    dblSecondPart = -pQuadraticEquation.dblDelta * dblLnPart / dblFourA / dblTwoSqrtA;

                    //dblSecondPart = dblSubSecondPart / (2 * dblk);
                    if (double.IsNaN(dblSecondPart))  //sometimes, the ComparePower4 doesn't work well
                    {
                        dblSecondPart = 0;
                    }
                }
                dblIntegral = dblFirstPart + dblSecondPart;
            }

            double dblResult = dblIntegral * (dblfrlength + dbltolength);

            return(dblResult);
        }
Exemple #12
0
 private static double CalTranslation(CCorrCpts LastCorrCpts, CCorrCpts CurrentCorrCpts, double dblFrTotalLength = 0, double dblToTotalLength = 0)
 {
     LastCorrCpts.SetMoveVector();
     CurrentCorrCpts.SetMoveVector();
     return(LastCorrCpts.pMoveVector.DistanceTo(CurrentCorrCpts.pMoveVector));;
 }