public C5.LinkedList <CCorrespondSegment> DWByOptCorSimplified(CPolyline frcpl, CPolyline tocpl, int intMaxBackK, CPoint StandardVetorCpt) { double dblSmallDis = CGeometricMethods.CalSmallDis(frcpl); List <CPolyline> CFrEdgeLt = CGeometricMethods.CreateCplLt(frcpl.cptlt); List <CPolyline> CToEdgeLt = CGeometricMethods.CreateCplLt(tocpl.cptlt); CTable[,] T = CreatT(frcpl, tocpl, CFrEdgeLt, CToEdgeLt, intMaxBackK, StandardVetorCpt); //创建T矩阵 C5.LinkedList <CCorrespondSegment> pCorrespondSegmentLk = FindCorrespondSegmentLk(T, frcpl, tocpl, CFrEdgeLt, CToEdgeLt); return(pCorrespondSegmentLk); }
private void btnstatisticEX_Click(object sender, EventArgs e) { double dblProportion = -1; List <double> dbllt = new List <double>(); List <CPoint> CResultPtLt = _DataRecords.ParameterResult.CResultPtLt; for (int i = 0; i <= 300; i++) { CPolyline cpl = CGeometricMethods.GetTargetcpl(CResultPtLt, dblProportion); dbllt.Add(cpl.pPolyline.Length); dblProportion = dblProportion + 0.01; } CHelperFunctionExcel.ExportDataltToExcel(dbllt, "Length", _DataRecords.ParameterInitialize.strSavePath); }
public int Compare(CPolygon cpg1, CPolygon cpg2) { int iResult = CGeometricMethods.Compare(cpg1.ID, cpg2.ID); return(iResult); }
public int Compare(CEdge cedge1, CEdge cedge2) { int iResult = CGeometricMethods.Compare(cedge1, cedge2); return(iResult); }
public int Compare(CRegion crg1, CRegion crg2) { int iResult = CGeometricMethods.Compare(crg1.IDLk, crg2.IDLk); return(iResult); }
public int Compare(CPoint cpt1, CPoint cpt2) { int iResult = CGeometricMethods.Compare(cpt1, cpt2); return(iResult); }
public CParameterResult OptCorMMMorphing() { List <CPolyline> pBSCPlLt = _BSCPlLt; List <CPolyline> pSSCPlLt = _SSCPlLt; int intMaxBackK = _intMaxBackK; int intMulti = _intMulti; int intIncrease = _intIncrease; double dblSmallDis = _dblSmallDis; long lngStartTime1 = System.Environment.TickCount; //lngTime1 CGeometricMethods.SetEdgeLength(ref pBSCPlLt); CGeometricMethods.SetEdgeLength(ref pSSCPlLt); long lngTime1 = System.Environment.TickCount - lngStartTime1; //lngTime1 double dblX = pSSCPlLt[0].FrCpt.X - pBSCPlLt[0].FrCpt.X; double dblY = pSSCPlLt[0].FrCpt.Y - pBSCPlLt[0].FrCpt.Y; CPoint StandardVetorCpt = new CPoint(0, dblX, dblY); //StandardVetorCpt = new CPoint(0, 0, 0); _StandardVetorCpt = StandardVetorCpt; double dblStandardLength = CGeometricMethods.CalDis(0, 0, dblX, dblY); List <double> dblDistanceLt = new List <double>(intMulti); List <double> dblTimeLt = new List <double>(intMulti); List <LinkedList <CCorrespondCPoint> > pCorrCptLkLt = new List <LinkedList <CCorrespondCPoint> >(pBSCPlLt.Count); List <LinkedList <CCorrespondCPoint> > pCtrlCptLkLt = new List <LinkedList <CCorrespondCPoint> >(pBSCPlLt.Count); for (int i = 0; i < intMulti; i++) { long lngStartTime2 = System.Environment.TickCount; //lngTime2 double dblDistance = 0; pCorrCptLkLt = new List <LinkedList <CCorrespondCPoint> >(pBSCPlLt.Count); //initialize pCtrlCptLkLt = new List <LinkedList <CCorrespondCPoint> >(pBSCPlLt.Count); //initialize for (int j = 0; j < pBSCPlLt.Count; j++) { CTable[,] Table = CreatTable(pBSCPlLt[j], pSSCPlLt[j], intMaxBackK, StandardVetorCpt, dblSmallDis); //创建T矩阵 dblDistance += Table[pBSCPlLt[j].cptlt.Count - 1, pSSCPlLt[j].cptlt.Count - 1].dblEvaluation; LinkedList <CCorrespondCPoint> CtrlCptLk; pCorrCptLkLt.Add(FindCorrespondSegmentLk(Table, out CtrlCptLk)); pCtrlCptLkLt.Add(CtrlCptLk); } long lngTime2 = System.Environment.TickCount - lngStartTime2; //lngTime2 dblTimeLt.Add(lngTime1 + lngTime2); dblDistanceLt.Add(dblDistance); //保存对应线 CHelperFunctionExcel.ExportDataltToExcel(dblTimeLt, intMaxBackK + "Timelt0", _ParameterInitialize.strSavePath); CHelperFunctionExcel.ExportDataltToExcel(dblDistanceLt, intMaxBackK + "Distancelt0", _ParameterInitialize.strSavePath); if (i == (intMulti - 1)) { CHelperFunction.SaveCtrlLine(pCtrlCptLkLt, intMaxBackK + "OptCorMMControlLine", dblStandardLength, _ParameterInitialize.pWorkspace, _ParameterInitialize.m_mapControl); CHelperFunction.SaveCorrLine(pCorrCptLkLt, intMaxBackK + "OptCorMMCorrLine", _ParameterInitialize.pWorkspace, _ParameterInitialize.m_mapControl); } intMaxBackK = intMaxBackK + intIncrease; _CorrCptLkLt = pCorrCptLkLt; } return(null); }
/// <summary>创建T矩阵</summary> /// <param name="frcpl">大比例尺线状要素</param> /// <param name="tocpl">小比例尺线状要素</param> /// <param name="CFrEdgeLt">大比例尺线段</param> /// <param name="CToEdgeLt">小比例尺线段</param> /// <param name="frlastcpllt">大比例尺终点线段(只有一个点)</param> /// <param name="tolastcpllt">小比例尺终点线段(只有一个点)</param> /// <param name="intMaxBackK">回溯系数</param> /// <remarks>已释放内存</remarks> /// <returns>T矩阵</returns> public override CTable[,] CreatTable(CPolyline frcpl, CPolyline tocpl, int intMaxBackK, CPoint StandardVetorCpt, double dblSmallDis) { List <CPolyline> CFrEdgeLt = CGeometricMethods.CreateCplLt(frcpl.cptlt); List <CPolyline> CToEdgeLt = CGeometricMethods.CreateCplLt(tocpl.cptlt); int intFrPtNum = frcpl.cptlt.Count; int intToPtNum = tocpl.cptlt.Count; List <CPolyline> frlastcpllt = new List <CPolyline>(intFrPtNum - 1); List <CPolyline> tolastcpllt = new List <CPolyline>(intToPtNum - 1); //注意:T矩阵中的序号跟原文算法中的序号是统一的,但线数组中的序号则应减1 CTable[,] T = new CTable[intFrPtNum, intToPtNum]; //T[0,0] T[0, 0] = new CTable(); T[0, 0].dblEvaluation = 0; LinkedList <CCorrespondCPoint> CorrCptLk0 = new LinkedList <CCorrespondCPoint>(); CorrCptLk0.AddLast(new CCorrespondCPoint(CFrEdgeLt[0].FrCpt, CToEdgeLt[0].FrCpt)); T[0, 0].CorrCptLk = CorrCptLk0; CPolyline frfirstcpl = new CPolyline(0, CFrEdgeLt[0].FrCpt); //以线状要素的第一个点作为线段 for (int j = 1; j < intToPtNum; j++) { T[0, j] = new CTable(); T[0, j].intBackK1 = 0; T[0, j].intBackK2 = 1; LinkedList <CCorrespondCPoint> CorrCptLkj; T[0, j].dblEvaluation = T[0, j - 1].dblEvaluation + CalDistance(frfirstcpl, CToEdgeLt[j - 1], StandardVetorCpt, dblSmallDis, frcpl, tocpl, out CorrCptLkj); T[0, j].CorrCptLk = CorrCptLkj; } CPolyline tofirstcpl = new CPolyline(0, CToEdgeLt[0].FrCpt); //以线状要素的第一个点作为线段 for (int i = 1; i < intFrPtNum; i++) { T[i, 0] = new CTable(); T[i, 0].intBackK1 = 1; T[i, 0].intBackK2 = 0; LinkedList <CCorrespondCPoint> CorrCptLki; T[i, 0].dblEvaluation = T[i - 1, 0].dblEvaluation + CalDistance(CFrEdgeLt[i - 1], tofirstcpl, StandardVetorCpt, dblSmallDis, frcpl, tocpl, out CorrCptLki); T[i, 0].CorrCptLk = CorrCptLki; } //循环填满二维数组T中的各个值 for (int i = 0; i < CFrEdgeLt.Count; i++)//大比例尺线段终点数据准备 { List <CPoint> frlastptlt = new List <CPoint>(1); frlastptlt.Add(CFrEdgeLt[i].ToCpt); frlastcpllt.Add(new CPolyline(0, frlastptlt)); } for (int i = 0; i < CToEdgeLt.Count; i++)//小比例尺线段终点数据准备 { List <CPoint> frlastptlt = new List <CPoint>(1); frlastptlt.Add(CToEdgeLt[i].ToCpt); tolastcpllt.Add(new CPolyline(0, frlastptlt)); } //注意:T中的序号1指定第一个元素,而各LT中(如CFrEdgeLt,tolastcpllt)的序号1则指定第二个元素 for (int i = 1; i < intFrPtNum; i++) //计算各空格值 { int intBackKforI = Math.Min(i, intMaxBackK); //程序刚开始执行时,之前已遍历过线段数较少,可能小于intMaxBackK for (int j = 1; j < intToPtNum; j++) { int intBackKforJ = Math.Min(j, intMaxBackK); //程序刚开始执行时,之前已遍历过线段数较少,可能小于intMaxBackK List <CTable> CTableLt = new List <CTable>(intBackKforI * intBackKforJ); for (int k1 = 1; k1 <= intBackKforI; k1++) { for (int k2 = 1; k2 <= intBackKforJ; k2++) { CTable tableij = new CTable(); tableij.intBackK1 = k1; tableij.intBackK2 = k2; LinkedList <CCorrespondCPoint> CorrCptLkij; CPolyline frcpli = frcpl.GetSubPolyline(CFrEdgeLt[i - k1].FrCpt, CFrEdgeLt[i - 1].ToCpt); CPolyline tocplj = tocpl.GetSubPolyline(CToEdgeLt[j - k2].FrCpt, CToEdgeLt[j - 1].ToCpt); tableij.dblEvaluation = T[i - k1, j - k2].dblEvaluation + CalDistance(frcpli, tocplj, StandardVetorCpt, dblSmallDis, frcpl, tocpl, out CorrCptLkij); tableij.CorrCptLk = CorrCptLkij; CTableLt.Add(tableij); } } //find the minimum one T[i, j] = FindMinTable(CTableLt); } } return(T); }