/// <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)); }
/// <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; } }
public CPolyline(int intID, CCorrCpts CorrCpt, bool blnSetPolyline = false) : this(intID, CorrCpt.FrCpt, CorrCpt.ToCpt, blnSetPolyline) { }
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); }
private static double CalTranslation(CCorrCpts LastCorrCpts, CCorrCpts CurrentCorrCpts, double dblFrTotalLength = 0, double dblToTotalLength = 0) { LastCorrCpts.SetMoveVector(); CurrentCorrCpts.SetMoveVector(); return(LastCorrCpts.pMoveVector.DistanceTo(CurrentCorrCpts.pMoveVector));; }